package org.drinkless.tdlib;

import androidx.annotation.IntDef;
import androidx.annotation.Nullable;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * This class contains as static nested classes all other TDLib interface
 * type-classes and function-classes.
 * <p>
 * It has no inner classes, functions or public members.
 */
public class TdApi {
    static {
        try {
            System.loadLibrary("tdjni");
        } catch (UnsatisfiedLinkError e) {
            e.printStackTrace();
        }
    }

    private TdApi() {
    }

    /**
     * This class is a base class for all TDLib interface classes.
     */
    public abstract static class Object {
        /**
         * Default Object constructor.
         */
        public Object() {
        }

        /**
         * Returns a string representation of the object.
         *
         * @return a string representation of the object.
         */
        public native String toString();

        /**
         * Returns an identifier uniquely determining type of the object.
         *
         * @return a unique identifier of the object type.
         */
        public abstract int getConstructor();
    }

    /**
     * This class is a base class for all TDLib interface function-classes.
     *
     * @param <R> The object type that is returned by the function
     */
    public abstract static class Function<R extends Object> extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AcceptCall.CONSTRUCTOR,
            AcceptTermsOfService.CONSTRUCTOR,
            ActivateStoryStealthMode.CONSTRUCTOR,
            AddChatFolderByInviteLink.CONSTRUCTOR,
            AddChatMember.CONSTRUCTOR,
            AddChatMembers.CONSTRUCTOR,
            AddChatToList.CONSTRUCTOR,
            AddContact.CONSTRUCTOR,
            AddCustomServerLanguagePack.CONSTRUCTOR,
            AddFavoriteSticker.CONSTRUCTOR,
            AddFileToDownloads.CONSTRUCTOR,
            AddLocalMessage.CONSTRUCTOR,
            AddLogMessage.CONSTRUCTOR,
            AddMessageReaction.CONSTRUCTOR,
            AddNetworkStatistics.CONSTRUCTOR,
            AddProxy.CONSTRUCTOR,
            AddQuickReplyShortcutInlineQueryResultMessage.CONSTRUCTOR,
            AddQuickReplyShortcutMessage.CONSTRUCTOR,
            AddQuickReplyShortcutMessageAlbum.CONSTRUCTOR,
            AddRecentSticker.CONSTRUCTOR,
            AddRecentlyFoundChat.CONSTRUCTOR,
            AddSavedAnimation.CONSTRUCTOR,
            AddSavedNotificationSound.CONSTRUCTOR,
            AddStickerToSet.CONSTRUCTOR,
            AllowBotToSendMessages.CONSTRUCTOR,
            AnswerCallbackQuery.CONSTRUCTOR,
            AnswerCustomQuery.CONSTRUCTOR,
            AnswerInlineQuery.CONSTRUCTOR,
            AnswerPreCheckoutQuery.CONSTRUCTOR,
            AnswerShippingQuery.CONSTRUCTOR,
            AnswerWebAppQuery.CONSTRUCTOR,
            ApplyPremiumGiftCode.CONSTRUCTOR,
            AssignAppStoreTransaction.CONSTRUCTOR,
            AssignGooglePlayTransaction.CONSTRUCTOR,
            BanChatMember.CONSTRUCTOR,
            BlockMessageSenderFromReplies.CONSTRUCTOR,
            BoostChat.CONSTRUCTOR,
            CanBotSendMessages.CONSTRUCTOR,
            CanPurchaseFromStore.CONSTRUCTOR,
            CanSendMessageToUser.CONSTRUCTOR,
            CanSendStory.CONSTRUCTOR,
            CanTransferOwnership.CONSTRUCTOR,
            CancelDownloadFile.CONSTRUCTOR,
            CancelPasswordReset.CONSTRUCTOR,
            CancelPreliminaryUploadFile.CONSTRUCTOR,
            CancelRecoveryEmailAddressVerification.CONSTRUCTOR,
            ChangeImportedContacts.CONSTRUCTOR,
            ChangeStickerSet.CONSTRUCTOR,
            CheckAuthenticationBotToken.CONSTRUCTOR,
            CheckAuthenticationCode.CONSTRUCTOR,
            CheckAuthenticationEmailCode.CONSTRUCTOR,
            CheckAuthenticationPassword.CONSTRUCTOR,
            CheckAuthenticationPasswordRecoveryCode.CONSTRUCTOR,
            CheckChatFolderInviteLink.CONSTRUCTOR,
            CheckChatInviteLink.CONSTRUCTOR,
            CheckChatUsername.CONSTRUCTOR,
            CheckCreatedPublicChatsLimit.CONSTRUCTOR,
            CheckEmailAddressVerificationCode.CONSTRUCTOR,
            CheckLoginEmailAddressCode.CONSTRUCTOR,
            CheckPasswordRecoveryCode.CONSTRUCTOR,
            CheckPhoneNumberCode.CONSTRUCTOR,
            CheckPremiumGiftCode.CONSTRUCTOR,
            CheckQuickReplyShortcutName.CONSTRUCTOR,
            CheckRecoveryEmailAddressCode.CONSTRUCTOR,
            CheckStickerSetName.CONSTRUCTOR,
            CleanFileName.CONSTRUCTOR,
            ClearAllDraftMessages.CONSTRUCTOR,
            ClearAutosaveSettingsExceptions.CONSTRUCTOR,
            ClearImportedContacts.CONSTRUCTOR,
            ClearRecentEmojiStatuses.CONSTRUCTOR,
            ClearRecentReactions.CONSTRUCTOR,
            ClearRecentStickers.CONSTRUCTOR,
            ClearRecentlyFoundChats.CONSTRUCTOR,
            ClearSearchedForTags.CONSTRUCTOR,
            ClickAnimatedEmojiMessage.CONSTRUCTOR,
            ClickChatSponsoredMessage.CONSTRUCTOR,
            ClickPremiumSubscriptionButton.CONSTRUCTOR,
            Close.CONSTRUCTOR,
            CloseChat.CONSTRUCTOR,
            CloseSecretChat.CONSTRUCTOR,
            CloseStory.CONSTRUCTOR,
            CloseWebApp.CONSTRUCTOR,
            ConfirmQrCodeAuthentication.CONSTRUCTOR,
            ConfirmSession.CONSTRUCTOR,
            CreateBasicGroupChat.CONSTRUCTOR,
            CreateBusinessChatLink.CONSTRUCTOR,
            CreateCall.CONSTRUCTOR,
            CreateChatFolder.CONSTRUCTOR,
            CreateChatFolderInviteLink.CONSTRUCTOR,
            CreateChatInviteLink.CONSTRUCTOR,
            CreateForumTopic.CONSTRUCTOR,
            CreateInvoiceLink.CONSTRUCTOR,
            CreateNewBasicGroupChat.CONSTRUCTOR,
            CreateNewSecretChat.CONSTRUCTOR,
            CreateNewStickerSet.CONSTRUCTOR,
            CreateNewSupergroupChat.CONSTRUCTOR,
            CreatePrivateChat.CONSTRUCTOR,
            CreateSecretChat.CONSTRUCTOR,
            CreateSupergroupChat.CONSTRUCTOR,
            CreateTemporaryPassword.CONSTRUCTOR,
            CreateVideoChat.CONSTRUCTOR,
            DeleteAccount.CONSTRUCTOR,
            DeleteAllCallMessages.CONSTRUCTOR,
            DeleteAllRevokedChatInviteLinks.CONSTRUCTOR,
            DeleteBusinessChatLink.CONSTRUCTOR,
            DeleteBusinessConnectedBot.CONSTRUCTOR,
            DeleteChat.CONSTRUCTOR,
            DeleteChatBackground.CONSTRUCTOR,
            DeleteChatFolder.CONSTRUCTOR,
            DeleteChatFolderInviteLink.CONSTRUCTOR,
            DeleteChatHistory.CONSTRUCTOR,
            DeleteChatMessagesByDate.CONSTRUCTOR,
            DeleteChatMessagesBySender.CONSTRUCTOR,
            DeleteChatReplyMarkup.CONSTRUCTOR,
            DeleteCommands.CONSTRUCTOR,
            DeleteDefaultBackground.CONSTRUCTOR,
            DeleteFile.CONSTRUCTOR,
            DeleteForumTopic.CONSTRUCTOR,
            DeleteLanguagePack.CONSTRUCTOR,
            DeleteMessages.CONSTRUCTOR,
            DeletePassportElement.CONSTRUCTOR,
            DeleteProfilePhoto.CONSTRUCTOR,
            DeleteQuickReplyShortcut.CONSTRUCTOR,
            DeleteQuickReplyShortcutMessages.CONSTRUCTOR,
            DeleteRevokedChatInviteLink.CONSTRUCTOR,
            DeleteSavedCredentials.CONSTRUCTOR,
            DeleteSavedMessagesTopicHistory.CONSTRUCTOR,
            DeleteSavedMessagesTopicMessagesByDate.CONSTRUCTOR,
            DeleteSavedOrderInfo.CONSTRUCTOR,
            DeleteStickerSet.CONSTRUCTOR,
            DeleteStory.CONSTRUCTOR,
            Destroy.CONSTRUCTOR,
            DisableAllSupergroupUsernames.CONSTRUCTOR,
            DisableProxy.CONSTRUCTOR,
            DiscardCall.CONSTRUCTOR,
            DisconnectAllWebsites.CONSTRUCTOR,
            DisconnectWebsite.CONSTRUCTOR,
            DownloadFile.CONSTRUCTOR,
            EditBusinessChatLink.CONSTRUCTOR,
            EditBusinessMessageCaption.CONSTRUCTOR,
            EditBusinessMessageLiveLocation.CONSTRUCTOR,
            EditBusinessMessageMedia.CONSTRUCTOR,
            EditBusinessMessageReplyMarkup.CONSTRUCTOR,
            EditBusinessMessageText.CONSTRUCTOR,
            EditChatFolder.CONSTRUCTOR,
            EditChatFolderInviteLink.CONSTRUCTOR,
            EditChatInviteLink.CONSTRUCTOR,
            EditCustomLanguagePackInfo.CONSTRUCTOR,
            EditForumTopic.CONSTRUCTOR,
            EditInlineMessageCaption.CONSTRUCTOR,
            EditInlineMessageLiveLocation.CONSTRUCTOR,
            EditInlineMessageMedia.CONSTRUCTOR,
            EditInlineMessageReplyMarkup.CONSTRUCTOR,
            EditInlineMessageText.CONSTRUCTOR,
            EditMessageCaption.CONSTRUCTOR,
            EditMessageLiveLocation.CONSTRUCTOR,
            EditMessageMedia.CONSTRUCTOR,
            EditMessageReplyMarkup.CONSTRUCTOR,
            EditMessageSchedulingState.CONSTRUCTOR,
            EditMessageText.CONSTRUCTOR,
            EditProxy.CONSTRUCTOR,
            EditQuickReplyMessage.CONSTRUCTOR,
            EditStory.CONSTRUCTOR,
            EnableProxy.CONSTRUCTOR,
            EndGroupCall.CONSTRUCTOR,
            EndGroupCallRecording.CONSTRUCTOR,
            EndGroupCallScreenSharing.CONSTRUCTOR,
            FinishFileGeneration.CONSTRUCTOR,
            ForwardMessages.CONSTRUCTOR,
            GetAccountTtl.CONSTRUCTOR,
            GetActiveLiveLocationMessages.CONSTRUCTOR,
            GetActiveSessions.CONSTRUCTOR,
            GetAllPassportElements.CONSTRUCTOR,
            GetAllStickerEmojis.CONSTRUCTOR,
            GetAnimatedEmoji.CONSTRUCTOR,
            GetApplicationConfig.CONSTRUCTOR,
            GetApplicationDownloadLink.CONSTRUCTOR,
            GetArchiveChatListSettings.CONSTRUCTOR,
            GetArchivedStickerSets.CONSTRUCTOR,
            GetAttachedStickerSets.CONSTRUCTOR,
            GetAttachmentMenuBot.CONSTRUCTOR,
            GetAuthorizationState.CONSTRUCTOR,
            GetAutoDownloadSettingsPresets.CONSTRUCTOR,
            GetAutosaveSettings.CONSTRUCTOR,
            GetAvailableChatBoostSlots.CONSTRUCTOR,
            GetBackgroundUrl.CONSTRUCTOR,
            GetBankCardInfo.CONSTRUCTOR,
            GetBasicGroup.CONSTRUCTOR,
            GetBasicGroupFullInfo.CONSTRUCTOR,
            GetBlockedMessageSenders.CONSTRUCTOR,
            GetBotInfoDescription.CONSTRUCTOR,
            GetBotInfoShortDescription.CONSTRUCTOR,
            GetBotName.CONSTRUCTOR,
            GetBusinessChatLinkInfo.CONSTRUCTOR,
            GetBusinessChatLinks.CONSTRUCTOR,
            GetBusinessConnectedBot.CONSTRUCTOR,
            GetBusinessConnection.CONSTRUCTOR,
            GetBusinessFeatures.CONSTRUCTOR,
            GetCallbackQueryAnswer.CONSTRUCTOR,
            GetCallbackQueryMessage.CONSTRUCTOR,
            GetChat.CONSTRUCTOR,
            GetChatActiveStories.CONSTRUCTOR,
            GetChatAdministrators.CONSTRUCTOR,
            GetChatArchivedStories.CONSTRUCTOR,
            GetChatAvailableMessageSenders.CONSTRUCTOR,
            GetChatBoostFeatures.CONSTRUCTOR,
            GetChatBoostLevelFeatures.CONSTRUCTOR,
            GetChatBoostLink.CONSTRUCTOR,
            GetChatBoostLinkInfo.CONSTRUCTOR,
            GetChatBoostStatus.CONSTRUCTOR,
            GetChatBoosts.CONSTRUCTOR,
            GetChatEventLog.CONSTRUCTOR,
            GetChatFolder.CONSTRUCTOR,
            GetChatFolderChatCount.CONSTRUCTOR,
            GetChatFolderChatsToLeave.CONSTRUCTOR,
            GetChatFolderDefaultIconName.CONSTRUCTOR,
            GetChatFolderInviteLinks.CONSTRUCTOR,
            GetChatFolderNewChats.CONSTRUCTOR,
            GetChatHistory.CONSTRUCTOR,
            GetChatInviteLink.CONSTRUCTOR,
            GetChatInviteLinkCounts.CONSTRUCTOR,
            GetChatInviteLinkMembers.CONSTRUCTOR,
            GetChatInviteLinks.CONSTRUCTOR,
            GetChatJoinRequests.CONSTRUCTOR,
            GetChatListsToAddChat.CONSTRUCTOR,
            GetChatMember.CONSTRUCTOR,
            GetChatMessageByDate.CONSTRUCTOR,
            GetChatMessageCalendar.CONSTRUCTOR,
            GetChatMessageCount.CONSTRUCTOR,
            GetChatMessagePosition.CONSTRUCTOR,
            GetChatNotificationSettingsExceptions.CONSTRUCTOR,
            GetChatPinnedMessage.CONSTRUCTOR,
            GetChatPostedToChatPageStories.CONSTRUCTOR,
            GetChatRevenueStatistics.CONSTRUCTOR,
            GetChatRevenueTransactions.CONSTRUCTOR,
            GetChatRevenueWithdrawalUrl.CONSTRUCTOR,
            GetChatScheduledMessages.CONSTRUCTOR,
            GetChatSimilarChatCount.CONSTRUCTOR,
            GetChatSimilarChats.CONSTRUCTOR,
            GetChatSparseMessagePositions.CONSTRUCTOR,
            GetChatSponsoredMessages.CONSTRUCTOR,
            GetChatStatistics.CONSTRUCTOR,
            GetChatStoryInteractions.CONSTRUCTOR,
            GetChats.CONSTRUCTOR,
            GetChatsForChatFolderInviteLink.CONSTRUCTOR,
            GetChatsToSendStories.CONSTRUCTOR,
            GetCloseFriends.CONSTRUCTOR,
            GetCollectibleItemInfo.CONSTRUCTOR,
            GetCommands.CONSTRUCTOR,
            GetConnectedWebsites.CONSTRUCTOR,
            GetContacts.CONSTRUCTOR,
            GetCountries.CONSTRUCTOR,
            GetCountryCode.CONSTRUCTOR,
            GetCountryFlagEmoji.CONSTRUCTOR,
            GetCreatedPublicChats.CONSTRUCTOR,
            GetCurrentState.CONSTRUCTOR,
            GetCustomEmojiReactionAnimations.CONSTRUCTOR,
            GetCustomEmojiStickers.CONSTRUCTOR,
            GetDatabaseStatistics.CONSTRUCTOR,
            GetDeepLinkInfo.CONSTRUCTOR,
            GetDefaultBackgroundCustomEmojiStickers.CONSTRUCTOR,
            GetDefaultChatEmojiStatuses.CONSTRUCTOR,
            GetDefaultChatPhotoCustomEmojiStickers.CONSTRUCTOR,
            GetDefaultEmojiStatuses.CONSTRUCTOR,
            GetDefaultMessageAutoDeleteTime.CONSTRUCTOR,
            GetDefaultProfilePhotoCustomEmojiStickers.CONSTRUCTOR,
            GetDisallowedChatEmojiStatuses.CONSTRUCTOR,
            GetEmojiCategories.CONSTRUCTOR,
            GetEmojiReaction.CONSTRUCTOR,
            GetEmojiSuggestionsUrl.CONSTRUCTOR,
            GetExternalLink.CONSTRUCTOR,
            GetExternalLinkInfo.CONSTRUCTOR,
            GetFavoriteStickers.CONSTRUCTOR,
            GetFile.CONSTRUCTOR,
            GetFileDownloadedPrefixSize.CONSTRUCTOR,
            GetFileExtension.CONSTRUCTOR,
            GetFileMimeType.CONSTRUCTOR,
            GetForumTopic.CONSTRUCTOR,
            GetForumTopicDefaultIcons.CONSTRUCTOR,
            GetForumTopicLink.CONSTRUCTOR,
            GetForumTopics.CONSTRUCTOR,
            GetGameHighScores.CONSTRUCTOR,
            GetGreetingStickers.CONSTRUCTOR,
            GetGroupCall.CONSTRUCTOR,
            GetGroupCallInviteLink.CONSTRUCTOR,
            GetGroupCallStreamSegment.CONSTRUCTOR,
            GetGroupCallStreams.CONSTRUCTOR,
            GetGroupsInCommon.CONSTRUCTOR,
            GetImportedContactCount.CONSTRUCTOR,
            GetInactiveSupergroupChats.CONSTRUCTOR,
            GetInlineGameHighScores.CONSTRUCTOR,
            GetInlineQueryResults.CONSTRUCTOR,
            GetInstalledBackgrounds.CONSTRUCTOR,
            GetInstalledStickerSets.CONSTRUCTOR,
            GetInternalLink.CONSTRUCTOR,
            GetInternalLinkType.CONSTRUCTOR,
            GetJsonString.CONSTRUCTOR,
            GetJsonValue.CONSTRUCTOR,
            GetKeywordEmojis.CONSTRUCTOR,
            GetLanguagePackInfo.CONSTRUCTOR,
            GetLanguagePackString.CONSTRUCTOR,
            GetLanguagePackStrings.CONSTRUCTOR,
            GetLinkPreview.CONSTRUCTOR,
            GetLocalizationTargetInfo.CONSTRUCTOR,
            GetLogStream.CONSTRUCTOR,
            GetLogTagVerbosityLevel.CONSTRUCTOR,
            GetLogTags.CONSTRUCTOR,
            GetLogVerbosityLevel.CONSTRUCTOR,
            GetLoginUrl.CONSTRUCTOR,
            GetLoginUrlInfo.CONSTRUCTOR,
            GetMapThumbnailFile.CONSTRUCTOR,
            GetMarkdownText.CONSTRUCTOR,
            GetMe.CONSTRUCTOR,
            GetMenuButton.CONSTRUCTOR,
            GetMessage.CONSTRUCTOR,
            GetMessageAddedReactions.CONSTRUCTOR,
            GetMessageAvailableReactions.CONSTRUCTOR,
            GetMessageEffect.CONSTRUCTOR,
            GetMessageEmbeddingCode.CONSTRUCTOR,
            GetMessageFileType.CONSTRUCTOR,
            GetMessageImportConfirmationText.CONSTRUCTOR,
            GetMessageLink.CONSTRUCTOR,
            GetMessageLinkInfo.CONSTRUCTOR,
            GetMessageLocally.CONSTRUCTOR,
            GetMessagePublicForwards.CONSTRUCTOR,
            GetMessageReadDate.CONSTRUCTOR,
            GetMessageStatistics.CONSTRUCTOR,
            GetMessageThread.CONSTRUCTOR,
            GetMessageThreadHistory.CONSTRUCTOR,
            GetMessageViewers.CONSTRUCTOR,
            GetMessages.CONSTRUCTOR,
            GetNetworkStatistics.CONSTRUCTOR,
            GetNewChatPrivacySettings.CONSTRUCTOR,
            GetOption.CONSTRUCTOR,
            GetOwnedStickerSets.CONSTRUCTOR,
            GetPassportAuthorizationForm.CONSTRUCTOR,
            GetPassportAuthorizationFormAvailableElements.CONSTRUCTOR,
            GetPassportElement.CONSTRUCTOR,
            GetPasswordState.CONSTRUCTOR,
            GetPaymentForm.CONSTRUCTOR,
            GetPaymentReceipt.CONSTRUCTOR,
            GetPhoneNumberInfo.CONSTRUCTOR,
            GetPhoneNumberInfoSync.CONSTRUCTOR,
            GetPollVoters.CONSTRUCTOR,
            GetPreferredCountryLanguage.CONSTRUCTOR,
            GetPremiumFeatures.CONSTRUCTOR,
            GetPremiumGiftCodePaymentOptions.CONSTRUCTOR,
            GetPremiumGiveawayInfo.CONSTRUCTOR,
            GetPremiumLimit.CONSTRUCTOR,
            GetPremiumState.CONSTRUCTOR,
            GetPremiumStickerExamples.CONSTRUCTOR,
            GetPremiumStickers.CONSTRUCTOR,
            GetProxies.CONSTRUCTOR,
            GetProxyLink.CONSTRUCTOR,
            GetPushReceiverId.CONSTRUCTOR,
            GetReadDatePrivacySettings.CONSTRUCTOR,
            GetRecentEmojiStatuses.CONSTRUCTOR,
            GetRecentInlineBots.CONSTRUCTOR,
            GetRecentStickers.CONSTRUCTOR,
            GetRecentlyOpenedChats.CONSTRUCTOR,
            GetRecentlyVisitedTMeUrls.CONSTRUCTOR,
            GetRecommendedChatFolders.CONSTRUCTOR,
            GetRecommendedChats.CONSTRUCTOR,
            GetRecoveryEmailAddress.CONSTRUCTOR,
            GetRemoteFile.CONSTRUCTOR,
            GetRepliedMessage.CONSTRUCTOR,
            GetSavedAnimations.CONSTRUCTOR,
            GetSavedMessagesTags.CONSTRUCTOR,
            GetSavedMessagesTopicHistory.CONSTRUCTOR,
            GetSavedMessagesTopicMessageByDate.CONSTRUCTOR,
            GetSavedNotificationSound.CONSTRUCTOR,
            GetSavedNotificationSounds.CONSTRUCTOR,
            GetSavedOrderInfo.CONSTRUCTOR,
            GetScopeNotificationSettings.CONSTRUCTOR,
            GetSearchedForTags.CONSTRUCTOR,
            GetSecretChat.CONSTRUCTOR,
            GetStarAdAccountUrl.CONSTRUCTOR,
            GetStarPaymentOptions.CONSTRUCTOR,
            GetStarRevenueStatistics.CONSTRUCTOR,
            GetStarTransactions.CONSTRUCTOR,
            GetStarWithdrawalUrl.CONSTRUCTOR,
            GetStatisticalGraph.CONSTRUCTOR,
            GetStickerEmojis.CONSTRUCTOR,
            GetStickerSet.CONSTRUCTOR,
            GetStickers.CONSTRUCTOR,
            GetStorageStatistics.CONSTRUCTOR,
            GetStorageStatisticsFast.CONSTRUCTOR,
            GetStory.CONSTRUCTOR,
            GetStoryAvailableReactions.CONSTRUCTOR,
            GetStoryInteractions.CONSTRUCTOR,
            GetStoryNotificationSettingsExceptions.CONSTRUCTOR,
            GetStoryPublicForwards.CONSTRUCTOR,
            GetStoryStatistics.CONSTRUCTOR,
            GetSuggestedFileName.CONSTRUCTOR,
            GetSuggestedStickerSetName.CONSTRUCTOR,
            GetSuitableDiscussionChats.CONSTRUCTOR,
            GetSuitablePersonalChats.CONSTRUCTOR,
            GetSupergroup.CONSTRUCTOR,
            GetSupergroupFullInfo.CONSTRUCTOR,
            GetSupergroupMembers.CONSTRUCTOR,
            GetSupportName.CONSTRUCTOR,
            GetSupportUser.CONSTRUCTOR,
            GetTemporaryPasswordState.CONSTRUCTOR,
            GetTextEntities.CONSTRUCTOR,
            GetThemeParametersJsonString.CONSTRUCTOR,
            GetThemedChatEmojiStatuses.CONSTRUCTOR,
            GetThemedEmojiStatuses.CONSTRUCTOR,
            GetTimeZones.CONSTRUCTOR,
            GetTopChats.CONSTRUCTOR,
            GetTrendingStickerSets.CONSTRUCTOR,
            GetUser.CONSTRUCTOR,
            GetUserChatBoosts.CONSTRUCTOR,
            GetUserFullInfo.CONSTRUCTOR,
            GetUserLink.CONSTRUCTOR,
            GetUserPrivacySettingRules.CONSTRUCTOR,
            GetUserProfilePhotos.CONSTRUCTOR,
            GetUserSupportInfo.CONSTRUCTOR,
            GetVideoChatAvailableParticipants.CONSTRUCTOR,
            GetVideoChatRtmpUrl.CONSTRUCTOR,
            GetWebAppLinkUrl.CONSTRUCTOR,
            GetWebAppUrl.CONSTRUCTOR,
            GetWebPageInstantView.CONSTRUCTOR,
            HideContactCloseBirthdays.CONSTRUCTOR,
            HideSuggestedAction.CONSTRUCTOR,
            ImportContacts.CONSTRUCTOR,
            ImportMessages.CONSTRUCTOR,
            InviteGroupCallParticipants.CONSTRUCTOR,
            JoinChat.CONSTRUCTOR,
            JoinChatByInviteLink.CONSTRUCTOR,
            JoinGroupCall.CONSTRUCTOR,
            LaunchPrepaidPremiumGiveaway.CONSTRUCTOR,
            LeaveChat.CONSTRUCTOR,
            LeaveGroupCall.CONSTRUCTOR,
            LoadActiveStories.CONSTRUCTOR,
            LoadChats.CONSTRUCTOR,
            LoadGroupCallParticipants.CONSTRUCTOR,
            LoadQuickReplyShortcutMessages.CONSTRUCTOR,
            LoadQuickReplyShortcuts.CONSTRUCTOR,
            LoadSavedMessagesTopics.CONSTRUCTOR,
            LogOut.CONSTRUCTOR,
            OpenChat.CONSTRUCTOR,
            OpenChatSimilarChat.CONSTRUCTOR,
            OpenMessageContent.CONSTRUCTOR,
            OpenStory.CONSTRUCTOR,
            OpenWebApp.CONSTRUCTOR,
            OptimizeStorage.CONSTRUCTOR,
            ParseMarkdown.CONSTRUCTOR,
            ParseTextEntities.CONSTRUCTOR,
            PinChatMessage.CONSTRUCTOR,
            PingProxy.CONSTRUCTOR,
            PreliminaryUploadFile.CONSTRUCTOR,
            ProcessChatFolderNewChats.CONSTRUCTOR,
            ProcessChatJoinRequest.CONSTRUCTOR,
            ProcessChatJoinRequests.CONSTRUCTOR,
            ProcessPushNotification.CONSTRUCTOR,
            RateSpeechRecognition.CONSTRUCTOR,
            ReadAllChatMentions.CONSTRUCTOR,
            ReadAllChatReactions.CONSTRUCTOR,
            ReadAllMessageThreadMentions.CONSTRUCTOR,
            ReadAllMessageThreadReactions.CONSTRUCTOR,
            ReadChatList.CONSTRUCTOR,
            ReadFilePart.CONSTRUCTOR,
            ReaddQuickReplyShortcutMessages.CONSTRUCTOR,
            RecognizeSpeech.CONSTRUCTOR,
            RecoverAuthenticationPassword.CONSTRUCTOR,
            RecoverPassword.CONSTRUCTOR,
            RefundStarPayment.CONSTRUCTOR,
            RegisterDevice.CONSTRUCTOR,
            RegisterUser.CONSTRUCTOR,
            RemoveAllFilesFromDownloads.CONSTRUCTOR,
            RemoveBusinessConnectedBotFromChat.CONSTRUCTOR,
            RemoveChatActionBar.CONSTRUCTOR,
            RemoveContacts.CONSTRUCTOR,
            RemoveFavoriteSticker.CONSTRUCTOR,
            RemoveFileFromDownloads.CONSTRUCTOR,
            RemoveInstalledBackground.CONSTRUCTOR,
            RemoveMessageReaction.CONSTRUCTOR,
            RemoveNotification.CONSTRUCTOR,
            RemoveNotificationGroup.CONSTRUCTOR,
            RemoveProxy.CONSTRUCTOR,
            RemoveRecentHashtag.CONSTRUCTOR,
            RemoveRecentSticker.CONSTRUCTOR,
            RemoveRecentlyFoundChat.CONSTRUCTOR,
            RemoveSavedAnimation.CONSTRUCTOR,
            RemoveSavedNotificationSound.CONSTRUCTOR,
            RemoveSearchedForTag.CONSTRUCTOR,
            RemoveStickerFromSet.CONSTRUCTOR,
            RemoveTopChat.CONSTRUCTOR,
            ReorderActiveUsernames.CONSTRUCTOR,
            ReorderBotActiveUsernames.CONSTRUCTOR,
            ReorderChatFolders.CONSTRUCTOR,
            ReorderInstalledStickerSets.CONSTRUCTOR,
            ReorderQuickReplyShortcuts.CONSTRUCTOR,
            ReorderSupergroupActiveUsernames.CONSTRUCTOR,
            ReplacePrimaryChatInviteLink.CONSTRUCTOR,
            ReplaceStickerInSet.CONSTRUCTOR,
            ReplaceVideoChatRtmpUrl.CONSTRUCTOR,
            ReportAuthenticationCodeMissing.CONSTRUCTOR,
            ReportChat.CONSTRUCTOR,
            ReportChatPhoto.CONSTRUCTOR,
            ReportChatSponsoredMessage.CONSTRUCTOR,
            ReportMessageReactions.CONSTRUCTOR,
            ReportPhoneNumberCodeMissing.CONSTRUCTOR,
            ReportStory.CONSTRUCTOR,
            ReportSupergroupAntiSpamFalsePositive.CONSTRUCTOR,
            ReportSupergroupSpam.CONSTRUCTOR,
            RequestAuthenticationPasswordRecovery.CONSTRUCTOR,
            RequestPasswordRecovery.CONSTRUCTOR,
            RequestQrCodeAuthentication.CONSTRUCTOR,
            ResendAuthenticationCode.CONSTRUCTOR,
            ResendEmailAddressVerificationCode.CONSTRUCTOR,
            ResendLoginEmailAddressCode.CONSTRUCTOR,
            ResendMessages.CONSTRUCTOR,
            ResendPhoneNumberCode.CONSTRUCTOR,
            ResendRecoveryEmailAddressCode.CONSTRUCTOR,
            ResetAllNotificationSettings.CONSTRUCTOR,
            ResetAuthenticationEmailAddress.CONSTRUCTOR,
            ResetInstalledBackgrounds.CONSTRUCTOR,
            ResetNetworkStatistics.CONSTRUCTOR,
            ResetPassword.CONSTRUCTOR,
            RevokeChatInviteLink.CONSTRUCTOR,
            RevokeGroupCallInviteLink.CONSTRUCTOR,
            SaveApplicationLogEvent.CONSTRUCTOR,
            SearchBackground.CONSTRUCTOR,
            SearchCallMessages.CONSTRUCTOR,
            SearchChatMembers.CONSTRUCTOR,
            SearchChatMessages.CONSTRUCTOR,
            SearchChatRecentLocationMessages.CONSTRUCTOR,
            SearchChats.CONSTRUCTOR,
            SearchChatsNearby.CONSTRUCTOR,
            SearchChatsOnServer.CONSTRUCTOR,
            SearchContacts.CONSTRUCTOR,
            SearchEmojis.CONSTRUCTOR,
            SearchFileDownloads.CONSTRUCTOR,
            SearchHashtags.CONSTRUCTOR,
            SearchInstalledStickerSets.CONSTRUCTOR,
            SearchMessages.CONSTRUCTOR,
            SearchOutgoingDocumentMessages.CONSTRUCTOR,
            SearchPublicChat.CONSTRUCTOR,
            SearchPublicChats.CONSTRUCTOR,
            SearchPublicMessagesByTag.CONSTRUCTOR,
            SearchPublicStoriesByLocation.CONSTRUCTOR,
            SearchPublicStoriesByTag.CONSTRUCTOR,
            SearchPublicStoriesByVenue.CONSTRUCTOR,
            SearchQuote.CONSTRUCTOR,
            SearchRecentlyFoundChats.CONSTRUCTOR,
            SearchSavedMessages.CONSTRUCTOR,
            SearchSecretMessages.CONSTRUCTOR,
            SearchStickerSet.CONSTRUCTOR,
            SearchStickerSets.CONSTRUCTOR,
            SearchStickers.CONSTRUCTOR,
            SearchStringsByPrefix.CONSTRUCTOR,
            SearchUserByPhoneNumber.CONSTRUCTOR,
            SearchUserByToken.CONSTRUCTOR,
            SearchWebApp.CONSTRUCTOR,
            SendAuthenticationFirebaseSms.CONSTRUCTOR,
            SendBotStartMessage.CONSTRUCTOR,
            SendBusinessMessage.CONSTRUCTOR,
            SendBusinessMessageAlbum.CONSTRUCTOR,
            SendCallDebugInformation.CONSTRUCTOR,
            SendCallLog.CONSTRUCTOR,
            SendCallRating.CONSTRUCTOR,
            SendCallSignalingData.CONSTRUCTOR,
            SendChatAction.CONSTRUCTOR,
            SendCustomRequest.CONSTRUCTOR,
            SendEmailAddressVerificationCode.CONSTRUCTOR,
            SendInlineQueryResultMessage.CONSTRUCTOR,
            SendMessage.CONSTRUCTOR,
            SendMessageAlbum.CONSTRUCTOR,
            SendPassportAuthorizationForm.CONSTRUCTOR,
            SendPaymentForm.CONSTRUCTOR,
            SendPhoneNumberCode.CONSTRUCTOR,
            SendPhoneNumberFirebaseSms.CONSTRUCTOR,
            SendQuickReplyShortcutMessages.CONSTRUCTOR,
            SendStory.CONSTRUCTOR,
            SendWebAppCustomRequest.CONSTRUCTOR,
            SendWebAppData.CONSTRUCTOR,
            SetAccentColor.CONSTRUCTOR,
            SetAccountTtl.CONSTRUCTOR,
            SetAlarm.CONSTRUCTOR,
            SetApplicationVerificationToken.CONSTRUCTOR,
            SetArchiveChatListSettings.CONSTRUCTOR,
            SetAuthenticationEmailAddress.CONSTRUCTOR,
            SetAuthenticationPhoneNumber.CONSTRUCTOR,
            SetAutoDownloadSettings.CONSTRUCTOR,
            SetAutosaveSettings.CONSTRUCTOR,
            SetBio.CONSTRUCTOR,
            SetBirthdate.CONSTRUCTOR,
            SetBotInfoDescription.CONSTRUCTOR,
            SetBotInfoShortDescription.CONSTRUCTOR,
            SetBotName.CONSTRUCTOR,
            SetBotProfilePhoto.CONSTRUCTOR,
            SetBotUpdatesStatus.CONSTRUCTOR,
            SetBusinessAwayMessageSettings.CONSTRUCTOR,
            SetBusinessConnectedBot.CONSTRUCTOR,
            SetBusinessGreetingMessageSettings.CONSTRUCTOR,
            SetBusinessLocation.CONSTRUCTOR,
            SetBusinessOpeningHours.CONSTRUCTOR,
            SetBusinessStartPage.CONSTRUCTOR,
            SetChatAccentColor.CONSTRUCTOR,
            SetChatActiveStoriesList.CONSTRUCTOR,
            SetChatAvailableReactions.CONSTRUCTOR,
            SetChatBackground.CONSTRUCTOR,
            SetChatClientData.CONSTRUCTOR,
            SetChatDescription.CONSTRUCTOR,
            SetChatDiscussionGroup.CONSTRUCTOR,
            SetChatDraftMessage.CONSTRUCTOR,
            SetChatEmojiStatus.CONSTRUCTOR,
            SetChatLocation.CONSTRUCTOR,
            SetChatMemberStatus.CONSTRUCTOR,
            SetChatMessageAutoDeleteTime.CONSTRUCTOR,
            SetChatMessageSender.CONSTRUCTOR,
            SetChatNotificationSettings.CONSTRUCTOR,
            SetChatPermissions.CONSTRUCTOR,
            SetChatPhoto.CONSTRUCTOR,
            SetChatPinnedStories.CONSTRUCTOR,
            SetChatProfileAccentColor.CONSTRUCTOR,
            SetChatSlowModeDelay.CONSTRUCTOR,
            SetChatTheme.CONSTRUCTOR,
            SetChatTitle.CONSTRUCTOR,
            SetCloseFriends.CONSTRUCTOR,
            SetCommands.CONSTRUCTOR,
            SetCustomEmojiStickerSetThumbnail.CONSTRUCTOR,
            SetCustomLanguagePack.CONSTRUCTOR,
            SetCustomLanguagePackString.CONSTRUCTOR,
            SetDatabaseEncryptionKey.CONSTRUCTOR,
            SetDefaultBackground.CONSTRUCTOR,
            SetDefaultChannelAdministratorRights.CONSTRUCTOR,
            SetDefaultGroupAdministratorRights.CONSTRUCTOR,
            SetDefaultMessageAutoDeleteTime.CONSTRUCTOR,
            SetDefaultReactionType.CONSTRUCTOR,
            SetEmojiStatus.CONSTRUCTOR,
            SetFileGenerationProgress.CONSTRUCTOR,
            SetForumTopicNotificationSettings.CONSTRUCTOR,
            SetGameScore.CONSTRUCTOR,
            SetGroupCallParticipantIsSpeaking.CONSTRUCTOR,
            SetGroupCallParticipantVolumeLevel.CONSTRUCTOR,
            SetGroupCallTitle.CONSTRUCTOR,
            SetInactiveSessionTtl.CONSTRUCTOR,
            SetInlineGameScore.CONSTRUCTOR,
            SetLocation.CONSTRUCTOR,
            SetLogStream.CONSTRUCTOR,
            SetLogTagVerbosityLevel.CONSTRUCTOR,
            SetLogVerbosityLevel.CONSTRUCTOR,
            SetLoginEmailAddress.CONSTRUCTOR,
            SetMenuButton.CONSTRUCTOR,
            SetMessageFactCheck.CONSTRUCTOR,
            SetMessageReactions.CONSTRUCTOR,
            SetMessageSenderBlockList.CONSTRUCTOR,
            SetName.CONSTRUCTOR,
            SetNetworkType.CONSTRUCTOR,
            SetNewChatPrivacySettings.CONSTRUCTOR,
            SetOption.CONSTRUCTOR,
            SetPassportElement.CONSTRUCTOR,
            SetPassportElementErrors.CONSTRUCTOR,
            SetPassword.CONSTRUCTOR,
            SetPersonalChat.CONSTRUCTOR,
            SetPinnedChats.CONSTRUCTOR,
            SetPinnedForumTopics.CONSTRUCTOR,
            SetPinnedSavedMessagesTopics.CONSTRUCTOR,
            SetPollAnswer.CONSTRUCTOR,
            SetProfileAccentColor.CONSTRUCTOR,
            SetProfilePhoto.CONSTRUCTOR,
            SetQuickReplyShortcutName.CONSTRUCTOR,
            SetReactionNotificationSettings.CONSTRUCTOR,
            SetReadDatePrivacySettings.CONSTRUCTOR,
            SetRecoveryEmailAddress.CONSTRUCTOR,
            SetSavedMessagesTagLabel.CONSTRUCTOR,
            SetScopeNotificationSettings.CONSTRUCTOR,
            SetStickerEmojis.CONSTRUCTOR,
            SetStickerKeywords.CONSTRUCTOR,
            SetStickerMaskPosition.CONSTRUCTOR,
            SetStickerPositionInSet.CONSTRUCTOR,
            SetStickerSetThumbnail.CONSTRUCTOR,
            SetStickerSetTitle.CONSTRUCTOR,
            SetStoryPrivacySettings.CONSTRUCTOR,
            SetStoryReaction.CONSTRUCTOR,
            SetSupergroupCustomEmojiStickerSet.CONSTRUCTOR,
            SetSupergroupStickerSet.CONSTRUCTOR,
            SetSupergroupUnrestrictBoostCount.CONSTRUCTOR,
            SetSupergroupUsername.CONSTRUCTOR,
            SetTdlibParameters.CONSTRUCTOR,
            SetUserPersonalProfilePhoto.CONSTRUCTOR,
            SetUserPrivacySettingRules.CONSTRUCTOR,
            SetUserSupportInfo.CONSTRUCTOR,
            SetUsername.CONSTRUCTOR,
            SetVideoChatDefaultParticipant.CONSTRUCTOR,
            ShareChatWithBot.CONSTRUCTOR,
            SharePhoneNumber.CONSTRUCTOR,
            ShareUsersWithBot.CONSTRUCTOR,
            StartGroupCallRecording.CONSTRUCTOR,
            StartGroupCallScreenSharing.CONSTRUCTOR,
            StartScheduledGroupCall.CONSTRUCTOR,
            StopBusinessPoll.CONSTRUCTOR,
            StopPoll.CONSTRUCTOR,
            SuggestUserProfilePhoto.CONSTRUCTOR,
            SynchronizeLanguagePack.CONSTRUCTOR,
            TerminateAllOtherSessions.CONSTRUCTOR,
            TerminateSession.CONSTRUCTOR,
            TestCallBytes.CONSTRUCTOR,
            TestCallEmpty.CONSTRUCTOR,
            TestCallString.CONSTRUCTOR,
            TestCallVectorInt.CONSTRUCTOR,
            TestCallVectorIntObject.CONSTRUCTOR,
            TestCallVectorString.CONSTRUCTOR,
            TestCallVectorStringObject.CONSTRUCTOR,
            TestGetDifference.CONSTRUCTOR,
            TestNetwork.CONSTRUCTOR,
            TestProxy.CONSTRUCTOR,
            TestReturnError.CONSTRUCTOR,
            TestSquareInt.CONSTRUCTOR,
            TestUseUpdate.CONSTRUCTOR,
            ToggleAllDownloadsArePaused.CONSTRUCTOR,
            ToggleBotIsAddedToAttachmentMenu.CONSTRUCTOR,
            ToggleBotUsernameIsActive.CONSTRUCTOR,
            ToggleBusinessConnectedBotChatIsPaused.CONSTRUCTOR,
            ToggleChatDefaultDisableNotification.CONSTRUCTOR,
            ToggleChatFolderTags.CONSTRUCTOR,
            ToggleChatHasProtectedContent.CONSTRUCTOR,
            ToggleChatIsMarkedAsUnread.CONSTRUCTOR,
            ToggleChatIsPinned.CONSTRUCTOR,
            ToggleChatIsTranslatable.CONSTRUCTOR,
            ToggleChatViewAsTopics.CONSTRUCTOR,
            ToggleDownloadIsPaused.CONSTRUCTOR,
            ToggleForumTopicIsClosed.CONSTRUCTOR,
            ToggleForumTopicIsPinned.CONSTRUCTOR,
            ToggleGeneralForumTopicIsHidden.CONSTRUCTOR,
            ToggleGroupCallEnabledStartNotification.CONSTRUCTOR,
            ToggleGroupCallIsMyVideoEnabled.CONSTRUCTOR,
            ToggleGroupCallIsMyVideoPaused.CONSTRUCTOR,
            ToggleGroupCallMuteNewParticipants.CONSTRUCTOR,
            ToggleGroupCallParticipantIsHandRaised.CONSTRUCTOR,
            ToggleGroupCallParticipantIsMuted.CONSTRUCTOR,
            ToggleGroupCallScreenSharingIsPaused.CONSTRUCTOR,
            ToggleHasSponsoredMessagesEnabled.CONSTRUCTOR,
            ToggleSavedMessagesTopicIsPinned.CONSTRUCTOR,
            ToggleSessionCanAcceptCalls.CONSTRUCTOR,
            ToggleSessionCanAcceptSecretChats.CONSTRUCTOR,
            ToggleStoryIsPostedToChatPage.CONSTRUCTOR,
            ToggleSupergroupCanHaveSponsoredMessages.CONSTRUCTOR,
            ToggleSupergroupHasAggressiveAntiSpamEnabled.CONSTRUCTOR,
            ToggleSupergroupHasHiddenMembers.CONSTRUCTOR,
            ToggleSupergroupIsAllHistoryAvailable.CONSTRUCTOR,
            ToggleSupergroupIsBroadcastGroup.CONSTRUCTOR,
            ToggleSupergroupIsForum.CONSTRUCTOR,
            ToggleSupergroupJoinByRequest.CONSTRUCTOR,
            ToggleSupergroupJoinToSendMessages.CONSTRUCTOR,
            ToggleSupergroupSignMessages.CONSTRUCTOR,
            ToggleSupergroupUsernameIsActive.CONSTRUCTOR,
            ToggleUsernameIsActive.CONSTRUCTOR,
            TransferChatOwnership.CONSTRUCTOR,
            TranslateMessageText.CONSTRUCTOR,
            TranslateText.CONSTRUCTOR,
            UnpinAllChatMessages.CONSTRUCTOR,
            UnpinAllMessageThreadMessages.CONSTRUCTOR,
            UnpinChatMessage.CONSTRUCTOR,
            UpgradeBasicGroupChatToSupergroupChat.CONSTRUCTOR,
            UploadStickerFile.CONSTRUCTOR,
            ValidateOrderInfo.CONSTRUCTOR,
            ViewMessages.CONSTRUCTOR,
            ViewPremiumFeature.CONSTRUCTOR,
            ViewTrendingStickerSets.CONSTRUCTOR,
            WriteGeneratedFilePart.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default Function constructor.
         */
        public Function() {
        }

        /**
         * Returns a string representation of the object.
         *
         * @return a string representation of the object.
         */
        public native String toString();
    }

    /**
     * Contains information about supported accent color for user/chat name, background of empty chat photo, replies to messages and link previews.
     */
    public static class AccentColor extends Object {
        /**
         * Accent color identifier.
         */
        public int id;
        /**
         * Identifier of a built-in color to use in places, where only one color is needed; 0-6.
         */
        public int builtInAccentColorId;
        /**
         * The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in light themes.
         */
        public int[] lightThemeColors;
        /**
         * The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes.
         */
        public int[] darkThemeColors;
        /**
         * The minimum chat boost level required to use the color in a channel chat.
         */
        public int minChannelChatBoostLevel;

        /**
         * Contains information about supported accent color for user/chat name, background of empty chat photo, replies to messages and link previews.
         */
        public AccentColor() {
        }

        /**
         * Contains information about supported accent color for user/chat name, background of empty chat photo, replies to messages and link previews.
         *
         * @param id Accent color identifier.
         * @param builtInAccentColorId Identifier of a built-in color to use in places, where only one color is needed; 0-6.
         * @param lightThemeColors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in light themes.
         * @param darkThemeColors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes.
         * @param minChannelChatBoostLevel The minimum chat boost level required to use the color in a channel chat.
         */
        public AccentColor(int id, int builtInAccentColorId, int[] lightThemeColors, int[] darkThemeColors, int minChannelChatBoostLevel) {
            this.id = id;
            this.builtInAccentColorId = builtInAccentColorId;
            this.lightThemeColors = lightThemeColors;
            this.darkThemeColors = darkThemeColors;
            this.minChannelChatBoostLevel = minChannelChatBoostLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -496870680;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the period of inactivity after which the current user's account will automatically be deleted.
     */
    public static class AccountTtl extends Object {
        /**
         * Number of days of inactivity before the account will be flagged for deletion; 30-366 days.
         */
        public int days;

        /**
         * Contains information about the period of inactivity after which the current user's account will automatically be deleted.
         */
        public AccountTtl() {
        }

        /**
         * Contains information about the period of inactivity after which the current user's account will automatically be deleted.
         *
         * @param days Number of days of inactivity before the account will be flagged for deletion; 30-366 days.
         */
        public AccountTtl(int days) {
            this.days = days;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1324495492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a reaction applied to a message.
     */
    public static class AddedReaction extends Object {
        /**
         * Type of the reaction.
         */
        public ReactionType type;
        /**
         * Identifier of the chat member, applied the reaction.
         */
        public MessageSender senderId;
        /**
         * True, if the reaction was added by the current user.
         */
        public boolean isOutgoing;
        /**
         * Point in time (Unix timestamp) when the reaction was added.
         */
        public int date;

        /**
         * Represents a reaction applied to a message.
         */
        public AddedReaction() {
        }

        /**
         * Represents a reaction applied to a message.
         *
         * @param type Type of the reaction.
         * @param senderId Identifier of the chat member, applied the reaction.
         * @param isOutgoing True, if the reaction was added by the current user.
         * @param date Point in time (Unix timestamp) when the reaction was added.
         */
        public AddedReaction(ReactionType type, MessageSender senderId, boolean isOutgoing, int date) {
            this.type = type;
            this.senderId = senderId;
            this.isOutgoing = isOutgoing;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1258586525;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of reactions added to a message.
     */
    public static class AddedReactions extends Object {
        /**
         * The total number of found reactions.
         */
        public int totalCount;
        /**
         * The list of added reactions.
         */
        public AddedReaction[] reactions;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of reactions added to a message.
         */
        public AddedReactions() {
        }

        /**
         * Represents a list of reactions added to a message.
         *
         * @param totalCount The total number of found reactions.
         * @param reactions The list of added reactions.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public AddedReactions(int totalCount, AddedReaction[] reactions, String nextOffset) {
            this.totalCount = totalCount;
            this.reactions = reactions;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 226352304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an address.
     */
    public static class Address extends Object {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code.
         */
        public String countryCode;
        /**
         * State, if applicable.
         */
        public String state;
        /**
         * City.
         */
        public String city;
        /**
         * First line of the address.
         */
        public String streetLine1;
        /**
         * Second line of the address.
         */
        public String streetLine2;
        /**
         * Address postal code.
         */
        public String postalCode;

        /**
         * Describes an address.
         */
        public Address() {
        }

        /**
         * Describes an address.
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code.
         * @param state State, if applicable.
         * @param city City.
         * @param streetLine1 First line of the address.
         * @param streetLine2 Second line of the address.
         * @param postalCode Address postal code.
         */
        public Address(String countryCode, String state, String city, String streetLine1, String streetLine2, String postalCode) {
            this.countryCode = countryCode;
            this.state = state;
            this.city = city;
            this.streetLine1 = streetLine1;
            this.streetLine2 = streetLine2;
            this.postalCode = postalCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2043654342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Animated variant of a chat photo in MPEG4 format.
     */
    public static class AnimatedChatPhoto extends Object {
        /**
         * Animation width and height.
         */
        public int length;
        /**
         * Information about the animation file.
         */
        public File file;
        /**
         * Timestamp of the frame, used as a static chat photo.
         */
        public double mainFrameTimestamp;

        /**
         * Animated variant of a chat photo in MPEG4 format.
         */
        public AnimatedChatPhoto() {
        }

        /**
         * Animated variant of a chat photo in MPEG4 format.
         *
         * @param length Animation width and height.
         * @param file Information about the animation file.
         * @param mainFrameTimestamp Timestamp of the frame, used as a static chat photo.
         */
        public AnimatedChatPhoto(int length, File file, double mainFrameTimestamp) {
            this.length = length;
            this.file = file;
            this.mainFrameTimestamp = mainFrameTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 191994926;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an animated or custom representation of an emoji.
     */
    public static class AnimatedEmoji extends Object {
        /**
         * Sticker for the emoji; may be null if yet unknown for a custom emoji. If the sticker is a custom emoji, then it can have arbitrary format.
         */
        @Nullable public Sticker sticker;
        /**
         * Expected width of the sticker, which can be used if the sticker is null.
         */
        public int stickerWidth;
        /**
         * Expected height of the sticker, which can be used if the sticker is null.
         */
        public int stickerHeight;
        /**
         * Emoji modifier fitzpatrick type; 0-6; 0 if none.
         */
        public int fitzpatrickType;
        /**
         * File containing the sound to be played when the sticker is clicked; may be null. The sound is encoded with the Opus codec, and stored inside an OGG container.
         */
        @Nullable public File sound;

        /**
         * Describes an animated or custom representation of an emoji.
         */
        public AnimatedEmoji() {
        }

        /**
         * Describes an animated or custom representation of an emoji.
         *
         * @param sticker Sticker for the emoji; may be null if yet unknown for a custom emoji. If the sticker is a custom emoji, then it can have arbitrary format.
         * @param stickerWidth Expected width of the sticker, which can be used if the sticker is null.
         * @param stickerHeight Expected height of the sticker, which can be used if the sticker is null.
         * @param fitzpatrickType Emoji modifier fitzpatrick type; 0-6; 0 if none.
         * @param sound File containing the sound to be played when the sticker is clicked; may be null. The sound is encoded with the Opus codec, and stored inside an OGG container.
         */
        public AnimatedEmoji(Sticker sticker, int stickerWidth, int stickerHeight, int fitzpatrickType, File sound) {
            this.sticker = sticker;
            this.stickerWidth = stickerWidth;
            this.stickerHeight = stickerHeight;
            this.fitzpatrickType = fitzpatrickType;
            this.sound = sound;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1378918079;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an animation file. The animation must be encoded in GIF or MPEG4 format.
     */
    public static class Animation extends Object {
        /**
         * Duration of the animation, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * Width of the animation.
         */
        public int width;
        /**
         * Height of the animation.
         */
        public int height;
        /**
         * Original name of the file; as defined by the sender.
         */
        public String fileName;
        /**
         * MIME type of the file, usually &quot;image/gif&quot; or &quot;video/mp4&quot;.
         */
        public String mimeType;
        /**
         * True, if stickers were added to the animation. The list of corresponding sticker set can be received using getAttachedStickerSets.
         */
        public boolean hasStickers;
        /**
         * Animation minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Animation thumbnail in JPEG or MPEG4 format; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * File containing the animation.
         */
        public File animation;

        /**
         * Describes an animation file. The animation must be encoded in GIF or MPEG4 format.
         */
        public Animation() {
        }

        /**
         * Describes an animation file. The animation must be encoded in GIF or MPEG4 format.
         *
         * @param duration Duration of the animation, in seconds; as defined by the sender.
         * @param width Width of the animation.
         * @param height Height of the animation.
         * @param fileName Original name of the file; as defined by the sender.
         * @param mimeType MIME type of the file, usually &quot;image/gif&quot; or &quot;video/mp4&quot;.
         * @param hasStickers True, if stickers were added to the animation. The list of corresponding sticker set can be received using getAttachedStickerSets.
         * @param minithumbnail Animation minithumbnail; may be null.
         * @param thumbnail Animation thumbnail in JPEG or MPEG4 format; may be null.
         * @param animation File containing the animation.
         */
        public Animation(int duration, int width, int height, String fileName, String mimeType, boolean hasStickers, Minithumbnail minithumbnail, Thumbnail thumbnail, File animation) {
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.fileName = fileName;
            this.mimeType = mimeType;
            this.hasStickers = hasStickers;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -872359106;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of animations.
     */
    public static class Animations extends Object {
        /**
         * List of animations.
         */
        public Animation[] animations;

        /**
         * Represents a list of animations.
         */
        public Animations() {
        }

        /**
         * Represents a list of animations.
         *
         * @param animations List of animations.
         */
        public Animations(Animation[] animations) {
            this.animations = animations;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 344216945;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains settings for automatic moving of chats to and from the Archive chat lists.
     */
    public static class ArchiveChatListSettings extends Object {
        /**
         * True, if new chats from non-contacts will be automatically archived and muted. Can be set to true only if the option &quot;can_archive_and_mute_new_chats_from_unknown_users&quot; is true.
         */
        public boolean archiveAndMuteNewChatsFromUnknownUsers;
        /**
         * True, if unmuted chats will be kept in the Archive chat list when they get a new message.
         */
        public boolean keepUnmutedChatsArchived;
        /**
         * True, if unmuted chats, that are always included or pinned in a folder, will be kept in the Archive chat list when they get a new message. Ignored if keepUnmutedChatsArchived == true.
         */
        public boolean keepChatsFromFoldersArchived;

        /**
         * Contains settings for automatic moving of chats to and from the Archive chat lists.
         */
        public ArchiveChatListSettings() {
        }

        /**
         * Contains settings for automatic moving of chats to and from the Archive chat lists.
         *
         * @param archiveAndMuteNewChatsFromUnknownUsers True, if new chats from non-contacts will be automatically archived and muted. Can be set to true only if the option &quot;can_archive_and_mute_new_chats_from_unknown_users&quot; is true.
         * @param keepUnmutedChatsArchived True, if unmuted chats will be kept in the Archive chat list when they get a new message.
         * @param keepChatsFromFoldersArchived True, if unmuted chats, that are always included or pinned in a folder, will be kept in the Archive chat list when they get a new message. Ignored if keepUnmutedChatsArchived == true.
         */
        public ArchiveChatListSettings(boolean archiveAndMuteNewChatsFromUnknownUsers, boolean keepUnmutedChatsArchived, boolean keepChatsFromFoldersArchived) {
            this.archiveAndMuteNewChatsFromUnknownUsers = archiveAndMuteNewChatsFromUnknownUsers;
            this.keepUnmutedChatsArchived = keepUnmutedChatsArchived;
            this.keepChatsFromFoldersArchived = keepChatsFromFoldersArchived;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1058499236;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a bot, which can be added to attachment or side menu.
     */
    public static class AttachmentMenuBot extends Object {
        /**
         * User identifier of the bot.
         */
        public long botUserId;
        /**
         * True, if the bot supports opening from attachment menu in the chat with the bot.
         */
        public boolean supportsSelfChat;
        /**
         * True, if the bot supports opening from attachment menu in private chats with ordinary users.
         */
        public boolean supportsUserChats;
        /**
         * True, if the bot supports opening from attachment menu in private chats with other bots.
         */
        public boolean supportsBotChats;
        /**
         * True, if the bot supports opening from attachment menu in basic group and supergroup chats.
         */
        public boolean supportsGroupChats;
        /**
         * True, if the bot supports opening from attachment menu in channel chats.
         */
        public boolean supportsChannelChats;
        /**
         * True, if the user must be asked for the permission to send messages to the bot.
         */
        public boolean requestWriteAccess;
        /**
         * True, if the bot was explicitly added by the user. If the bot isn't added, then on the first bot launch toggleBotIsAddedToAttachmentMenu must be called and the bot must be added or removed.
         */
        public boolean isAdded;
        /**
         * True, if the bot must be shown in the attachment menu.
         */
        public boolean showInAttachmentMenu;
        /**
         * True, if the bot must be shown in the side menu.
         */
        public boolean showInSideMenu;
        /**
         * True, if a disclaimer, why the bot is shown in the side menu, is needed.
         */
        public boolean showDisclaimerInSideMenu;
        /**
         * Name for the bot in attachment menu.
         */
        public String name;
        /**
         * Color to highlight selected name of the bot if appropriate; may be null.
         */
        @Nullable public AttachmentMenuBotColor nameColor;
        /**
         * Default icon for the bot in SVG format; may be null.
         */
        @Nullable public File defaultIcon;
        /**
         * Icon for the bot in SVG format for the official iOS app; may be null.
         */
        @Nullable public File iosStaticIcon;
        /**
         * Icon for the bot in TGS format for the official iOS app; may be null.
         */
        @Nullable public File iosAnimatedIcon;
        /**
         * Icon for the bot in PNG format for the official iOS app side menu; may be null.
         */
        @Nullable public File iosSideMenuIcon;
        /**
         * Icon for the bot in TGS format for the official Android app; may be null.
         */
        @Nullable public File androidIcon;
        /**
         * Icon for the bot in SVG format for the official Android app side menu; may be null.
         */
        @Nullable public File androidSideMenuIcon;
        /**
         * Icon for the bot in TGS format for the official native macOS app; may be null.
         */
        @Nullable public File macosIcon;
        /**
         * Icon for the bot in PNG format for the official macOS app side menu; may be null.
         */
        @Nullable public File macosSideMenuIcon;
        /**
         * Color to highlight selected icon of the bot if appropriate; may be null.
         */
        @Nullable public AttachmentMenuBotColor iconColor;
        /**
         * Default placeholder for opened Web Apps in SVG format; may be null.
         */
        @Nullable public File webAppPlaceholder;

        /**
         * Represents a bot, which can be added to attachment or side menu.
         */
        public AttachmentMenuBot() {
        }

        /**
         * Represents a bot, which can be added to attachment or side menu.
         *
         * @param botUserId User identifier of the bot.
         * @param supportsSelfChat True, if the bot supports opening from attachment menu in the chat with the bot.
         * @param supportsUserChats True, if the bot supports opening from attachment menu in private chats with ordinary users.
         * @param supportsBotChats True, if the bot supports opening from attachment menu in private chats with other bots.
         * @param supportsGroupChats True, if the bot supports opening from attachment menu in basic group and supergroup chats.
         * @param supportsChannelChats True, if the bot supports opening from attachment menu in channel chats.
         * @param requestWriteAccess True, if the user must be asked for the permission to send messages to the bot.
         * @param isAdded True, if the bot was explicitly added by the user. If the bot isn't added, then on the first bot launch toggleBotIsAddedToAttachmentMenu must be called and the bot must be added or removed.
         * @param showInAttachmentMenu True, if the bot must be shown in the attachment menu.
         * @param showInSideMenu True, if the bot must be shown in the side menu.
         * @param showDisclaimerInSideMenu True, if a disclaimer, why the bot is shown in the side menu, is needed.
         * @param name Name for the bot in attachment menu.
         * @param nameColor Color to highlight selected name of the bot if appropriate; may be null.
         * @param defaultIcon Default icon for the bot in SVG format; may be null.
         * @param iosStaticIcon Icon for the bot in SVG format for the official iOS app; may be null.
         * @param iosAnimatedIcon Icon for the bot in TGS format for the official iOS app; may be null.
         * @param iosSideMenuIcon Icon for the bot in PNG format for the official iOS app side menu; may be null.
         * @param androidIcon Icon for the bot in TGS format for the official Android app; may be null.
         * @param androidSideMenuIcon Icon for the bot in SVG format for the official Android app side menu; may be null.
         * @param macosIcon Icon for the bot in TGS format for the official native macOS app; may be null.
         * @param macosSideMenuIcon Icon for the bot in PNG format for the official macOS app side menu; may be null.
         * @param iconColor Color to highlight selected icon of the bot if appropriate; may be null.
         * @param webAppPlaceholder Default placeholder for opened Web Apps in SVG format; may be null.
         */
        public AttachmentMenuBot(long botUserId, boolean supportsSelfChat, boolean supportsUserChats, boolean supportsBotChats, boolean supportsGroupChats, boolean supportsChannelChats, boolean requestWriteAccess, boolean isAdded, boolean showInAttachmentMenu, boolean showInSideMenu, boolean showDisclaimerInSideMenu, String name, AttachmentMenuBotColor nameColor, File defaultIcon, File iosStaticIcon, File iosAnimatedIcon, File iosSideMenuIcon, File androidIcon, File androidSideMenuIcon, File macosIcon, File macosSideMenuIcon, AttachmentMenuBotColor iconColor, File webAppPlaceholder) {
            this.botUserId = botUserId;
            this.supportsSelfChat = supportsSelfChat;
            this.supportsUserChats = supportsUserChats;
            this.supportsBotChats = supportsBotChats;
            this.supportsGroupChats = supportsGroupChats;
            this.supportsChannelChats = supportsChannelChats;
            this.requestWriteAccess = requestWriteAccess;
            this.isAdded = isAdded;
            this.showInAttachmentMenu = showInAttachmentMenu;
            this.showInSideMenu = showInSideMenu;
            this.showDisclaimerInSideMenu = showDisclaimerInSideMenu;
            this.name = name;
            this.nameColor = nameColor;
            this.defaultIcon = defaultIcon;
            this.iosStaticIcon = iosStaticIcon;
            this.iosAnimatedIcon = iosAnimatedIcon;
            this.iosSideMenuIcon = iosSideMenuIcon;
            this.androidIcon = androidIcon;
            this.androidSideMenuIcon = androidSideMenuIcon;
            this.macosIcon = macosIcon;
            this.macosSideMenuIcon = macosSideMenuIcon;
            this.iconColor = iconColor;
            this.webAppPlaceholder = webAppPlaceholder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1183966273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a color to highlight a bot added to attachment menu.
     */
    public static class AttachmentMenuBotColor extends Object {
        /**
         * Color in the RGB24 format for light themes.
         */
        public int lightColor;
        /**
         * Color in the RGB24 format for dark themes.
         */
        public int darkColor;

        /**
         * Describes a color to highlight a bot added to attachment menu.
         */
        public AttachmentMenuBotColor() {
        }

        /**
         * Describes a color to highlight a bot added to attachment menu.
         *
         * @param lightColor Color in the RGB24 format for light themes.
         * @param darkColor Color in the RGB24 format for dark themes.
         */
        public AttachmentMenuBotColor(int lightColor, int darkColor) {
            this.lightColor = lightColor;
            this.darkColor = darkColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1680039612;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an audio file. Audio is usually in MP3 or M4A format.
     */
    public static class Audio extends Object {
        /**
         * Duration of the audio, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * Title of the audio; as defined by the sender.
         */
        public String title;
        /**
         * Performer of the audio; as defined by the sender.
         */
        public String performer;
        /**
         * Original name of the file; as defined by the sender.
         */
        public String fileName;
        /**
         * The MIME type of the file; as defined by the sender.
         */
        public String mimeType;
        /**
         * The minithumbnail of the album cover; may be null.
         */
        @Nullable public Minithumbnail albumCoverMinithumbnail;
        /**
         * The thumbnail of the album cover in JPEG format; as defined by the sender. The full size thumbnail is supposed to be extracted from the downloaded audio file; may be null.
         */
        @Nullable public Thumbnail albumCoverThumbnail;
        /**
         * Album cover variants to use if the downloaded audio file contains no album cover. Provided thumbnail dimensions are approximate.
         */
        public Thumbnail[] externalAlbumCovers;
        /**
         * File containing the audio.
         */
        public File audio;

        /**
         * Describes an audio file. Audio is usually in MP3 or M4A format.
         */
        public Audio() {
        }

        /**
         * Describes an audio file. Audio is usually in MP3 or M4A format.
         *
         * @param duration Duration of the audio, in seconds; as defined by the sender.
         * @param title Title of the audio; as defined by the sender.
         * @param performer Performer of the audio; as defined by the sender.
         * @param fileName Original name of the file; as defined by the sender.
         * @param mimeType The MIME type of the file; as defined by the sender.
         * @param albumCoverMinithumbnail The minithumbnail of the album cover; may be null.
         * @param albumCoverThumbnail The thumbnail of the album cover in JPEG format; as defined by the sender. The full size thumbnail is supposed to be extracted from the downloaded audio file; may be null.
         * @param externalAlbumCovers Album cover variants to use if the downloaded audio file contains no album cover. Provided thumbnail dimensions are approximate.
         * @param audio File containing the audio.
         */
        public Audio(int duration, String title, String performer, String fileName, String mimeType, Minithumbnail albumCoverMinithumbnail, Thumbnail albumCoverThumbnail, Thumbnail[] externalAlbumCovers, File audio) {
            this.duration = duration;
            this.title = title;
            this.performer = performer;
            this.fileName = fileName;
            this.mimeType = mimeType;
            this.albumCoverMinithumbnail = albumCoverMinithumbnail;
            this.albumCoverThumbnail = albumCoverThumbnail;
            this.externalAlbumCovers = externalAlbumCovers;
            this.audio = audio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -166398841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the authentication code that was sent.
     */
    public static class AuthenticationCodeInfo extends Object {
        /**
         * A phone number that is being authenticated.
         */
        public String phoneNumber;
        /**
         * The way the code was sent to the user.
         */
        public AuthenticationCodeType type;
        /**
         * The way the next code will be sent to the user; may be null.
         */
        @Nullable public AuthenticationCodeType nextType;
        /**
         * Timeout before the code can be re-sent, in seconds.
         */
        public int timeout;

        /**
         * Information about the authentication code that was sent.
         */
        public AuthenticationCodeInfo() {
        }

        /**
         * Information about the authentication code that was sent.
         *
         * @param phoneNumber A phone number that is being authenticated.
         * @param type The way the code was sent to the user.
         * @param nextType The way the next code will be sent to the user; may be null.
         * @param timeout Timeout before the code can be re-sent, in seconds.
         */
        public AuthenticationCodeInfo(String phoneNumber, AuthenticationCodeType type, AuthenticationCodeType nextType, int timeout) {
            this.phoneNumber = phoneNumber;
            this.type = type;
            this.nextType = nextType;
            this.timeout = timeout;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -860345416;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Provides information about the method by which an authentication code is delivered to the user.
     */
    public abstract static class AuthenticationCodeType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AuthenticationCodeTypeTelegramMessage.CONSTRUCTOR,
            AuthenticationCodeTypeSms.CONSTRUCTOR,
            AuthenticationCodeTypeSmsWord.CONSTRUCTOR,
            AuthenticationCodeTypeSmsPhrase.CONSTRUCTOR,
            AuthenticationCodeTypeCall.CONSTRUCTOR,
            AuthenticationCodeTypeFlashCall.CONSTRUCTOR,
            AuthenticationCodeTypeMissedCall.CONSTRUCTOR,
            AuthenticationCodeTypeFragment.CONSTRUCTOR,
            AuthenticationCodeTypeFirebaseAndroid.CONSTRUCTOR,
            AuthenticationCodeTypeFirebaseIos.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AuthenticationCodeType() {
        }
    }

    /**
     * A digit-only authentication code is delivered via a private Telegram message, which can be viewed from another active session.
     */
    public static class AuthenticationCodeTypeTelegramMessage extends AuthenticationCodeType {
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via a private Telegram message, which can be viewed from another active session.
         */
        public AuthenticationCodeTypeTelegramMessage() {
        }

        /**
         * A digit-only authentication code is delivered via a private Telegram message, which can be viewed from another active session.
         *
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeTelegramMessage(int length) {
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2079628074;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
     */
    public static class AuthenticationCodeTypeSms extends AuthenticationCodeType {
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         */
        public AuthenticationCodeTypeSms() {
        }

        /**
         * A digit-only authentication code is delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         *
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeSms(int length) {
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 962650760;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication code is a word delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
     */
    public static class AuthenticationCodeTypeSmsWord extends AuthenticationCodeType {
        /**
         * The first letters of the word if known.
         */
        public String firstLetter;

        /**
         * An authentication code is a word delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         */
        public AuthenticationCodeTypeSmsWord() {
        }

        /**
         * An authentication code is a word delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         *
         * @param firstLetter The first letters of the word if known.
         */
        public AuthenticationCodeTypeSmsWord(String firstLetter) {
            this.firstLetter = firstLetter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1509540765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication code is a phrase from multiple words delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
     */
    public static class AuthenticationCodeTypeSmsPhrase extends AuthenticationCodeType {
        /**
         * The first word of the phrase if known.
         */
        public String firstWord;

        /**
         * An authentication code is a phrase from multiple words delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         */
        public AuthenticationCodeTypeSmsPhrase() {
        }

        /**
         * An authentication code is a phrase from multiple words delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         *
         * @param firstWord The first word of the phrase if known.
         */
        public AuthenticationCodeTypeSmsPhrase(String firstWord) {
            this.firstWord = firstWord;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 784108753;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered via a phone call to the specified phone number.
     */
    public static class AuthenticationCodeTypeCall extends AuthenticationCodeType {
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via a phone call to the specified phone number.
         */
        public AuthenticationCodeTypeCall() {
        }

        /**
         * A digit-only authentication code is delivered via a phone call to the specified phone number.
         *
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeCall(int length) {
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1636265063;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication code is delivered by an immediately canceled call to the specified phone number. The phone number that calls is the code that must be entered automatically.
     */
    public static class AuthenticationCodeTypeFlashCall extends AuthenticationCodeType {
        /**
         * Pattern of the phone number from which the call will be made.
         */
        public String pattern;

        /**
         * An authentication code is delivered by an immediately canceled call to the specified phone number. The phone number that calls is the code that must be entered automatically.
         */
        public AuthenticationCodeTypeFlashCall() {
        }

        /**
         * An authentication code is delivered by an immediately canceled call to the specified phone number. The phone number that calls is the code that must be entered automatically.
         *
         * @param pattern Pattern of the phone number from which the call will be made.
         */
        public AuthenticationCodeTypeFlashCall(String pattern) {
            this.pattern = pattern;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395882402;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication code is delivered by an immediately canceled call to the specified phone number. The last digits of the phone number that calls are the code that must be entered manually by the user.
     */
    public static class AuthenticationCodeTypeMissedCall extends AuthenticationCodeType {
        /**
         * Prefix of the phone number from which the call will be made.
         */
        public String phoneNumberPrefix;
        /**
         * Number of digits in the code, excluding the prefix.
         */
        public int length;

        /**
         * An authentication code is delivered by an immediately canceled call to the specified phone number. The last digits of the phone number that calls are the code that must be entered manually by the user.
         */
        public AuthenticationCodeTypeMissedCall() {
        }

        /**
         * An authentication code is delivered by an immediately canceled call to the specified phone number. The last digits of the phone number that calls are the code that must be entered manually by the user.
         *
         * @param phoneNumberPrefix Prefix of the phone number from which the call will be made.
         * @param length Number of digits in the code, excluding the prefix.
         */
        public AuthenticationCodeTypeMissedCall(String phoneNumberPrefix, int length) {
            this.phoneNumberPrefix = phoneNumberPrefix;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 700123783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered to https://fragment.com. The user must be logged in there via a wallet owning the phone number's NFT.
     */
    public static class AuthenticationCodeTypeFragment extends AuthenticationCodeType {
        /**
         * URL to open to receive the code.
         */
        public String url;
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered to https://fragment.com. The user must be logged in there via a wallet owning the phone number's NFT.
         */
        public AuthenticationCodeTypeFragment() {
        }

        /**
         * A digit-only authentication code is delivered to https://fragment.com. The user must be logged in there via a wallet owning the phone number's NFT.
         *
         * @param url URL to open to receive the code.
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeFragment(String url, int length) {
            this.url = url;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2129693491;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered via Firebase Authentication to the official Android application.
     */
    public static class AuthenticationCodeTypeFirebaseAndroid extends AuthenticationCodeType {
        /**
         * Parameters to be used for device verification.
         */
        public FirebaseDeviceVerificationParameters deviceVerificationParameters;
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via Firebase Authentication to the official Android application.
         */
        public AuthenticationCodeTypeFirebaseAndroid() {
        }

        /**
         * A digit-only authentication code is delivered via Firebase Authentication to the official Android application.
         *
         * @param deviceVerificationParameters Parameters to be used for device verification.
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeFirebaseAndroid(FirebaseDeviceVerificationParameters deviceVerificationParameters, int length) {
            this.deviceVerificationParameters = deviceVerificationParameters;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1872475422;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered via Firebase Authentication to the official iOS application.
     */
    public static class AuthenticationCodeTypeFirebaseIos extends AuthenticationCodeType {
        /**
         * Receipt of successful application token validation to compare with receipt from push notification.
         */
        public String receipt;
        /**
         * Time after the next authentication method is supposed to be used if verification push notification isn't received, in seconds.
         */
        public int pushTimeout;
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via Firebase Authentication to the official iOS application.
         */
        public AuthenticationCodeTypeFirebaseIos() {
        }

        /**
         * A digit-only authentication code is delivered via Firebase Authentication to the official iOS application.
         *
         * @param receipt Receipt of successful application token validation to compare with receipt from push notification.
         * @param pushTimeout Time after the next authentication method is supposed to be used if verification push notification isn't received, in seconds.
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeFirebaseIos(String receipt, int pushTimeout, int length) {
            this.receipt = receipt;
            this.pushTimeout = pushTimeout;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -11162989;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the current authorization state of the TDLib client.
     */
    public abstract static class AuthorizationState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AuthorizationStateWaitTdlibParameters.CONSTRUCTOR,
            AuthorizationStateWaitPhoneNumber.CONSTRUCTOR,
            AuthorizationStateWaitEmailAddress.CONSTRUCTOR,
            AuthorizationStateWaitEmailCode.CONSTRUCTOR,
            AuthorizationStateWaitCode.CONSTRUCTOR,
            AuthorizationStateWaitOtherDeviceConfirmation.CONSTRUCTOR,
            AuthorizationStateWaitRegistration.CONSTRUCTOR,
            AuthorizationStateWaitPassword.CONSTRUCTOR,
            AuthorizationStateReady.CONSTRUCTOR,
            AuthorizationStateLoggingOut.CONSTRUCTOR,
            AuthorizationStateClosing.CONSTRUCTOR,
            AuthorizationStateClosed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AuthorizationState() {
        }
    }

    /**
     * Initialization parameters are needed. Call setTdlibParameters to provide them.
     */
    public static class AuthorizationStateWaitTdlibParameters extends AuthorizationState {

        /**
         * Initialization parameters are needed. Call setTdlibParameters to provide them.
         */
        public AuthorizationStateWaitTdlibParameters() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 904720988;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib needs the user's phone number to authorize. Call setAuthenticationPhoneNumber to provide the phone number, or use requestQrCodeAuthentication or checkAuthenticationBotToken for other authentication options.
     */
    public static class AuthorizationStateWaitPhoneNumber extends AuthorizationState {

        /**
         * TDLib needs the user's phone number to authorize. Call setAuthenticationPhoneNumber to provide the phone number, or use requestQrCodeAuthentication or checkAuthenticationBotToken for other authentication options.
         */
        public AuthorizationStateWaitPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 306402531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib needs the user's email address to authorize. Call setAuthenticationEmailAddress to provide the email address, or directly call checkAuthenticationEmailCode with Apple ID/Google ID token if allowed.
     */
    public static class AuthorizationStateWaitEmailAddress extends AuthorizationState {
        /**
         * True, if authorization through Apple ID is allowed.
         */
        public boolean allowAppleId;
        /**
         * True, if authorization through Google ID is allowed.
         */
        public boolean allowGoogleId;

        /**
         * TDLib needs the user's email address to authorize. Call setAuthenticationEmailAddress to provide the email address, or directly call checkAuthenticationEmailCode with Apple ID/Google ID token if allowed.
         */
        public AuthorizationStateWaitEmailAddress() {
        }

        /**
         * TDLib needs the user's email address to authorize. Call setAuthenticationEmailAddress to provide the email address, or directly call checkAuthenticationEmailCode with Apple ID/Google ID token if allowed.
         *
         * @param allowAppleId True, if authorization through Apple ID is allowed.
         * @param allowGoogleId True, if authorization through Google ID is allowed.
         */
        public AuthorizationStateWaitEmailAddress(boolean allowAppleId, boolean allowGoogleId) {
            this.allowAppleId = allowAppleId;
            this.allowGoogleId = allowGoogleId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1040478663;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib needs the user's authentication code sent to an email address to authorize. Call checkAuthenticationEmailCode to provide the code.
     */
    public static class AuthorizationStateWaitEmailCode extends AuthorizationState {
        /**
         * True, if authorization through Apple ID is allowed.
         */
        public boolean allowAppleId;
        /**
         * True, if authorization through Google ID is allowed.
         */
        public boolean allowGoogleId;
        /**
         * Information about the sent authentication code.
         */
        public EmailAddressAuthenticationCodeInfo codeInfo;
        /**
         * Reset state of the email address; may be null if the email address can't be reset.
         */
        @Nullable public EmailAddressResetState emailAddressResetState;

        /**
         * TDLib needs the user's authentication code sent to an email address to authorize. Call checkAuthenticationEmailCode to provide the code.
         */
        public AuthorizationStateWaitEmailCode() {
        }

        /**
         * TDLib needs the user's authentication code sent to an email address to authorize. Call checkAuthenticationEmailCode to provide the code.
         *
         * @param allowAppleId True, if authorization through Apple ID is allowed.
         * @param allowGoogleId True, if authorization through Google ID is allowed.
         * @param codeInfo Information about the sent authentication code.
         * @param emailAddressResetState Reset state of the email address; may be null if the email address can't be reset.
         */
        public AuthorizationStateWaitEmailCode(boolean allowAppleId, boolean allowGoogleId, EmailAddressAuthenticationCodeInfo codeInfo, EmailAddressResetState emailAddressResetState) {
            this.allowAppleId = allowAppleId;
            this.allowGoogleId = allowGoogleId;
            this.codeInfo = codeInfo;
            this.emailAddressResetState = emailAddressResetState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1868627365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib needs the user's authentication code to authorize. Call checkAuthenticationCode to check the code.
     */
    public static class AuthorizationStateWaitCode extends AuthorizationState {
        /**
         * Information about the authorization code that was sent.
         */
        public AuthenticationCodeInfo codeInfo;

        /**
         * TDLib needs the user's authentication code to authorize. Call checkAuthenticationCode to check the code.
         */
        public AuthorizationStateWaitCode() {
        }

        /**
         * TDLib needs the user's authentication code to authorize. Call checkAuthenticationCode to check the code.
         *
         * @param codeInfo Information about the authorization code that was sent.
         */
        public AuthorizationStateWaitCode(AuthenticationCodeInfo codeInfo) {
            this.codeInfo = codeInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 52643073;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user needs to confirm authorization on another logged in device by scanning a QR code with the provided link.
     */
    public static class AuthorizationStateWaitOtherDeviceConfirmation extends AuthorizationState {
        /**
         * A tg:// URL for the QR code. The link will be updated frequently.
         */
        public String link;

        /**
         * The user needs to confirm authorization on another logged in device by scanning a QR code with the provided link.
         */
        public AuthorizationStateWaitOtherDeviceConfirmation() {
        }

        /**
         * The user needs to confirm authorization on another logged in device by scanning a QR code with the provided link.
         *
         * @param link A tg:// URL for the QR code. The link will be updated frequently.
         */
        public AuthorizationStateWaitOtherDeviceConfirmation(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 860166378;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is unregistered and need to accept terms of service and enter their first name and last name to finish registration. Call registerUser to accept the terms of service and provide the data.
     */
    public static class AuthorizationStateWaitRegistration extends AuthorizationState {
        /**
         * Telegram terms of service.
         */
        public TermsOfService termsOfService;

        /**
         * The user is unregistered and need to accept terms of service and enter their first name and last name to finish registration. Call registerUser to accept the terms of service and provide the data.
         */
        public AuthorizationStateWaitRegistration() {
        }

        /**
         * The user is unregistered and need to accept terms of service and enter their first name and last name to finish registration. Call registerUser to accept the terms of service and provide the data.
         *
         * @param termsOfService Telegram terms of service.
         */
        public AuthorizationStateWaitRegistration(TermsOfService termsOfService) {
            this.termsOfService = termsOfService;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 550350511;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has been authorized, but needs to enter a 2-step verification password to start using the application. Call checkAuthenticationPassword to provide the password, or requestAuthenticationPasswordRecovery to recover the password, or deleteAccount to delete the account after a week.
     */
    public static class AuthorizationStateWaitPassword extends AuthorizationState {
        /**
         * Hint for the password; may be empty.
         */
        public String passwordHint;
        /**
         * True, if a recovery email address has been set up.
         */
        public boolean hasRecoveryEmailAddress;
        /**
         * True, if some Telegram Passport elements were saved.
         */
        public boolean hasPassportData;
        /**
         * Pattern of the email address to which the recovery email was sent; empty until a recovery email has been sent.
         */
        public String recoveryEmailAddressPattern;

        /**
         * The user has been authorized, but needs to enter a 2-step verification password to start using the application. Call checkAuthenticationPassword to provide the password, or requestAuthenticationPasswordRecovery to recover the password, or deleteAccount to delete the account after a week.
         */
        public AuthorizationStateWaitPassword() {
        }

        /**
         * The user has been authorized, but needs to enter a 2-step verification password to start using the application. Call checkAuthenticationPassword to provide the password, or requestAuthenticationPasswordRecovery to recover the password, or deleteAccount to delete the account after a week.
         *
         * @param passwordHint Hint for the password; may be empty.
         * @param hasRecoveryEmailAddress True, if a recovery email address has been set up.
         * @param hasPassportData True, if some Telegram Passport elements were saved.
         * @param recoveryEmailAddressPattern Pattern of the email address to which the recovery email was sent; empty until a recovery email has been sent.
         */
        public AuthorizationStateWaitPassword(String passwordHint, boolean hasRecoveryEmailAddress, boolean hasPassportData, String recoveryEmailAddressPattern) {
            this.passwordHint = passwordHint;
            this.hasRecoveryEmailAddress = hasRecoveryEmailAddress;
            this.hasPassportData = hasPassportData;
            this.recoveryEmailAddressPattern = recoveryEmailAddressPattern;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 112238030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has been successfully authorized. TDLib is now ready to answer general requests.
     */
    public static class AuthorizationStateReady extends AuthorizationState {

        /**
         * The user has been successfully authorized. TDLib is now ready to answer general requests.
         */
        public AuthorizationStateReady() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1834871737;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is currently logging out.
     */
    public static class AuthorizationStateLoggingOut extends AuthorizationState {

        /**
         * The user is currently logging out.
         */
        public AuthorizationStateLoggingOut() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 154449270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib is closing, all subsequent queries will be answered with the error 500. Note that closing TDLib can take a while. All resources will be freed only after authorizationStateClosed has been received.
     */
    public static class AuthorizationStateClosing extends AuthorizationState {

        /**
         * TDLib is closing, all subsequent queries will be answered with the error 500. Note that closing TDLib can take a while. All resources will be freed only after authorizationStateClosed has been received.
         */
        public AuthorizationStateClosing() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 445855311;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib client is in its final state. All databases are closed and all resources are released. No other updates will be received after this. All queries will be responded to with error code 500. To continue working, one must create a new instance of the TDLib client.
     */
    public static class AuthorizationStateClosed extends AuthorizationState {

        /**
         * TDLib client is in its final state. All databases are closed and all resources are released. No other updates will be received after this. All queries will be responded to with error code 500. To continue working, one must create a new instance of the TDLib client.
         */
        public AuthorizationStateClosed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1526047584;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains auto-download settings.
     */
    public static class AutoDownloadSettings extends Object {
        /**
         * True, if the auto-download is enabled.
         */
        public boolean isAutoDownloadEnabled;
        /**
         * The maximum size of a photo file to be auto-downloaded, in bytes.
         */
        public int maxPhotoFileSize;
        /**
         * The maximum size of a video file to be auto-downloaded, in bytes.
         */
        public long maxVideoFileSize;
        /**
         * The maximum size of other file types to be auto-downloaded, in bytes.
         */
        public long maxOtherFileSize;
        /**
         * The maximum suggested bitrate for uploaded videos, in kbit/s.
         */
        public int videoUploadBitrate;
        /**
         * True, if the beginning of video files needs to be preloaded for instant playback.
         */
        public boolean preloadLargeVideos;
        /**
         * True, if the next audio track needs to be preloaded while the user is listening to an audio file.
         */
        public boolean preloadNextAudio;
        /**
         * True, if stories needs to be preloaded.
         */
        public boolean preloadStories;
        /**
         * True, if &quot;use less data for calls&quot; option needs to be enabled.
         */
        public boolean useLessDataForCalls;

        /**
         * Contains auto-download settings.
         */
        public AutoDownloadSettings() {
        }

        /**
         * Contains auto-download settings.
         *
         * @param isAutoDownloadEnabled True, if the auto-download is enabled.
         * @param maxPhotoFileSize The maximum size of a photo file to be auto-downloaded, in bytes.
         * @param maxVideoFileSize The maximum size of a video file to be auto-downloaded, in bytes.
         * @param maxOtherFileSize The maximum size of other file types to be auto-downloaded, in bytes.
         * @param videoUploadBitrate The maximum suggested bitrate for uploaded videos, in kbit/s.
         * @param preloadLargeVideos True, if the beginning of video files needs to be preloaded for instant playback.
         * @param preloadNextAudio True, if the next audio track needs to be preloaded while the user is listening to an audio file.
         * @param preloadStories True, if stories needs to be preloaded.
         * @param useLessDataForCalls True, if &quot;use less data for calls&quot; option needs to be enabled.
         */
        public AutoDownloadSettings(boolean isAutoDownloadEnabled, int maxPhotoFileSize, long maxVideoFileSize, long maxOtherFileSize, int videoUploadBitrate, boolean preloadLargeVideos, boolean preloadNextAudio, boolean preloadStories, boolean useLessDataForCalls) {
            this.isAutoDownloadEnabled = isAutoDownloadEnabled;
            this.maxPhotoFileSize = maxPhotoFileSize;
            this.maxVideoFileSize = maxVideoFileSize;
            this.maxOtherFileSize = maxOtherFileSize;
            this.videoUploadBitrate = videoUploadBitrate;
            this.preloadLargeVideos = preloadLargeVideos;
            this.preloadNextAudio = preloadNextAudio;
            this.preloadStories = preloadStories;
            this.useLessDataForCalls = useLessDataForCalls;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 991433696;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains auto-download settings presets for the current user.
     */
    public static class AutoDownloadSettingsPresets extends Object {
        /**
         * Preset with lowest settings; supposed to be used by default when roaming.
         */
        public AutoDownloadSettings low;
        /**
         * Preset with medium settings; supposed to be used by default when using mobile data.
         */
        public AutoDownloadSettings medium;
        /**
         * Preset with highest settings; supposed to be used by default when connected on Wi-Fi.
         */
        public AutoDownloadSettings high;

        /**
         * Contains auto-download settings presets for the current user.
         */
        public AutoDownloadSettingsPresets() {
        }

        /**
         * Contains auto-download settings presets for the current user.
         *
         * @param low Preset with lowest settings; supposed to be used by default when roaming.
         * @param medium Preset with medium settings; supposed to be used by default when using mobile data.
         * @param high Preset with highest settings; supposed to be used by default when connected on Wi-Fi.
         */
        public AutoDownloadSettingsPresets(AutoDownloadSettings low, AutoDownloadSettings medium, AutoDownloadSettings high) {
            this.low = low;
            this.medium = medium;
            this.high = high;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -782099166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes autosave settings.
     */
    public static class AutosaveSettings extends Object {
        /**
         * Default autosave settings for private chats.
         */
        public ScopeAutosaveSettings privateChatSettings;
        /**
         * Default autosave settings for basic group and supergroup chats.
         */
        public ScopeAutosaveSettings groupSettings;
        /**
         * Default autosave settings for channel chats.
         */
        public ScopeAutosaveSettings channelSettings;
        /**
         * Autosave settings for specific chats.
         */
        public AutosaveSettingsException[] exceptions;

        /**
         * Describes autosave settings.
         */
        public AutosaveSettings() {
        }

        /**
         * Describes autosave settings.
         *
         * @param privateChatSettings Default autosave settings for private chats.
         * @param groupSettings Default autosave settings for basic group and supergroup chats.
         * @param channelSettings Default autosave settings for channel chats.
         * @param exceptions Autosave settings for specific chats.
         */
        public AutosaveSettings(ScopeAutosaveSettings privateChatSettings, ScopeAutosaveSettings groupSettings, ScopeAutosaveSettings channelSettings, AutosaveSettingsException[] exceptions) {
            this.privateChatSettings = privateChatSettings;
            this.groupSettings = groupSettings;
            this.channelSettings = channelSettings;
            this.exceptions = exceptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1629412502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains autosave settings for a chat, which overrides default settings for the corresponding scope.
     */
    public static class AutosaveSettingsException extends Object {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Autosave settings for the chat.
         */
        public ScopeAutosaveSettings settings;

        /**
         * Contains autosave settings for a chat, which overrides default settings for the corresponding scope.
         */
        public AutosaveSettingsException() {
        }

        /**
         * Contains autosave settings for a chat, which overrides default settings for the corresponding scope.
         *
         * @param chatId Chat identifier.
         * @param settings Autosave settings for the chat.
         */
        public AutosaveSettingsException(long chatId, ScopeAutosaveSettings settings) {
            this.chatId = chatId;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1483470280;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes scope of autosave settings.
     */
    public abstract static class AutosaveSettingsScope extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AutosaveSettingsScopePrivateChats.CONSTRUCTOR,
            AutosaveSettingsScopeGroupChats.CONSTRUCTOR,
            AutosaveSettingsScopeChannelChats.CONSTRUCTOR,
            AutosaveSettingsScopeChat.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AutosaveSettingsScope() {
        }
    }

    /**
     * Autosave settings applied to all private chats without chat-specific settings.
     */
    public static class AutosaveSettingsScopePrivateChats extends AutosaveSettingsScope {

        /**
         * Autosave settings applied to all private chats without chat-specific settings.
         */
        public AutosaveSettingsScopePrivateChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395227007;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Autosave settings applied to all basic group and supergroup chats without chat-specific settings.
     */
    public static class AutosaveSettingsScopeGroupChats extends AutosaveSettingsScope {

        /**
         * Autosave settings applied to all basic group and supergroup chats without chat-specific settings.
         */
        public AutosaveSettingsScopeGroupChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 853544526;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Autosave settings applied to all channel chats without chat-specific settings.
     */
    public static class AutosaveSettingsScopeChannelChats extends AutosaveSettingsScope {

        /**
         * Autosave settings applied to all channel chats without chat-specific settings.
         */
        public AutosaveSettingsScopeChannelChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -499572783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Autosave settings applied to a chat.
     */
    public static class AutosaveSettingsScopeChat extends AutosaveSettingsScope {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Autosave settings applied to a chat.
         */
        public AutosaveSettingsScopeChat() {
        }

        /**
         * Autosave settings applied to a chat.
         *
         * @param chatId Chat identifier.
         */
        public AutosaveSettingsScopeChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1632255255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an available reaction.
     */
    public static class AvailableReaction extends Object {
        /**
         * Type of the reaction.
         */
        public ReactionType type;
        /**
         * True, if Telegram Premium is needed to send the reaction.
         */
        public boolean needsPremium;

        /**
         * Represents an available reaction.
         */
        public AvailableReaction() {
        }

        /**
         * Represents an available reaction.
         *
         * @param type Type of the reaction.
         * @param needsPremium True, if Telegram Premium is needed to send the reaction.
         */
        public AvailableReaction(ReactionType type, boolean needsPremium) {
            this.type = type;
            this.needsPremium = needsPremium;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -117292153;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of reactions that can be added to a message.
     */
    public static class AvailableReactions extends Object {
        /**
         * List of reactions to be shown at the top.
         */
        public AvailableReaction[] topReactions;
        /**
         * List of recently used reactions.
         */
        public AvailableReaction[] recentReactions;
        /**
         * List of popular reactions.
         */
        public AvailableReaction[] popularReactions;
        /**
         * True, if any custom emoji reaction can be added by Telegram Premium subscribers.
         */
        public boolean allowCustomEmoji;
        /**
         * True, if the reactions will be tags and the message can be found by them.
         */
        public boolean areTags;
        /**
         * The reason why the current user can't add reactions to the message, despite some other users can; may be null if none.
         */
        @Nullable public ReactionUnavailabilityReason unavailabilityReason;

        /**
         * Represents a list of reactions that can be added to a message.
         */
        public AvailableReactions() {
        }

        /**
         * Represents a list of reactions that can be added to a message.
         *
         * @param topReactions List of reactions to be shown at the top.
         * @param recentReactions List of recently used reactions.
         * @param popularReactions List of popular reactions.
         * @param allowCustomEmoji True, if any custom emoji reaction can be added by Telegram Premium subscribers.
         * @param areTags True, if the reactions will be tags and the message can be found by them.
         * @param unavailabilityReason The reason why the current user can't add reactions to the message, despite some other users can; may be null if none.
         */
        public AvailableReactions(AvailableReaction[] topReactions, AvailableReaction[] recentReactions, AvailableReaction[] popularReactions, boolean allowCustomEmoji, boolean areTags, ReactionUnavailabilityReason unavailabilityReason) {
            this.topReactions = topReactions;
            this.recentReactions = recentReactions;
            this.popularReactions = popularReactions;
            this.allowCustomEmoji = allowCustomEmoji;
            this.areTags = areTags;
            this.unavailabilityReason = unavailabilityReason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 912529522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat background.
     */
    public static class Background extends Object {
        /**
         * Unique background identifier.
         */
        public long id;
        /**
         * True, if this is one of default backgrounds.
         */
        public boolean isDefault;
        /**
         * True, if the background is dark and is recommended to be used with dark theme.
         */
        public boolean isDark;
        /**
         * Unique background name.
         */
        public String name;
        /**
         * Document with the background; may be null. Null only for filled and chat theme backgrounds.
         */
        @Nullable public Document document;
        /**
         * Type of the background.
         */
        public BackgroundType type;

        /**
         * Describes a chat background.
         */
        public Background() {
        }

        /**
         * Describes a chat background.
         *
         * @param id Unique background identifier.
         * @param isDefault True, if this is one of default backgrounds.
         * @param isDark True, if the background is dark and is recommended to be used with dark theme.
         * @param name Unique background name.
         * @param document Document with the background; may be null. Null only for filled and chat theme backgrounds.
         * @param type Type of the background.
         */
        public Background(long id, boolean isDefault, boolean isDark, String name, Document document, BackgroundType type) {
            this.id = id;
            this.isDefault = isDefault;
            this.isDark = isDark;
            this.name = name;
            this.document = document;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -429971172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a fill of a background.
     */
    public abstract static class BackgroundFill extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BackgroundFillSolid.CONSTRUCTOR,
            BackgroundFillGradient.CONSTRUCTOR,
            BackgroundFillFreeformGradient.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BackgroundFill() {
        }
    }

    /**
     * Describes a solid fill of a background.
     */
    public static class BackgroundFillSolid extends BackgroundFill {
        /**
         * A color of the background in the RGB24 format.
         */
        public int color;

        /**
         * Describes a solid fill of a background.
         */
        public BackgroundFillSolid() {
        }

        /**
         * Describes a solid fill of a background.
         *
         * @param color A color of the background in the RGB24 format.
         */
        public BackgroundFillSolid(int color) {
            this.color = color;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1010678813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a gradient fill of a background.
     */
    public static class BackgroundFillGradient extends BackgroundFill {
        /**
         * A top color of the background in the RGB24 format.
         */
        public int topColor;
        /**
         * A bottom color of the background in the RGB24 format.
         */
        public int bottomColor;
        /**
         * Clockwise rotation angle of the gradient, in degrees; 0-359. Must always be divisible by 45.
         */
        public int rotationAngle;

        /**
         * Describes a gradient fill of a background.
         */
        public BackgroundFillGradient() {
        }

        /**
         * Describes a gradient fill of a background.
         *
         * @param topColor A top color of the background in the RGB24 format.
         * @param bottomColor A bottom color of the background in the RGB24 format.
         * @param rotationAngle Clockwise rotation angle of the gradient, in degrees; 0-359. Must always be divisible by 45.
         */
        public BackgroundFillGradient(int topColor, int bottomColor, int rotationAngle) {
            this.topColor = topColor;
            this.bottomColor = bottomColor;
            this.rotationAngle = rotationAngle;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1839206017;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a freeform gradient fill of a background.
     */
    public static class BackgroundFillFreeformGradient extends BackgroundFill {
        /**
         * A list of 3 or 4 colors of the freeform gradient in the RGB24 format.
         */
        public int[] colors;

        /**
         * Describes a freeform gradient fill of a background.
         */
        public BackgroundFillFreeformGradient() {
        }

        /**
         * Describes a freeform gradient fill of a background.
         *
         * @param colors A list of 3 or 4 colors of the freeform gradient in the RGB24 format.
         */
        public BackgroundFillFreeformGradient(int[] colors) {
            this.colors = colors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1145469255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of background.
     */
    public abstract static class BackgroundType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BackgroundTypeWallpaper.CONSTRUCTOR,
            BackgroundTypePattern.CONSTRUCTOR,
            BackgroundTypeFill.CONSTRUCTOR,
            BackgroundTypeChatTheme.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BackgroundType() {
        }
    }

    /**
     * A wallpaper in JPEG format.
     */
    public static class BackgroundTypeWallpaper extends BackgroundType {
        /**
         * True, if the wallpaper must be downscaled to fit in 450x450 square and then box-blurred with radius 12.
         */
        public boolean isBlurred;
        /**
         * True, if the background needs to be slightly moved when device is tilted.
         */
        public boolean isMoving;

        /**
         * A wallpaper in JPEG format.
         */
        public BackgroundTypeWallpaper() {
        }

        /**
         * A wallpaper in JPEG format.
         *
         * @param isBlurred True, if the wallpaper must be downscaled to fit in 450x450 square and then box-blurred with radius 12.
         * @param isMoving True, if the background needs to be slightly moved when device is tilted.
         */
        public BackgroundTypeWallpaper(boolean isBlurred, boolean isMoving) {
            this.isBlurred = isBlurred;
            this.isMoving = isMoving;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1972128891;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A PNG or TGV (gzipped subset of SVG with MIME type &quot;application/x-tgwallpattern&quot;) pattern to be combined with the background fill chosen by the user.
     */
    public static class BackgroundTypePattern extends BackgroundType {
        /**
         * Fill of the background.
         */
        public BackgroundFill fill;
        /**
         * Intensity of the pattern when it is shown above the filled background; 0-100.
         */
        public int intensity;
        /**
         * True, if the background fill must be applied only to the pattern itself. All other pixels are black in this case. For dark themes only.
         */
        public boolean isInverted;
        /**
         * True, if the background needs to be slightly moved when device is tilted.
         */
        public boolean isMoving;

        /**
         * A PNG or TGV (gzipped subset of SVG with MIME type &quot;application/x-tgwallpattern&quot;) pattern to be combined with the background fill chosen by the user.
         */
        public BackgroundTypePattern() {
        }

        /**
         * A PNG or TGV (gzipped subset of SVG with MIME type &quot;application/x-tgwallpattern&quot;) pattern to be combined with the background fill chosen by the user.
         *
         * @param fill Fill of the background.
         * @param intensity Intensity of the pattern when it is shown above the filled background; 0-100.
         * @param isInverted True, if the background fill must be applied only to the pattern itself. All other pixels are black in this case. For dark themes only.
         * @param isMoving True, if the background needs to be slightly moved when device is tilted.
         */
        public BackgroundTypePattern(BackgroundFill fill, int intensity, boolean isInverted, boolean isMoving) {
            this.fill = fill;
            this.intensity = intensity;
            this.isInverted = isInverted;
            this.isMoving = isMoving;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1290213117;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A filled background.
     */
    public static class BackgroundTypeFill extends BackgroundType {
        /**
         * The background fill.
         */
        public BackgroundFill fill;

        /**
         * A filled background.
         */
        public BackgroundTypeFill() {
        }

        /**
         * A filled background.
         *
         * @param fill The background fill.
         */
        public BackgroundTypeFill(BackgroundFill fill) {
            this.fill = fill;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 993008684;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A background from a chat theme; can be used only as a chat background in channels.
     */
    public static class BackgroundTypeChatTheme extends BackgroundType {
        /**
         * Name of the chat theme.
         */
        public String themeName;

        /**
         * A background from a chat theme; can be used only as a chat background in channels.
         */
        public BackgroundTypeChatTheme() {
        }

        /**
         * A background from a chat theme; can be used only as a chat background in channels.
         *
         * @param themeName Name of the chat theme.
         */
        public BackgroundTypeChatTheme(String themeName) {
            this.themeName = themeName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1299879762;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of backgrounds.
     */
    public static class Backgrounds extends Object {
        /**
         * A list of backgrounds.
         */
        public Background[] backgrounds;

        /**
         * Contains a list of backgrounds.
         */
        public Backgrounds() {
        }

        /**
         * Contains a list of backgrounds.
         *
         * @param backgrounds A list of backgrounds.
         */
        public Backgrounds(Background[] backgrounds) {
            this.backgrounds = backgrounds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 724728704;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an action associated with a bank card number.
     */
    public static class BankCardActionOpenUrl extends Object {
        /**
         * Action text.
         */
        public String text;
        /**
         * The URL to be opened.
         */
        public String url;

        /**
         * Describes an action associated with a bank card number.
         */
        public BankCardActionOpenUrl() {
        }

        /**
         * Describes an action associated with a bank card number.
         *
         * @param text Action text.
         * @param url The URL to be opened.
         */
        public BankCardActionOpenUrl(String text, String url) {
            this.text = text;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -196454267;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a bank card.
     */
    public static class BankCardInfo extends Object {
        /**
         * Title of the bank card description.
         */
        public String title;
        /**
         * Actions that can be done with the bank card number.
         */
        public BankCardActionOpenUrl[] actions;

        /**
         * Information about a bank card.
         */
        public BankCardInfo() {
        }

        /**
         * Information about a bank card.
         *
         * @param title Title of the bank card description.
         * @param actions Actions that can be done with the bank card number.
         */
        public BankCardInfo(String title, BankCardActionOpenUrl[] actions) {
            this.title = title;
            this.actions = actions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2116647730;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users).
     */
    public static class BasicGroup extends Object {
        /**
         * Group identifier.
         */
        public long id;
        /**
         * Number of members in the group.
         */
        public int memberCount;
        /**
         * Status of the current user in the group.
         */
        public ChatMemberStatus status;
        /**
         * True, if the group is active.
         */
        public boolean isActive;
        /**
         * Identifier of the supergroup to which this group was upgraded; 0 if none.
         */
        public long upgradedToSupergroupId;

        /**
         * Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users).
         */
        public BasicGroup() {
        }

        /**
         * Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users).
         *
         * @param id Group identifier.
         * @param memberCount Number of members in the group.
         * @param status Status of the current user in the group.
         * @param isActive True, if the group is active.
         * @param upgradedToSupergroupId Identifier of the supergroup to which this group was upgraded; 0 if none.
         */
        public BasicGroup(long id, int memberCount, ChatMemberStatus status, boolean isActive, long upgradedToSupergroupId) {
            this.id = id;
            this.memberCount = memberCount;
            this.status = status;
            this.isActive = isActive;
            this.upgradedToSupergroupId = upgradedToSupergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -194767217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains full information about a basic group.
     */
    public static class BasicGroupFullInfo extends Object {
        /**
         * Chat photo; may be null if empty or unknown. If non-null, then it is the same photo as in chat.photo.
         */
        @Nullable public ChatPhoto photo;
        /**
         * Group description. Updated only after the basic group is opened.
         */
        public String description;
        /**
         * User identifier of the creator of the group; 0 if unknown.
         */
        public long creatorUserId;
        /**
         * Group members.
         */
        public ChatMember[] members;
        /**
         * True, if non-administrators and non-bots can be hidden in responses to getSupergroupMembers and searchChatMembers for non-administrators after upgrading the basic group to a supergroup.
         */
        public boolean canHideMembers;
        /**
         * True, if aggressive anti-spam checks can be enabled or disabled in the supergroup after upgrading the basic group to a supergroup.
         */
        public boolean canToggleAggressiveAntiSpam;
        /**
         * Primary invite link for this group; may be null. For chat administrators with canInviteUsers right only. Updated only after the basic group is opened.
         */
        @Nullable public ChatInviteLink inviteLink;
        /**
         * List of commands of bots in the group.
         */
        public BotCommands[] botCommands;

        /**
         * Contains full information about a basic group.
         */
        public BasicGroupFullInfo() {
        }

        /**
         * Contains full information about a basic group.
         *
         * @param photo Chat photo; may be null if empty or unknown. If non-null, then it is the same photo as in chat.photo.
         * @param description Group description. Updated only after the basic group is opened.
         * @param creatorUserId User identifier of the creator of the group; 0 if unknown.
         * @param members Group members.
         * @param canHideMembers True, if non-administrators and non-bots can be hidden in responses to getSupergroupMembers and searchChatMembers for non-administrators after upgrading the basic group to a supergroup.
         * @param canToggleAggressiveAntiSpam True, if aggressive anti-spam checks can be enabled or disabled in the supergroup after upgrading the basic group to a supergroup.
         * @param inviteLink Primary invite link for this group; may be null. For chat administrators with canInviteUsers right only. Updated only after the basic group is opened.
         * @param botCommands List of commands of bots in the group.
         */
        public BasicGroupFullInfo(ChatPhoto photo, String description, long creatorUserId, ChatMember[] members, boolean canHideMembers, boolean canToggleAggressiveAntiSpam, ChatInviteLink inviteLink, BotCommands[] botCommands) {
            this.photo = photo;
            this.description = description;
            this.creatorUserId = creatorUserId;
            this.members = members;
            this.canHideMembers = canHideMembers;
            this.canToggleAggressiveAntiSpam = canToggleAggressiveAntiSpam;
            this.inviteLink = inviteLink;
            this.botCommands = botCommands;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1879035520;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a birthdate of a user.
     */
    public static class Birthdate extends Object {
        /**
         * Day of the month; 1-31.
         */
        public int day;
        /**
         * Month of the year; 1-12.
         */
        public int month;
        /**
         * Birth year; 0 if unknown.
         */
        public int year;

        /**
         * Represents a birthdate of a user.
         */
        public Birthdate() {
        }

        /**
         * Represents a birthdate of a user.
         *
         * @param day Day of the month; 1-31.
         * @param month Month of the year; 1-12.
         * @param year Birth year; 0 if unknown.
         */
        public Birthdate(int day, int month, int year) {
            this.day = day;
            this.month = month;
            this.year = year;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1644064030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of block list.
     */
    public abstract static class BlockList extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BlockListMain.CONSTRUCTOR,
            BlockListStories.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BlockList() {
        }
    }

    /**
     * The main block list that disallows writing messages to the current user, receiving their status and photo, viewing of stories, and some other actions.
     */
    public static class BlockListMain extends BlockList {

        /**
         * The main block list that disallows writing messages to the current user, receiving their status and photo, viewing of stories, and some other actions.
         */
        public BlockListMain() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1352930172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The block list that disallows viewing of stories of the current user.
     */
    public static class BlockListStories extends BlockList {

        /**
         * The block list that disallows viewing of stories of the current user.
         */
        public BlockListStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 103323228;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a command supported by a bot.
     */
    public static class BotCommand extends Object {
        /**
         * Text of the bot command.
         */
        public String command;
        /**
         * Description of the bot command.
         */
        public String description;

        /**
         * Represents a command supported by a bot.
         */
        public BotCommand() {
        }

        /**
         * Represents a command supported by a bot.
         *
         * @param command Text of the bot command.
         * @param description Description of the bot command.
         */
        public BotCommand(String command, String description) {
            this.command = command;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1032140601;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the scope to which bot commands are relevant.
     */
    public abstract static class BotCommandScope extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BotCommandScopeDefault.CONSTRUCTOR,
            BotCommandScopeAllPrivateChats.CONSTRUCTOR,
            BotCommandScopeAllGroupChats.CONSTRUCTOR,
            BotCommandScopeAllChatAdministrators.CONSTRUCTOR,
            BotCommandScopeChat.CONSTRUCTOR,
            BotCommandScopeChatAdministrators.CONSTRUCTOR,
            BotCommandScopeChatMember.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BotCommandScope() {
        }
    }

    /**
     * A scope covering all users.
     */
    public static class BotCommandScopeDefault extends BotCommandScope {

        /**
         * A scope covering all users.
         */
        public BotCommandScopeDefault() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 795652779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all private chats.
     */
    public static class BotCommandScopeAllPrivateChats extends BotCommandScope {

        /**
         * A scope covering all private chats.
         */
        public BotCommandScopeAllPrivateChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -344889543;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all group and supergroup chats.
     */
    public static class BotCommandScopeAllGroupChats extends BotCommandScope {

        /**
         * A scope covering all group and supergroup chats.
         */
        public BotCommandScopeAllGroupChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -981088162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all group and supergroup chat administrators.
     */
    public static class BotCommandScopeAllChatAdministrators extends BotCommandScope {

        /**
         * A scope covering all group and supergroup chat administrators.
         */
        public BotCommandScopeAllChatAdministrators() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1998329169;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all members of a chat.
     */
    public static class BotCommandScopeChat extends BotCommandScope {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * A scope covering all members of a chat.
         */
        public BotCommandScopeChat() {
        }

        /**
         * A scope covering all members of a chat.
         *
         * @param chatId Chat identifier.
         */
        public BotCommandScopeChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -430234971;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all administrators of a chat.
     */
    public static class BotCommandScopeChatAdministrators extends BotCommandScope {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * A scope covering all administrators of a chat.
         */
        public BotCommandScopeChatAdministrators() {
        }

        /**
         * A scope covering all administrators of a chat.
         *
         * @param chatId Chat identifier.
         */
        public BotCommandScopeChatAdministrators(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119682126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering a member of a chat.
     */
    public static class BotCommandScopeChatMember extends BotCommandScope {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * User identifier.
         */
        public long userId;

        /**
         * A scope covering a member of a chat.
         */
        public BotCommandScopeChatMember() {
        }

        /**
         * A scope covering a member of a chat.
         *
         * @param chatId Chat identifier.
         * @param userId User identifier.
         */
        public BotCommandScopeChatMember(long chatId, long userId) {
            this.chatId = chatId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -211380494;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of bot commands.
     */
    public static class BotCommands extends Object {
        /**
         * Bot's user identifier.
         */
        public long botUserId;
        /**
         * List of bot commands.
         */
        public BotCommand[] commands;

        /**
         * Contains a list of bot commands.
         */
        public BotCommands() {
        }

        /**
         * Contains a list of bot commands.
         *
         * @param botUserId Bot's user identifier.
         * @param commands List of bot commands.
         */
        public BotCommands(long botUserId, BotCommand[] commands) {
            this.botUserId = botUserId;
            this.commands = commands;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1741364468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a bot.
     */
    public static class BotInfo extends Object {
        /**
         * The text that is shown on the bot's profile page and is sent together with the link when users share the bot.
         */
        public String shortDescription;
        /**
         * The text shown in the chat with the bot if the chat is empty.
         */
        public String description;
        /**
         * Photo shown in the chat with the bot if the chat is empty; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Animation shown in the chat with the bot if the chat is empty; may be null.
         */
        @Nullable public Animation animation;
        /**
         * Information about a button to show instead of the bot commands menu button; may be null if ordinary bot commands menu must be shown.
         */
        @Nullable public BotMenuButton menuButton;
        /**
         * List of the bot commands.
         */
        public BotCommand[] commands;
        /**
         * Default administrator rights for adding the bot to basic group and supergroup chats; may be null.
         */
        @Nullable public ChatAdministratorRights defaultGroupAdministratorRights;
        /**
         * Default administrator rights for adding the bot to channels; may be null.
         */
        @Nullable public ChatAdministratorRights defaultChannelAdministratorRights;
        /**
         * The internal link, which can be used to edit bot commands; may be null.
         */
        @Nullable public InternalLinkType editCommandsLink;
        /**
         * The internal link, which can be used to edit bot description; may be null.
         */
        @Nullable public InternalLinkType editDescriptionLink;
        /**
         * The internal link, which can be used to edit the photo or animation shown in the chat with the bot if the chat is empty; may be null.
         */
        @Nullable public InternalLinkType editDescriptionMediaLink;
        /**
         * The internal link, which can be used to edit bot settings; may be null.
         */
        @Nullable public InternalLinkType editSettingsLink;

        /**
         * Contains information about a bot.
         */
        public BotInfo() {
        }

        /**
         * Contains information about a bot.
         *
         * @param shortDescription The text that is shown on the bot's profile page and is sent together with the link when users share the bot.
         * @param description The text shown in the chat with the bot if the chat is empty.
         * @param photo Photo shown in the chat with the bot if the chat is empty; may be null.
         * @param animation Animation shown in the chat with the bot if the chat is empty; may be null.
         * @param menuButton Information about a button to show instead of the bot commands menu button; may be null if ordinary bot commands menu must be shown.
         * @param commands List of the bot commands.
         * @param defaultGroupAdministratorRights Default administrator rights for adding the bot to basic group and supergroup chats; may be null.
         * @param defaultChannelAdministratorRights Default administrator rights for adding the bot to channels; may be null.
         * @param editCommandsLink The internal link, which can be used to edit bot commands; may be null.
         * @param editDescriptionLink The internal link, which can be used to edit bot description; may be null.
         * @param editDescriptionMediaLink The internal link, which can be used to edit the photo or animation shown in the chat with the bot if the chat is empty; may be null.
         * @param editSettingsLink The internal link, which can be used to edit bot settings; may be null.
         */
        public BotInfo(String shortDescription, String description, Photo photo, Animation animation, BotMenuButton menuButton, BotCommand[] commands, ChatAdministratorRights defaultGroupAdministratorRights, ChatAdministratorRights defaultChannelAdministratorRights, InternalLinkType editCommandsLink, InternalLinkType editDescriptionLink, InternalLinkType editDescriptionMediaLink, InternalLinkType editSettingsLink) {
            this.shortDescription = shortDescription;
            this.description = description;
            this.photo = photo;
            this.animation = animation;
            this.menuButton = menuButton;
            this.commands = commands;
            this.defaultGroupAdministratorRights = defaultGroupAdministratorRights;
            this.defaultChannelAdministratorRights = defaultChannelAdministratorRights;
            this.editCommandsLink = editCommandsLink;
            this.editDescriptionLink = editDescriptionLink;
            this.editDescriptionMediaLink = editDescriptionMediaLink;
            this.editSettingsLink = editSettingsLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1472546735;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a button to be shown instead of bot commands menu button.
     */
    public static class BotMenuButton extends Object {
        /**
         * Text of the button.
         */
        public String text;
        /**
         * URL of a Web App to open when the button is pressed. If the link is of the type internalLinkTypeWebApp, then it must be processed accordingly. Otherwise, the link must be passed to openWebApp.
         */
        public String url;

        /**
         * Describes a button to be shown instead of bot commands menu button.
         */
        public BotMenuButton() {
        }

        /**
         * Describes a button to be shown instead of bot commands menu button.
         *
         * @param text Text of the button.
         * @param url URL of a Web App to open when the button is pressed. If the link is of the type internalLinkTypeWebApp, then it must be processed accordingly. Otherwise, the link must be passed to openWebApp.
         */
        public BotMenuButton(String text, String url) {
            this.text = text;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -944407322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a reason why a bot was allowed to write messages to the current user.
     */
    public abstract static class BotWriteAccessAllowReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BotWriteAccessAllowReasonConnectedWebsite.CONSTRUCTOR,
            BotWriteAccessAllowReasonAddedToAttachmentMenu.CONSTRUCTOR,
            BotWriteAccessAllowReasonLaunchedWebApp.CONSTRUCTOR,
            BotWriteAccessAllowReasonAcceptedRequest.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BotWriteAccessAllowReason() {
        }
    }

    /**
     * The user connected a website by logging in using Telegram Login Widget on it.
     */
    public static class BotWriteAccessAllowReasonConnectedWebsite extends BotWriteAccessAllowReason {
        /**
         * Domain name of the connected website.
         */
        public String domainName;

        /**
         * The user connected a website by logging in using Telegram Login Widget on it.
         */
        public BotWriteAccessAllowReasonConnectedWebsite() {
        }

        /**
         * The user connected a website by logging in using Telegram Login Widget on it.
         *
         * @param domainName Domain name of the connected website.
         */
        public BotWriteAccessAllowReasonConnectedWebsite(String domainName) {
            this.domainName = domainName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2016325603;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user added the bot to attachment or side menu using toggleBotIsAddedToAttachmentMenu.
     */
    public static class BotWriteAccessAllowReasonAddedToAttachmentMenu extends BotWriteAccessAllowReason {

        /**
         * The user added the bot to attachment or side menu using toggleBotIsAddedToAttachmentMenu.
         */
        public BotWriteAccessAllowReasonAddedToAttachmentMenu() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2104795235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user launched a Web App using getWebAppLinkUrl.
     */
    public static class BotWriteAccessAllowReasonLaunchedWebApp extends BotWriteAccessAllowReason {
        /**
         * Information about the Web App.
         */
        public WebApp webApp;

        /**
         * The user launched a Web App using getWebAppLinkUrl.
         */
        public BotWriteAccessAllowReasonLaunchedWebApp() {
        }

        /**
         * The user launched a Web App using getWebAppLinkUrl.
         *
         * @param webApp Information about the Web App.
         */
        public BotWriteAccessAllowReasonLaunchedWebApp(WebApp webApp) {
            this.webApp = webApp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -240843561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user accepted bot's request to send messages with allowBotToSendMessages.
     */
    public static class BotWriteAccessAllowReasonAcceptedRequest extends BotWriteAccessAllowReason {

        /**
         * The user accepted bot's request to send messages with allowBotToSendMessages.
         */
        public BotWriteAccessAllowReasonAcceptedRequest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1983497220;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes conditions for sending of away messages by a Telegram Business account.
     */
    public abstract static class BusinessAwayMessageSchedule extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BusinessAwayMessageScheduleAlways.CONSTRUCTOR,
            BusinessAwayMessageScheduleOutsideOfOpeningHours.CONSTRUCTOR,
            BusinessAwayMessageScheduleCustom.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BusinessAwayMessageSchedule() {
        }
    }

    /**
     * Send away messages always.
     */
    public static class BusinessAwayMessageScheduleAlways extends BusinessAwayMessageSchedule {

        /**
         * Send away messages always.
         */
        public BusinessAwayMessageScheduleAlways() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -910564679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Send away messages outside of the business opening hours.
     */
    public static class BusinessAwayMessageScheduleOutsideOfOpeningHours extends BusinessAwayMessageSchedule {

        /**
         * Send away messages outside of the business opening hours.
         */
        public BusinessAwayMessageScheduleOutsideOfOpeningHours() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -968630506;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Send away messages only in the specified time span.
     */
    public static class BusinessAwayMessageScheduleCustom extends BusinessAwayMessageSchedule {
        /**
         * Point in time (Unix timestamp) when the away messages will start to be sent.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the away messages will stop to be sent.
         */
        public int endDate;

        /**
         * Send away messages only in the specified time span.
         */
        public BusinessAwayMessageScheduleCustom() {
        }

        /**
         * Send away messages only in the specified time span.
         *
         * @param startDate Point in time (Unix timestamp) when the away messages will start to be sent.
         * @param endDate Point in time (Unix timestamp) when the away messages will stop to be sent.
         */
        public BusinessAwayMessageScheduleCustom(int startDate, int endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1967108654;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes settings for messages that are automatically sent by a Telegram Business account when it is away.
     */
    public static class BusinessAwayMessageSettings extends Object {
        /**
         * Unique quick reply shortcut identifier for the away messages.
         */
        public int shortcutId;
        /**
         * Chosen recipients of the away messages.
         */
        public BusinessRecipients recipients;
        /**
         * Settings used to check whether the current user is away.
         */
        public BusinessAwayMessageSchedule schedule;
        /**
         * True, if the messages must not be sent if the account was online in the last 10 minutes.
         */
        public boolean offlineOnly;

        /**
         * Describes settings for messages that are automatically sent by a Telegram Business account when it is away.
         */
        public BusinessAwayMessageSettings() {
        }

        /**
         * Describes settings for messages that are automatically sent by a Telegram Business account when it is away.
         *
         * @param shortcutId Unique quick reply shortcut identifier for the away messages.
         * @param recipients Chosen recipients of the away messages.
         * @param schedule Settings used to check whether the current user is away.
         * @param offlineOnly True, if the messages must not be sent if the account was online in the last 10 minutes.
         */
        public BusinessAwayMessageSettings(int shortcutId, BusinessRecipients recipients, BusinessAwayMessageSchedule schedule, boolean offlineOnly) {
            this.shortcutId = shortcutId;
            this.recipients = recipients;
            this.schedule = schedule;
            this.offlineOnly = offlineOnly;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 353084137;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a business bot that manages the chat.
     */
    public static class BusinessBotManageBar extends Object {
        /**
         * User identifier of the bot.
         */
        public long botUserId;
        /**
         * URL to be opened to manage the bot.
         */
        public String manageUrl;
        /**
         * True, if the bot is paused. Use toggleBusinessConnectedBotChatIsPaused to change the value of the field.
         */
        public boolean isBotPaused;
        /**
         * True, if the bot can reply.
         */
        public boolean canBotReply;

        /**
         * Contains information about a business bot that manages the chat.
         */
        public BusinessBotManageBar() {
        }

        /**
         * Contains information about a business bot that manages the chat.
         *
         * @param botUserId User identifier of the bot.
         * @param manageUrl URL to be opened to manage the bot.
         * @param isBotPaused True, if the bot is paused. Use toggleBusinessConnectedBotChatIsPaused to change the value of the field.
         * @param canBotReply True, if the bot can reply.
         */
        public BusinessBotManageBar(long botUserId, String manageUrl, boolean isBotPaused, boolean canBotReply) {
            this.botUserId = botUserId;
            this.manageUrl = manageUrl;
            this.isBotPaused = isBotPaused;
            this.canBotReply = canBotReply;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -311399806;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a business chat link.
     */
    public static class BusinessChatLink extends Object {
        /**
         * The HTTPS link.
         */
        public String link;
        /**
         * Message draft text that will be added to the input field.
         */
        public FormattedText text;
        /**
         * Link title.
         */
        public String title;
        /**
         * Number of times the link was used.
         */
        public int viewCount;

        /**
         * Contains information about a business chat link.
         */
        public BusinessChatLink() {
        }

        /**
         * Contains information about a business chat link.
         *
         * @param link The HTTPS link.
         * @param text Message draft text that will be added to the input field.
         * @param title Link title.
         * @param viewCount Number of times the link was used.
         */
        public BusinessChatLink(String link, FormattedText text, String title, int viewCount) {
            this.link = link;
            this.text = text;
            this.title = title;
            this.viewCount = viewCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1902539901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a business chat link.
     */
    public static class BusinessChatLinkInfo extends Object {
        /**
         * Identifier of the private chat that created the link.
         */
        public long chatId;
        /**
         * Message draft text that must be added to the input field.
         */
        public FormattedText text;

        /**
         * Contains information about a business chat link.
         */
        public BusinessChatLinkInfo() {
        }

        /**
         * Contains information about a business chat link.
         *
         * @param chatId Identifier of the private chat that created the link.
         * @param text Message draft text that must be added to the input field.
         */
        public BusinessChatLinkInfo(long chatId, FormattedText text) {
            this.chatId = chatId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -864865105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of business chat links created by the user.
     */
    public static class BusinessChatLinks extends Object {
        /**
         * List of links.
         */
        public BusinessChatLink[] links;

        /**
         * Contains a list of business chat links created by the user.
         */
        public BusinessChatLinks() {
        }

        /**
         * Contains a list of business chat links created by the user.
         *
         * @param links List of links.
         */
        public BusinessChatLinks(BusinessChatLink[] links) {
            this.links = links;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 79067036;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a bot connected to a business account.
     */
    public static class BusinessConnectedBot extends Object {
        /**
         * User identifier of the bot.
         */
        public long botUserId;
        /**
         * Private chats that will be accessible to the bot.
         */
        public BusinessRecipients recipients;
        /**
         * True, if the bot can send messages to the private chats; false otherwise.
         */
        public boolean canReply;

        /**
         * Describes a bot connected to a business account.
         */
        public BusinessConnectedBot() {
        }

        /**
         * Describes a bot connected to a business account.
         *
         * @param botUserId User identifier of the bot.
         * @param recipients Private chats that will be accessible to the bot.
         * @param canReply True, if the bot can send messages to the private chats; false otherwise.
         */
        public BusinessConnectedBot(long botUserId, BusinessRecipients recipients, boolean canReply) {
            this.botUserId = botUserId;
            this.recipients = recipients;
            this.canReply = canReply;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -330241321;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a connection of the bot with a business account.
     */
    public static class BusinessConnection extends Object {
        /**
         * Unique identifier of the connection.
         */
        public String id;
        /**
         * Identifier of the business user that created the connection.
         */
        public long userId;
        /**
         * Chat identifier of the private chat with the user.
         */
        public long userChatId;
        /**
         * Point in time (Unix timestamp) when the connection was established.
         */
        public int date;
        /**
         * True, if the bot can send messages to the connected user; false otherwise.
         */
        public boolean canReply;
        /**
         * True, if the connection is enabled; false otherwise.
         */
        public boolean isEnabled;

        /**
         * Describes a connection of the bot with a business account.
         */
        public BusinessConnection() {
        }

        /**
         * Describes a connection of the bot with a business account.
         *
         * @param id Unique identifier of the connection.
         * @param userId Identifier of the business user that created the connection.
         * @param userChatId Chat identifier of the private chat with the user.
         * @param date Point in time (Unix timestamp) when the connection was established.
         * @param canReply True, if the bot can send messages to the connected user; false otherwise.
         * @param isEnabled True, if the connection is enabled; false otherwise.
         */
        public BusinessConnection(String id, long userId, long userChatId, int date, boolean canReply, boolean isEnabled) {
            this.id = id;
            this.userId = userId;
            this.userChatId = userChatId;
            this.date = date;
            this.canReply = canReply;
            this.isEnabled = isEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1144447540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a feature available to Business user accounts.
     */
    public abstract static class BusinessFeature extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BusinessFeatureLocation.CONSTRUCTOR,
            BusinessFeatureOpeningHours.CONSTRUCTOR,
            BusinessFeatureQuickReplies.CONSTRUCTOR,
            BusinessFeatureGreetingMessage.CONSTRUCTOR,
            BusinessFeatureAwayMessage.CONSTRUCTOR,
            BusinessFeatureAccountLinks.CONSTRUCTOR,
            BusinessFeatureStartPage.CONSTRUCTOR,
            BusinessFeatureBots.CONSTRUCTOR,
            BusinessFeatureEmojiStatus.CONSTRUCTOR,
            BusinessFeatureChatFolderTags.CONSTRUCTOR,
            BusinessFeatureUpgradedStories.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BusinessFeature() {
        }
    }

    /**
     * The ability to set location.
     */
    public static class BusinessFeatureLocation extends BusinessFeature {

        /**
         * The ability to set location.
         */
        public BusinessFeatureLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1064304004;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set opening hours.
     */
    public static class BusinessFeatureOpeningHours extends BusinessFeature {

        /**
         * The ability to set opening hours.
         */
        public BusinessFeatureOpeningHours() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 461054701;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use quick replies.
     */
    public static class BusinessFeatureQuickReplies extends BusinessFeature {

        /**
         * The ability to use quick replies.
         */
        public BusinessFeatureQuickReplies() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1674048894;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set up a greeting message.
     */
    public static class BusinessFeatureGreetingMessage extends BusinessFeature {

        /**
         * The ability to set up a greeting message.
         */
        public BusinessFeatureGreetingMessage() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1789424756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set up an away message.
     */
    public static class BusinessFeatureAwayMessage extends BusinessFeature {

        /**
         * The ability to set up an away message.
         */
        public BusinessFeatureAwayMessage() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1090119901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to create links to the business account with predefined message text.
     */
    public static class BusinessFeatureAccountLinks extends BusinessFeature {

        /**
         * The ability to create links to the business account with predefined message text.
         */
        public BusinessFeatureAccountLinks() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1878693646;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to customize start page.
     */
    public static class BusinessFeatureStartPage extends BusinessFeature {

        /**
         * The ability to customize start page.
         */
        public BusinessFeatureStartPage() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 401471457;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to connect a bot to the account.
     */
    public static class BusinessFeatureBots extends BusinessFeature {

        /**
         * The ability to connect a bot to the account.
         */
        public BusinessFeatureBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 275084773;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to show an emoji status along with the business name.
     */
    public static class BusinessFeatureEmojiStatus extends BusinessFeature {

        /**
         * The ability to show an emoji status along with the business name.
         */
        public BusinessFeatureEmojiStatus() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -846282523;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to display folder names for each chat in the chat list.
     */
    public static class BusinessFeatureChatFolderTags extends BusinessFeature {

        /**
         * The ability to display folder names for each chat in the chat list.
         */
        public BusinessFeatureChatFolderTags() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -543880918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use many additional features for stories.
     */
    public static class BusinessFeatureUpgradedStories extends BusinessFeature {

        /**
         * Allowed to use many additional features for stories.
         */
        public BusinessFeatureUpgradedStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1812245550;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a promotion animation for a Business feature.
     */
    public static class BusinessFeaturePromotionAnimation extends Object {
        /**
         * Business feature.
         */
        public BusinessFeature feature;
        /**
         * Promotion animation for the feature.
         */
        public Animation animation;

        /**
         * Describes a promotion animation for a Business feature.
         */
        public BusinessFeaturePromotionAnimation() {
        }

        /**
         * Describes a promotion animation for a Business feature.
         *
         * @param feature Business feature.
         * @param animation Promotion animation for the feature.
         */
        public BusinessFeaturePromotionAnimation(BusinessFeature feature, Animation animation) {
            this.feature = feature;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2047174666;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about features, available to Business user accounts.
     */
    public static class BusinessFeatures extends Object {
        /**
         * The list of available business features.
         */
        public BusinessFeature[] features;

        /**
         * Contains information about features, available to Business user accounts.
         */
        public BusinessFeatures() {
        }

        /**
         * Contains information about features, available to Business user accounts.
         *
         * @param features The list of available business features.
         */
        public BusinessFeatures(BusinessFeature[] features) {
            this.features = features;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1532468184;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes settings for greeting messages that are automatically sent by a Telegram Business account as response to incoming messages in an inactive private chat.
     */
    public static class BusinessGreetingMessageSettings extends Object {
        /**
         * Unique quick reply shortcut identifier for the greeting messages.
         */
        public int shortcutId;
        /**
         * Chosen recipients of the greeting messages.
         */
        public BusinessRecipients recipients;
        /**
         * The number of days after which a chat will be considered as inactive; currently, must be on of 7, 14, 21, or 28.
         */
        public int inactivityDays;

        /**
         * Describes settings for greeting messages that are automatically sent by a Telegram Business account as response to incoming messages in an inactive private chat.
         */
        public BusinessGreetingMessageSettings() {
        }

        /**
         * Describes settings for greeting messages that are automatically sent by a Telegram Business account as response to incoming messages in an inactive private chat.
         *
         * @param shortcutId Unique quick reply shortcut identifier for the greeting messages.
         * @param recipients Chosen recipients of the greeting messages.
         * @param inactivityDays The number of days after which a chat will be considered as inactive; currently, must be on of 7, 14, 21, or 28.
         */
        public BusinessGreetingMessageSettings(int shortcutId, BusinessRecipients recipients, int inactivityDays) {
            this.shortcutId = shortcutId;
            this.recipients = recipients;
            this.inactivityDays = inactivityDays;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1689140754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Business account.
     */
    public static class BusinessInfo extends Object {
        /**
         * Location of the business; may be null if none.
         */
        @Nullable public BusinessLocation location;
        /**
         * Opening hours of the business; may be null if none. The hours are guaranteed to be valid and has already been split by week days.
         */
        @Nullable public BusinessOpeningHours openingHours;
        /**
         * Opening hours of the business in the local time; may be null if none. The hours are guaranteed to be valid and has already been split by week days. Local time zone identifier will be empty. An updateUserFullInfo update is not triggered when value of this field changes.
         */
        @Nullable public BusinessOpeningHours localOpeningHours;
        /**
         * Time left before the business will open the next time, in seconds; 0 if unknown. An updateUserFullInfo update is not triggered when value of this field changes.
         */
        public int nextOpenIn;
        /**
         * Time left before the business will close the next time, in seconds; 0 if unknown. An updateUserFullInfo update is not triggered when value of this field changes.
         */
        public int nextCloseIn;
        /**
         * The greeting message; may be null if none or the Business account is not of the current user.
         */
        @Nullable public BusinessGreetingMessageSettings greetingMessageSettings;
        /**
         * The away message; may be null if none or the Business account is not of the current user.
         */
        @Nullable public BusinessAwayMessageSettings awayMessageSettings;
        /**
         * Information about start page of the account; may be null if none.
         */
        @Nullable public BusinessStartPage startPage;

        /**
         * Contains information about a Telegram Business account.
         */
        public BusinessInfo() {
        }

        /**
         * Contains information about a Telegram Business account.
         *
         * @param location Location of the business; may be null if none.
         * @param openingHours Opening hours of the business; may be null if none. The hours are guaranteed to be valid and has already been split by week days.
         * @param localOpeningHours Opening hours of the business in the local time; may be null if none. The hours are guaranteed to be valid and has already been split by week days. Local time zone identifier will be empty. An updateUserFullInfo update is not triggered when value of this field changes.
         * @param nextOpenIn Time left before the business will open the next time, in seconds; 0 if unknown. An updateUserFullInfo update is not triggered when value of this field changes.
         * @param nextCloseIn Time left before the business will close the next time, in seconds; 0 if unknown. An updateUserFullInfo update is not triggered when value of this field changes.
         * @param greetingMessageSettings The greeting message; may be null if none or the Business account is not of the current user.
         * @param awayMessageSettings The away message; may be null if none or the Business account is not of the current user.
         * @param startPage Information about start page of the account; may be null if none.
         */
        public BusinessInfo(BusinessLocation location, BusinessOpeningHours openingHours, BusinessOpeningHours localOpeningHours, int nextOpenIn, int nextCloseIn, BusinessGreetingMessageSettings greetingMessageSettings, BusinessAwayMessageSettings awayMessageSettings, BusinessStartPage startPage) {
            this.location = location;
            this.openingHours = openingHours;
            this.localOpeningHours = localOpeningHours;
            this.nextOpenIn = nextOpenIn;
            this.nextCloseIn = nextCloseIn;
            this.greetingMessageSettings = greetingMessageSettings;
            this.awayMessageSettings = awayMessageSettings;
            this.startPage = startPage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1428179342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a location of a business.
     */
    public static class BusinessLocation extends Object {
        /**
         * The location; may be null if not specified.
         */
        @Nullable public Location location;
        /**
         * Location address; 1-96 characters.
         */
        public String address;

        /**
         * Represents a location of a business.
         */
        public BusinessLocation() {
        }

        /**
         * Represents a location of a business.
         *
         * @param location The location; may be null if not specified.
         * @param address Location address; 1-96 characters.
         */
        public BusinessLocation(Location location, String address) {
            this.location = location;
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1084969126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a message from a business account as received by a bot.
     */
    public static class BusinessMessage extends Object {
        /**
         * The message.
         */
        public Message message;
        /**
         * Message that is replied by the message in the same chat; may be null if none.
         */
        @Nullable public Message replyToMessage;

        /**
         * Describes a message from a business account as received by a bot.
         */
        public BusinessMessage() {
        }

        /**
         * Describes a message from a business account as received by a bot.
         *
         * @param message The message.
         * @param replyToMessage Message that is replied by the message in the same chat; may be null if none.
         */
        public BusinessMessage(Message message, Message replyToMessage) {
            this.message = message;
            this.replyToMessage = replyToMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -94353850;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages from a business account as received by a bot.
     */
    public static class BusinessMessages extends Object {
        /**
         * List of business messages.
         */
        public BusinessMessage[] messages;

        /**
         * Contains a list of messages from a business account as received by a bot.
         */
        public BusinessMessages() {
        }

        /**
         * Contains a list of messages from a business account as received by a bot.
         *
         * @param messages List of business messages.
         */
        public BusinessMessages(BusinessMessage[] messages) {
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -764562473;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes opening hours of a business.
     */
    public static class BusinessOpeningHours extends Object {
        /**
         * Unique time zone identifier.
         */
        public String timeZoneId;
        /**
         * Intervals of the time when the business is open.
         */
        public BusinessOpeningHoursInterval[] openingHours;

        /**
         * Describes opening hours of a business.
         */
        public BusinessOpeningHours() {
        }

        /**
         * Describes opening hours of a business.
         *
         * @param timeZoneId Unique time zone identifier.
         * @param openingHours Intervals of the time when the business is open.
         */
        public BusinessOpeningHours(String timeZoneId, BusinessOpeningHoursInterval[] openingHours) {
            this.timeZoneId = timeZoneId;
            this.openingHours = openingHours;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 816603700;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an interval of time when the business is open.
     */
    public static class BusinessOpeningHoursInterval extends Object {
        /**
         * The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0-7*24*60.
         */
        public int startMinute;
        /**
         * The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 1-8*24*60.
         */
        public int endMinute;

        /**
         * Describes an interval of time when the business is open.
         */
        public BusinessOpeningHoursInterval() {
        }

        /**
         * Describes an interval of time when the business is open.
         *
         * @param startMinute The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0-7*24*60.
         * @param endMinute The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 1-8*24*60.
         */
        public BusinessOpeningHoursInterval(int startMinute, int endMinute) {
            this.startMinute = startMinute;
            this.endMinute = endMinute;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1108322732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes private chats chosen for automatic interaction with a business.
     */
    public static class BusinessRecipients extends Object {
        /**
         * Identifiers of selected private chats.
         */
        public long[] chatIds;
        /**
         * Identifiers of private chats that are always excluded; for businessConnectedBot only.
         */
        public long[] excludedChatIds;
        /**
         * True, if all existing private chats are selected.
         */
        public boolean selectExistingChats;
        /**
         * True, if all new private chats are selected.
         */
        public boolean selectNewChats;
        /**
         * True, if all private chats with contacts are selected.
         */
        public boolean selectContacts;
        /**
         * True, if all private chats with non-contacts are selected.
         */
        public boolean selectNonContacts;
        /**
         * If true, then all private chats except the selected are chosen. Otherwise, only the selected chats are chosen.
         */
        public boolean excludeSelected;

        /**
         * Describes private chats chosen for automatic interaction with a business.
         */
        public BusinessRecipients() {
        }

        /**
         * Describes private chats chosen for automatic interaction with a business.
         *
         * @param chatIds Identifiers of selected private chats.
         * @param excludedChatIds Identifiers of private chats that are always excluded; for businessConnectedBot only.
         * @param selectExistingChats True, if all existing private chats are selected.
         * @param selectNewChats True, if all new private chats are selected.
         * @param selectContacts True, if all private chats with contacts are selected.
         * @param selectNonContacts True, if all private chats with non-contacts are selected.
         * @param excludeSelected If true, then all private chats except the selected are chosen. Otherwise, only the selected chats are chosen.
         */
        public BusinessRecipients(long[] chatIds, long[] excludedChatIds, boolean selectExistingChats, boolean selectNewChats, boolean selectContacts, boolean selectNonContacts, boolean excludeSelected) {
            this.chatIds = chatIds;
            this.excludedChatIds = excludedChatIds;
            this.selectExistingChats = selectExistingChats;
            this.selectNewChats = selectNewChats;
            this.selectContacts = selectContacts;
            this.selectNonContacts = selectNonContacts;
            this.excludeSelected = excludeSelected;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 868656909;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes settings for a business account start page.
     */
    public static class BusinessStartPage extends Object {
        /**
         * Title text of the start page.
         */
        public String title;
        /**
         * Message text of the start page.
         */
        public String message;
        /**
         * Greeting sticker of the start page; may be null if none.
         */
        @Nullable public Sticker sticker;

        /**
         * Describes settings for a business account start page.
         */
        public BusinessStartPage() {
        }

        /**
         * Describes settings for a business account start page.
         *
         * @param title Title text of the start page.
         * @param message Message text of the start page.
         * @param sticker Greeting sticker of the start page; may be null if none.
         */
        public BusinessStartPage(String title, String message, Sticker sticker) {
            this.title = title;
            this.message = message;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1616709681;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a call.
     */
    public static class Call extends Object {
        /**
         * Call identifier, not persistent.
         */
        public int id;
        /**
         * User identifier of the other call participant.
         */
        public long userId;
        /**
         * True, if the call is outgoing.
         */
        public boolean isOutgoing;
        /**
         * True, if the call is a video call.
         */
        public boolean isVideo;
        /**
         * Call state.
         */
        public CallState state;

        /**
         * Describes a call.
         */
        public Call() {
        }

        /**
         * Describes a call.
         *
         * @param id Call identifier, not persistent.
         * @param userId User identifier of the other call participant.
         * @param isOutgoing True, if the call is outgoing.
         * @param isVideo True, if the call is a video call.
         * @param state Call state.
         */
        public Call(int id, long userId, boolean isOutgoing, boolean isVideo, CallState state) {
            this.id = id;
            this.userId = userId;
            this.isOutgoing = isOutgoing;
            this.isVideo = isVideo;
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 920360804;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the reason why a call was discarded.
     */
    public abstract static class CallDiscardReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallDiscardReasonEmpty.CONSTRUCTOR,
            CallDiscardReasonMissed.CONSTRUCTOR,
            CallDiscardReasonDeclined.CONSTRUCTOR,
            CallDiscardReasonDisconnected.CONSTRUCTOR,
            CallDiscardReasonHungUp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallDiscardReason() {
        }
    }

    /**
     * The call wasn't discarded, or the reason is unknown.
     */
    public static class CallDiscardReasonEmpty extends CallDiscardReason {

        /**
         * The call wasn't discarded, or the reason is unknown.
         */
        public CallDiscardReasonEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1258917949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended before the conversation started. It was canceled by the caller or missed by the other party.
     */
    public static class CallDiscardReasonMissed extends CallDiscardReason {

        /**
         * The call was ended before the conversation started. It was canceled by the caller or missed by the other party.
         */
        public CallDiscardReasonMissed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1680358012;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended before the conversation started. It was declined by the other party.
     */
    public static class CallDiscardReasonDeclined extends CallDiscardReason {

        /**
         * The call was ended before the conversation started. It was declined by the other party.
         */
        public CallDiscardReasonDeclined() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1729926094;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended during the conversation because the users were disconnected.
     */
    public static class CallDiscardReasonDisconnected extends CallDiscardReason {

        /**
         * The call was ended during the conversation because the users were disconnected.
         */
        public CallDiscardReasonDisconnected() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1342872670;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended because one of the parties hung up.
     */
    public static class CallDiscardReasonHungUp extends CallDiscardReason {

        /**
         * The call was ended because one of the parties hung up.
         */
        public CallDiscardReasonHungUp() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 438216166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the call identifier.
     */
    public static class CallId extends Object {
        /**
         * Call identifier.
         */
        public int id;

        /**
         * Contains the call identifier.
         */
        public CallId() {
        }

        /**
         * Contains the call identifier.
         *
         * @param id Call identifier.
         */
        public CallId(int id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 65717769;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the exact type of problem with a call.
     */
    public abstract static class CallProblem extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallProblemEcho.CONSTRUCTOR,
            CallProblemNoise.CONSTRUCTOR,
            CallProblemInterruptions.CONSTRUCTOR,
            CallProblemDistortedSpeech.CONSTRUCTOR,
            CallProblemSilentLocal.CONSTRUCTOR,
            CallProblemSilentRemote.CONSTRUCTOR,
            CallProblemDropped.CONSTRUCTOR,
            CallProblemDistortedVideo.CONSTRUCTOR,
            CallProblemPixelatedVideo.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallProblem() {
        }
    }

    /**
     * The user heard their own voice.
     */
    public static class CallProblemEcho extends CallProblem {

        /**
         * The user heard their own voice.
         */
        public CallProblemEcho() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 801116548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user heard background noise.
     */
    public static class CallProblemNoise extends CallProblem {

        /**
         * The user heard background noise.
         */
        public CallProblemNoise() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1053065359;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The other side kept disappearing.
     */
    public static class CallProblemInterruptions extends CallProblem {

        /**
         * The other side kept disappearing.
         */
        public CallProblemInterruptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119493218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The speech was distorted.
     */
    public static class CallProblemDistortedSpeech extends CallProblem {

        /**
         * The speech was distorted.
         */
        public CallProblemDistortedSpeech() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 379960581;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user couldn't hear the other side.
     */
    public static class CallProblemSilentLocal extends CallProblem {

        /**
         * The user couldn't hear the other side.
         */
        public CallProblemSilentLocal() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 253652790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The other side couldn't hear the user.
     */
    public static class CallProblemSilentRemote extends CallProblem {

        /**
         * The other side couldn't hear the user.
         */
        public CallProblemSilentRemote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 573634714;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call ended unexpectedly.
     */
    public static class CallProblemDropped extends CallProblem {

        /**
         * The call ended unexpectedly.
         */
        public CallProblemDropped() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1207311487;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The video was distorted.
     */
    public static class CallProblemDistortedVideo extends CallProblem {

        /**
         * The video was distorted.
         */
        public CallProblemDistortedVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 385245706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The video was pixelated.
     */
    public static class CallProblemPixelatedVideo extends CallProblem {

        /**
         * The video was pixelated.
         */
        public CallProblemPixelatedVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2115315411;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Specifies the supported call protocols.
     */
    public static class CallProtocol extends Object {
        /**
         * True, if UDP peer-to-peer connections are supported.
         */
        public boolean udpP2p;
        /**
         * True, if connection through UDP reflectors is supported.
         */
        public boolean udpReflector;
        /**
         * The minimum supported API layer; use 65.
         */
        public int minLayer;
        /**
         * The maximum supported API layer; use 92.
         */
        public int maxLayer;
        /**
         * List of supported tgcalls versions.
         */
        public String[] libraryVersions;

        /**
         * Specifies the supported call protocols.
         */
        public CallProtocol() {
        }

        /**
         * Specifies the supported call protocols.
         *
         * @param udpP2p True, if UDP peer-to-peer connections are supported.
         * @param udpReflector True, if connection through UDP reflectors is supported.
         * @param minLayer The minimum supported API layer; use 65.
         * @param maxLayer The maximum supported API layer; use 92.
         * @param libraryVersions List of supported tgcalls versions.
         */
        public CallProtocol(boolean udpP2p, boolean udpReflector, int minLayer, int maxLayer, String[] libraryVersions) {
            this.udpP2p = udpP2p;
            this.udpReflector = udpReflector;
            this.minLayer = minLayer;
            this.maxLayer = maxLayer;
            this.libraryVersions = libraryVersions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1075562897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a server for relaying call data.
     */
    public static class CallServer extends Object {
        /**
         * Server identifier.
         */
        public long id;
        /**
         * Server IPv4 address.
         */
        public String ipAddress;
        /**
         * Server IPv6 address.
         */
        public String ipv6Address;
        /**
         * Server port number.
         */
        public int port;
        /**
         * Server type.
         */
        public CallServerType type;

        /**
         * Describes a server for relaying call data.
         */
        public CallServer() {
        }

        /**
         * Describes a server for relaying call data.
         *
         * @param id Server identifier.
         * @param ipAddress Server IPv4 address.
         * @param ipv6Address Server IPv6 address.
         * @param port Server port number.
         * @param type Server type.
         */
        public CallServer(long id, String ipAddress, String ipv6Address, int port, CallServerType type) {
            this.id = id;
            this.ipAddress = ipAddress;
            this.ipv6Address = ipv6Address;
            this.port = port;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1865932695;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of call server.
     */
    public abstract static class CallServerType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallServerTypeTelegramReflector.CONSTRUCTOR,
            CallServerTypeWebrtc.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallServerType() {
        }
    }

    /**
     * A Telegram call reflector.
     */
    public static class CallServerTypeTelegramReflector extends CallServerType {
        /**
         * A peer tag to be used with the reflector.
         */
        public byte[] peerTag;
        /**
         * True, if the server uses TCP instead of UDP.
         */
        public boolean isTcp;

        /**
         * A Telegram call reflector.
         */
        public CallServerTypeTelegramReflector() {
        }

        /**
         * A Telegram call reflector.
         *
         * @param peerTag A peer tag to be used with the reflector.
         * @param isTcp True, if the server uses TCP instead of UDP.
         */
        public CallServerTypeTelegramReflector(byte[] peerTag, boolean isTcp) {
            this.peerTag = peerTag;
            this.isTcp = isTcp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 850343189;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A WebRTC server.
     */
    public static class CallServerTypeWebrtc extends CallServerType {
        /**
         * Username to be used for authentication.
         */
        public String username;
        /**
         * Authentication password.
         */
        public String password;
        /**
         * True, if the server supports TURN.
         */
        public boolean supportsTurn;
        /**
         * True, if the server supports STUN.
         */
        public boolean supportsStun;

        /**
         * A WebRTC server.
         */
        public CallServerTypeWebrtc() {
        }

        /**
         * A WebRTC server.
         *
         * @param username Username to be used for authentication.
         * @param password Authentication password.
         * @param supportsTurn True, if the server supports TURN.
         * @param supportsStun True, if the server supports STUN.
         */
        public CallServerTypeWebrtc(String username, String password, boolean supportsTurn, boolean supportsStun) {
            this.username = username;
            this.password = password;
            this.supportsTurn = supportsTurn;
            this.supportsStun = supportsStun;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1250622821;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the current call state.
     */
    public abstract static class CallState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallStatePending.CONSTRUCTOR,
            CallStateExchangingKeys.CONSTRUCTOR,
            CallStateReady.CONSTRUCTOR,
            CallStateHangingUp.CONSTRUCTOR,
            CallStateDiscarded.CONSTRUCTOR,
            CallStateError.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallState() {
        }
    }

    /**
     * The call is pending, waiting to be accepted by a user.
     */
    public static class CallStatePending extends CallState {
        /**
         * True, if the call has already been created by the server.
         */
        public boolean isCreated;
        /**
         * True, if the call has already been received by the other party.
         */
        public boolean isReceived;

        /**
         * The call is pending, waiting to be accepted by a user.
         */
        public CallStatePending() {
        }

        /**
         * The call is pending, waiting to be accepted by a user.
         *
         * @param isCreated True, if the call has already been created by the server.
         * @param isReceived True, if the call has already been received by the other party.
         */
        public CallStatePending(boolean isCreated, boolean isReceived) {
            this.isCreated = isCreated;
            this.isReceived = isReceived;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1073048620;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call has been answered and encryption keys are being exchanged.
     */
    public static class CallStateExchangingKeys extends CallState {

        /**
         * The call has been answered and encryption keys are being exchanged.
         */
        public CallStateExchangingKeys() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1848149403;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call is ready to use.
     */
    public static class CallStateReady extends CallState {
        /**
         * Call protocols supported by the other call participant.
         */
        public CallProtocol protocol;
        /**
         * List of available call servers.
         */
        public CallServer[] servers;
        /**
         * A JSON-encoded call config.
         */
        public String config;
        /**
         * Call encryption key.
         */
        public byte[] encryptionKey;
        /**
         * Encryption key fingerprint represented as 4 emoji.
         */
        public String[] emojis;
        /**
         * True, if peer-to-peer connection is allowed by users privacy settings.
         */
        public boolean allowP2p;
        /**
         * Custom JSON-encoded call parameters to be passed to tgcalls.
         */
        public String customParameters;

        /**
         * The call is ready to use.
         */
        public CallStateReady() {
        }

        /**
         * The call is ready to use.
         *
         * @param protocol Call protocols supported by the other call participant.
         * @param servers List of available call servers.
         * @param config A JSON-encoded call config.
         * @param encryptionKey Call encryption key.
         * @param emojis Encryption key fingerprint represented as 4 emoji.
         * @param allowP2p True, if peer-to-peer connection is allowed by users privacy settings.
         * @param customParameters Custom JSON-encoded call parameters to be passed to tgcalls.
         */
        public CallStateReady(CallProtocol protocol, CallServer[] servers, String config, byte[] encryptionKey, String[] emojis, boolean allowP2p, String customParameters) {
            this.protocol = protocol;
            this.servers = servers;
            this.config = config;
            this.encryptionKey = encryptionKey;
            this.emojis = emojis;
            this.allowP2p = allowP2p;
            this.customParameters = customParameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 731619651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call is hanging up after discardCall has been called.
     */
    public static class CallStateHangingUp extends CallState {

        /**
         * The call is hanging up after discardCall has been called.
         */
        public CallStateHangingUp() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2133790038;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call has ended successfully.
     */
    public static class CallStateDiscarded extends CallState {
        /**
         * The reason why the call has ended.
         */
        public CallDiscardReason reason;
        /**
         * True, if the call rating must be sent to the server.
         */
        public boolean needRating;
        /**
         * True, if the call debug information must be sent to the server.
         */
        public boolean needDebugInformation;
        /**
         * True, if the call log must be sent to the server.
         */
        public boolean needLog;

        /**
         * The call has ended successfully.
         */
        public CallStateDiscarded() {
        }

        /**
         * The call has ended successfully.
         *
         * @param reason The reason why the call has ended.
         * @param needRating True, if the call rating must be sent to the server.
         * @param needDebugInformation True, if the call debug information must be sent to the server.
         * @param needLog True, if the call log must be sent to the server.
         */
        public CallStateDiscarded(CallDiscardReason reason, boolean needRating, boolean needDebugInformation, boolean needLog) {
            this.reason = reason;
            this.needRating = needRating;
            this.needDebugInformation = needDebugInformation;
            this.needLog = needLog;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1394310213;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call has ended with an error.
     */
    public static class CallStateError extends CallState {
        /**
         * Error. An error with the code 4005000 will be returned if an outgoing call is missed because of an expired timeout.
         */
        public Error error;

        /**
         * The call has ended with an error.
         */
        public CallStateError() {
        }

        /**
         * The call has ended with an error.
         *
         * @param error Error. An error with the code 4005000 will be returned if an outgoing call is missed because of an expired timeout.
         */
        public CallStateError(Error error) {
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -975215467;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a bot's answer to a callback query.
     */
    public static class CallbackQueryAnswer extends Object {
        /**
         * Text of the answer.
         */
        public String text;
        /**
         * True, if an alert must be shown to the user instead of a toast notification.
         */
        public boolean showAlert;
        /**
         * URL to be opened.
         */
        public String url;

        /**
         * Contains a bot's answer to a callback query.
         */
        public CallbackQueryAnswer() {
        }

        /**
         * Contains a bot's answer to a callback query.
         *
         * @param text Text of the answer.
         * @param showAlert True, if an alert must be shown to the user instead of a toast notification.
         * @param url URL to be opened.
         */
        public CallbackQueryAnswer(String text, boolean showAlert, String url) {
            this.text = text;
            this.showAlert = showAlert;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 360867933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a payload of a callback query.
     */
    public abstract static class CallbackQueryPayload extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallbackQueryPayloadData.CONSTRUCTOR,
            CallbackQueryPayloadDataWithPassword.CONSTRUCTOR,
            CallbackQueryPayloadGame.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallbackQueryPayload() {
        }
    }

    /**
     * The payload for a general callback button.
     */
    public static class CallbackQueryPayloadData extends CallbackQueryPayload {
        /**
         * Data that was attached to the callback button.
         */
        public byte[] data;

        /**
         * The payload for a general callback button.
         */
        public CallbackQueryPayloadData() {
        }

        /**
         * The payload for a general callback button.
         *
         * @param data Data that was attached to the callback button.
         */
        public CallbackQueryPayloadData(byte[] data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1977729946;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payload for a callback button requiring password.
     */
    public static class CallbackQueryPayloadDataWithPassword extends CallbackQueryPayload {
        /**
         * The 2-step verification password for the current user.
         */
        public String password;
        /**
         * Data that was attached to the callback button.
         */
        public byte[] data;

        /**
         * The payload for a callback button requiring password.
         */
        public CallbackQueryPayloadDataWithPassword() {
        }

        /**
         * The payload for a callback button requiring password.
         *
         * @param password The 2-step verification password for the current user.
         * @param data Data that was attached to the callback button.
         */
        public CallbackQueryPayloadDataWithPassword(String password, byte[] data) {
            this.password = password;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1340266738;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payload for a game callback button.
     */
    public static class CallbackQueryPayloadGame extends CallbackQueryPayload {
        /**
         * A short name of the game that was attached to the callback button.
         */
        public String gameShortName;

        /**
         * The payload for a game callback button.
         */
        public CallbackQueryPayloadGame() {
        }

        /**
         * The payload for a game callback button.
         *
         * @param gameShortName A short name of the game that was attached to the callback button.
         */
        public CallbackQueryPayloadGame(String gameShortName) {
            this.gameShortName = gameShortName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1303571512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of canSendMessageToUser.
     */
    public abstract static class CanSendMessageToUserResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CanSendMessageToUserResultOk.CONSTRUCTOR,
            CanSendMessageToUserResultUserIsDeleted.CONSTRUCTOR,
            CanSendMessageToUserResultUserRestrictsNewChats.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CanSendMessageToUserResult() {
        }
    }

    /**
     * The user can be messaged.
     */
    public static class CanSendMessageToUserResultOk extends CanSendMessageToUserResult {

        /**
         * The user can be messaged.
         */
        public CanSendMessageToUserResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1530583042;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't be messaged, because they are deleted or unknown.
     */
    public static class CanSendMessageToUserResultUserIsDeleted extends CanSendMessageToUserResult {

        /**
         * The user can't be messaged, because they are deleted or unknown.
         */
        public CanSendMessageToUserResultUserIsDeleted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1944639903;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't be messaged, because they restrict new chats with non-contacts.
     */
    public static class CanSendMessageToUserResultUserRestrictsNewChats extends CanSendMessageToUserResult {

        /**
         * The user can't be messaged, because they restrict new chats with non-contacts.
         */
        public CanSendMessageToUserResultUserRestrictsNewChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1929699797;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of checking whether the current user can send a story in the specific chat.
     */
    public abstract static class CanSendStoryResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CanSendStoryResultOk.CONSTRUCTOR,
            CanSendStoryResultPremiumNeeded.CONSTRUCTOR,
            CanSendStoryResultBoostNeeded.CONSTRUCTOR,
            CanSendStoryResultActiveStoryLimitExceeded.CONSTRUCTOR,
            CanSendStoryResultWeeklyLimitExceeded.CONSTRUCTOR,
            CanSendStoryResultMonthlyLimitExceeded.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CanSendStoryResult() {
        }
    }

    /**
     * A story can be sent.
     */
    public static class CanSendStoryResultOk extends CanSendStoryResult {

        /**
         * A story can be sent.
         */
        public CanSendStoryResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1346171133;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must subscribe to Telegram Premium to be able to post stories.
     */
    public static class CanSendStoryResultPremiumNeeded extends CanSendStoryResult {

        /**
         * The user must subscribe to Telegram Premium to be able to post stories.
         */
        public CanSendStoryResultPremiumNeeded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1451220585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat must be boosted first by Telegram Premium subscribers to post more stories. Call getChatBoostStatus to get current boost status of the chat.
     */
    public static class CanSendStoryResultBoostNeeded extends CanSendStoryResult {

        /**
         * The chat must be boosted first by Telegram Premium subscribers to post more stories. Call getChatBoostStatus to get current boost status of the chat.
         */
        public CanSendStoryResultBoostNeeded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1637816017;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The limit for the number of active stories exceeded. The user can buy Telegram Premium, delete an active story, or wait for the oldest story to expire.
     */
    public static class CanSendStoryResultActiveStoryLimitExceeded extends CanSendStoryResult {

        /**
         * The limit for the number of active stories exceeded. The user can buy Telegram Premium, delete an active story, or wait for the oldest story to expire.
         */
        public CanSendStoryResultActiveStoryLimitExceeded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1344689450;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The weekly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
     */
    public static class CanSendStoryResultWeeklyLimitExceeded extends CanSendStoryResult {
        /**
         * Time left before the user can send the next story.
         */
        public int retryAfter;

        /**
         * The weekly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
         */
        public CanSendStoryResultWeeklyLimitExceeded() {
        }

        /**
         * The weekly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
         *
         * @param retryAfter Time left before the user can send the next story.
         */
        public CanSendStoryResultWeeklyLimitExceeded(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 323068088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The monthly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
     */
    public static class CanSendStoryResultMonthlyLimitExceeded extends CanSendStoryResult {
        /**
         * Time left before the user can send the next story.
         */
        public int retryAfter;

        /**
         * The monthly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
         */
        public CanSendStoryResultMonthlyLimitExceeded() {
        }

        /**
         * The monthly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
         *
         * @param retryAfter Time left before the user can send the next story.
         */
        public CanSendStoryResultMonthlyLimitExceeded(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -578665771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of checking whether the current session can be used to transfer a chat ownership to another user.
     */
    public abstract static class CanTransferOwnershipResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CanTransferOwnershipResultOk.CONSTRUCTOR,
            CanTransferOwnershipResultPasswordNeeded.CONSTRUCTOR,
            CanTransferOwnershipResultPasswordTooFresh.CONSTRUCTOR,
            CanTransferOwnershipResultSessionTooFresh.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CanTransferOwnershipResult() {
        }
    }

    /**
     * The session can be used.
     */
    public static class CanTransferOwnershipResultOk extends CanTransferOwnershipResult {

        /**
         * The session can be used.
         */
        public CanTransferOwnershipResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -89881021;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The 2-step verification needs to be enabled first.
     */
    public static class CanTransferOwnershipResultPasswordNeeded extends CanTransferOwnershipResult {

        /**
         * The 2-step verification needs to be enabled first.
         */
        public CanTransferOwnershipResultPasswordNeeded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1548372703;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The 2-step verification was enabled recently, user needs to wait.
     */
    public static class CanTransferOwnershipResultPasswordTooFresh extends CanTransferOwnershipResult {
        /**
         * Time left before the session can be used to transfer ownership of a chat, in seconds.
         */
        public int retryAfter;

        /**
         * The 2-step verification was enabled recently, user needs to wait.
         */
        public CanTransferOwnershipResultPasswordTooFresh() {
        }

        /**
         * The 2-step verification was enabled recently, user needs to wait.
         *
         * @param retryAfter Time left before the session can be used to transfer ownership of a chat, in seconds.
         */
        public CanTransferOwnershipResultPasswordTooFresh(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 811440913;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session was created recently, user needs to wait.
     */
    public static class CanTransferOwnershipResultSessionTooFresh extends CanTransferOwnershipResult {
        /**
         * Time left before the session can be used to transfer ownership of a chat, in seconds.
         */
        public int retryAfter;

        /**
         * The session was created recently, user needs to wait.
         */
        public CanTransferOwnershipResultSessionTooFresh() {
        }

        /**
         * The session was created recently, user needs to wait.
         *
         * @param retryAfter Time left before the session can be used to transfer ownership of a chat, in seconds.
         */
        public CanTransferOwnershipResultSessionTooFresh(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 984664289;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat. (Can be a private chat, basic group, supergroup, or secret chat.)
     */
    public static class Chat extends Object {
        /**
         * Chat unique identifier.
         */
        public long id;
        /**
         * Type of the chat.
         */
        public ChatType type;
        /**
         * Chat title.
         */
        public String title;
        /**
         * Chat photo; may be null.
         */
        @Nullable public ChatPhotoInfo photo;
        /**
         * Identifier of the accent color for message sender name, and backgrounds of chat photo, reply header, and link preview.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the reply header and link preview background for messages sent by the chat; 0 if none.
         */
        public long backgroundCustomEmojiId;
        /**
         * Identifier of the profile accent color for the chat's profile; -1 if none.
         */
        public int profileAccentColorId;
        /**
         * Identifier of a custom emoji to be shown on the background of the chat's profile; 0 if none.
         */
        public long profileBackgroundCustomEmojiId;
        /**
         * Actions that non-administrator chat members are allowed to take in the chat.
         */
        public ChatPermissions permissions;
        /**
         * Last message in the chat; may be null if none or unknown.
         */
        @Nullable public Message lastMessage;
        /**
         * Positions of the chat in chat lists.
         */
        public ChatPosition[] positions;
        /**
         * Chat lists to which the chat belongs. A chat can have a non-zero position in a chat list even it doesn't belong to the chat list and have no position in a chat list even it belongs to the chat list.
         */
        public ChatList[] chatLists;
        /**
         * Identifier of a user or chat that is selected to send messages in the chat; may be null if the user can't change message sender.
         */
        @Nullable public MessageSender messageSenderId;
        /**
         * Block list to which the chat is added; may be null if none.
         */
        @Nullable public BlockList blockList;
        /**
         * True, if chat content can't be saved locally, forwarded, or copied.
         */
        public boolean hasProtectedContent;
        /**
         * True, if translation of all messages in the chat must be suggested to the user.
         */
        public boolean isTranslatable;
        /**
         * True, if the chat is marked as unread.
         */
        public boolean isMarkedAsUnread;
        /**
         * True, if the chat is a forum supergroup that must be shown in the &quot;View as topics&quot; mode, or Saved Messages chat that must be shown in the &quot;View as chats&quot;.
         */
        public boolean viewAsTopics;
        /**
         * True, if the chat has scheduled messages.
         */
        public boolean hasScheduledMessages;
        /**
         * True, if the chat messages can be deleted only for the current user while other users will continue to see the messages.
         */
        public boolean canBeDeletedOnlyForSelf;
        /**
         * True, if the chat messages can be deleted for all users.
         */
        public boolean canBeDeletedForAllUsers;
        /**
         * True, if the chat can be reported to Telegram moderators through reportChat or reportChatPhoto.
         */
        public boolean canBeReported;
        /**
         * Default value of the disableNotification parameter, used when a message is sent to the chat.
         */
        public boolean defaultDisableNotification;
        /**
         * Number of unread messages in the chat.
         */
        public int unreadCount;
        /**
         * Identifier of the last read incoming message.
         */
        public long lastReadInboxMessageId;
        /**
         * Identifier of the last read outgoing message.
         */
        public long lastReadOutboxMessageId;
        /**
         * Number of unread messages with a mention/reply in the chat.
         */
        public int unreadMentionCount;
        /**
         * Number of messages with unread reactions in the chat.
         */
        public int unreadReactionCount;
        /**
         * Notification settings for the chat.
         */
        public ChatNotificationSettings notificationSettings;
        /**
         * Types of reaction, available in the chat.
         */
        public ChatAvailableReactions availableReactions;
        /**
         * Current message auto-delete or self-destruct timer setting for the chat, in seconds; 0 if disabled. Self-destruct timer in secret chats starts after the message or its content is viewed. Auto-delete timer in other chats starts from the send date.
         */
        public int messageAutoDeleteTime;
        /**
         * Emoji status to be shown along with chat title; may be null.
         */
        @Nullable public EmojiStatus emojiStatus;
        /**
         * Background set for the chat; may be null if none.
         */
        @Nullable public ChatBackground background;
        /**
         * If non-empty, name of a theme, set for the chat.
         */
        public String themeName;
        /**
         * Information about actions which must be possible to do through the chat action bar; may be null if none.
         */
        @Nullable public ChatActionBar actionBar;
        /**
         * Information about bar for managing a business bot in the chat; may be null if none.
         */
        @Nullable public BusinessBotManageBar businessBotManageBar;
        /**
         * Information about video chat of the chat.
         */
        public VideoChat videoChat;
        /**
         * Information about pending join requests; may be null if none.
         */
        @Nullable public ChatJoinRequestsInfo pendingJoinRequests;
        /**
         * Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat.
         */
        public long replyMarkupMessageId;
        /**
         * A draft of a message in the chat; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;
        /**
         * Application-specific data associated with the chat. (For example, the chat scroll position or local chat notification settings can be stored here.) Persistent if the message database is used.
         */
        public String clientData;

        /**
         * A chat. (Can be a private chat, basic group, supergroup, or secret chat.)
         */
        public Chat() {
        }

        /**
         * A chat. (Can be a private chat, basic group, supergroup, or secret chat.)
         *
         * @param id Chat unique identifier.
         * @param type Type of the chat.
         * @param title Chat title.
         * @param photo Chat photo; may be null.
         * @param accentColorId Identifier of the accent color for message sender name, and backgrounds of chat photo, reply header, and link preview.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the reply header and link preview background for messages sent by the chat; 0 if none.
         * @param profileAccentColorId Identifier of the profile accent color for the chat's profile; -1 if none.
         * @param profileBackgroundCustomEmojiId Identifier of a custom emoji to be shown on the background of the chat's profile; 0 if none.
         * @param permissions Actions that non-administrator chat members are allowed to take in the chat.
         * @param lastMessage Last message in the chat; may be null if none or unknown.
         * @param positions Positions of the chat in chat lists.
         * @param chatLists Chat lists to which the chat belongs. A chat can have a non-zero position in a chat list even it doesn't belong to the chat list and have no position in a chat list even it belongs to the chat list.
         * @param messageSenderId Identifier of a user or chat that is selected to send messages in the chat; may be null if the user can't change message sender.
         * @param blockList Block list to which the chat is added; may be null if none.
         * @param hasProtectedContent True, if chat content can't be saved locally, forwarded, or copied.
         * @param isTranslatable True, if translation of all messages in the chat must be suggested to the user.
         * @param isMarkedAsUnread True, if the chat is marked as unread.
         * @param viewAsTopics True, if the chat is a forum supergroup that must be shown in the &quot;View as topics&quot; mode, or Saved Messages chat that must be shown in the &quot;View as chats&quot;.
         * @param hasScheduledMessages True, if the chat has scheduled messages.
         * @param canBeDeletedOnlyForSelf True, if the chat messages can be deleted only for the current user while other users will continue to see the messages.
         * @param canBeDeletedForAllUsers True, if the chat messages can be deleted for all users.
         * @param canBeReported True, if the chat can be reported to Telegram moderators through reportChat or reportChatPhoto.
         * @param defaultDisableNotification Default value of the disableNotification parameter, used when a message is sent to the chat.
         * @param unreadCount Number of unread messages in the chat.
         * @param lastReadInboxMessageId Identifier of the last read incoming message.
         * @param lastReadOutboxMessageId Identifier of the last read outgoing message.
         * @param unreadMentionCount Number of unread messages with a mention/reply in the chat.
         * @param unreadReactionCount Number of messages with unread reactions in the chat.
         * @param notificationSettings Notification settings for the chat.
         * @param availableReactions Types of reaction, available in the chat.
         * @param messageAutoDeleteTime Current message auto-delete or self-destruct timer setting for the chat, in seconds; 0 if disabled. Self-destruct timer in secret chats starts after the message or its content is viewed. Auto-delete timer in other chats starts from the send date.
         * @param emojiStatus Emoji status to be shown along with chat title; may be null.
         * @param background Background set for the chat; may be null if none.
         * @param themeName If non-empty, name of a theme, set for the chat.
         * @param actionBar Information about actions which must be possible to do through the chat action bar; may be null if none.
         * @param businessBotManageBar Information about bar for managing a business bot in the chat; may be null if none.
         * @param videoChat Information about video chat of the chat.
         * @param pendingJoinRequests Information about pending join requests; may be null if none.
         * @param replyMarkupMessageId Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat.
         * @param draftMessage A draft of a message in the chat; may be null if none.
         * @param clientData Application-specific data associated with the chat. (For example, the chat scroll position or local chat notification settings can be stored here.) Persistent if the message database is used.
         */
        public Chat(long id, ChatType type, String title, ChatPhotoInfo photo, int accentColorId, long backgroundCustomEmojiId, int profileAccentColorId, long profileBackgroundCustomEmojiId, ChatPermissions permissions, Message lastMessage, ChatPosition[] positions, ChatList[] chatLists, MessageSender messageSenderId, BlockList blockList, boolean hasProtectedContent, boolean isTranslatable, boolean isMarkedAsUnread, boolean viewAsTopics, boolean hasScheduledMessages, boolean canBeDeletedOnlyForSelf, boolean canBeDeletedForAllUsers, boolean canBeReported, boolean defaultDisableNotification, int unreadCount, long lastReadInboxMessageId, long lastReadOutboxMessageId, int unreadMentionCount, int unreadReactionCount, ChatNotificationSettings notificationSettings, ChatAvailableReactions availableReactions, int messageAutoDeleteTime, EmojiStatus emojiStatus, ChatBackground background, String themeName, ChatActionBar actionBar, BusinessBotManageBar businessBotManageBar, VideoChat videoChat, ChatJoinRequestsInfo pendingJoinRequests, long replyMarkupMessageId, DraftMessage draftMessage, String clientData) {
            this.id = id;
            this.type = type;
            this.title = title;
            this.photo = photo;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
            this.permissions = permissions;
            this.lastMessage = lastMessage;
            this.positions = positions;
            this.chatLists = chatLists;
            this.messageSenderId = messageSenderId;
            this.blockList = blockList;
            this.hasProtectedContent = hasProtectedContent;
            this.isTranslatable = isTranslatable;
            this.isMarkedAsUnread = isMarkedAsUnread;
            this.viewAsTopics = viewAsTopics;
            this.hasScheduledMessages = hasScheduledMessages;
            this.canBeDeletedOnlyForSelf = canBeDeletedOnlyForSelf;
            this.canBeDeletedForAllUsers = canBeDeletedForAllUsers;
            this.canBeReported = canBeReported;
            this.defaultDisableNotification = defaultDisableNotification;
            this.unreadCount = unreadCount;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
            this.unreadMentionCount = unreadMentionCount;
            this.unreadReactionCount = unreadReactionCount;
            this.notificationSettings = notificationSettings;
            this.availableReactions = availableReactions;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
            this.emojiStatus = emojiStatus;
            this.background = background;
            this.themeName = themeName;
            this.actionBar = actionBar;
            this.businessBotManageBar = businessBotManageBar;
            this.videoChat = videoChat;
            this.pendingJoinRequests = pendingJoinRequests;
            this.replyMarkupMessageId = replyMarkupMessageId;
            this.draftMessage = draftMessage;
            this.clientData = clientData;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 830601369;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the different types of activity in a chat.
     */
    public abstract static class ChatAction extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatActionTyping.CONSTRUCTOR,
            ChatActionRecordingVideo.CONSTRUCTOR,
            ChatActionUploadingVideo.CONSTRUCTOR,
            ChatActionRecordingVoiceNote.CONSTRUCTOR,
            ChatActionUploadingVoiceNote.CONSTRUCTOR,
            ChatActionUploadingPhoto.CONSTRUCTOR,
            ChatActionUploadingDocument.CONSTRUCTOR,
            ChatActionChoosingSticker.CONSTRUCTOR,
            ChatActionChoosingLocation.CONSTRUCTOR,
            ChatActionChoosingContact.CONSTRUCTOR,
            ChatActionStartPlayingGame.CONSTRUCTOR,
            ChatActionRecordingVideoNote.CONSTRUCTOR,
            ChatActionUploadingVideoNote.CONSTRUCTOR,
            ChatActionWatchingAnimations.CONSTRUCTOR,
            ChatActionCancel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatAction() {
        }
    }

    /**
     * The user is typing a message.
     */
    public static class ChatActionTyping extends ChatAction {

        /**
         * The user is typing a message.
         */
        public ChatActionTyping() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 380122167;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is recording a video.
     */
    public static class ChatActionRecordingVideo extends ChatAction {

        /**
         * The user is recording a video.
         */
        public ChatActionRecordingVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 216553362;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a video.
     */
    public static class ChatActionUploadingVideo extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a video.
         */
        public ChatActionUploadingVideo() {
        }

        /**
         * The user is uploading a video.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingVideo(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1234185270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is recording a voice note.
     */
    public static class ChatActionRecordingVoiceNote extends ChatAction {

        /**
         * The user is recording a voice note.
         */
        public ChatActionRecordingVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -808850058;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a voice note.
     */
    public static class ChatActionUploadingVoiceNote extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a voice note.
         */
        public ChatActionUploadingVoiceNote() {
        }

        /**
         * The user is uploading a voice note.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingVoiceNote(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -613643666;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a photo.
     */
    public static class ChatActionUploadingPhoto extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a photo.
         */
        public ChatActionUploadingPhoto() {
        }

        /**
         * The user is uploading a photo.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingPhoto(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 654240583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a document.
     */
    public static class ChatActionUploadingDocument extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a document.
         */
        public ChatActionUploadingDocument() {
        }

        /**
         * The user is uploading a document.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingDocument(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 167884362;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is picking a sticker to send.
     */
    public static class ChatActionChoosingSticker extends ChatAction {

        /**
         * The user is picking a sticker to send.
         */
        public ChatActionChoosingSticker() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 372753697;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is picking a location or venue to send.
     */
    public static class ChatActionChoosingLocation extends ChatAction {

        /**
         * The user is picking a location or venue to send.
         */
        public ChatActionChoosingLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2017893596;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is picking a contact to send.
     */
    public static class ChatActionChoosingContact extends ChatAction {

        /**
         * The user is picking a contact to send.
         */
        public ChatActionChoosingContact() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1222507496;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has started to play a game.
     */
    public static class ChatActionStartPlayingGame extends ChatAction {

        /**
         * The user has started to play a game.
         */
        public ChatActionStartPlayingGame() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -865884164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is recording a video note.
     */
    public static class ChatActionRecordingVideoNote extends ChatAction {

        /**
         * The user is recording a video note.
         */
        public ChatActionRecordingVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 16523393;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a video note.
     */
    public static class ChatActionUploadingVideoNote extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a video note.
         */
        public ChatActionUploadingVideoNote() {
        }

        /**
         * The user is uploading a video note.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingVideoNote(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1172364918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is watching animations sent by the other party by clicking on an animated emoji.
     */
    public static class ChatActionWatchingAnimations extends ChatAction {
        /**
         * The animated emoji.
         */
        public String emoji;

        /**
         * The user is watching animations sent by the other party by clicking on an animated emoji.
         */
        public ChatActionWatchingAnimations() {
        }

        /**
         * The user is watching animations sent by the other party by clicking on an animated emoji.
         *
         * @param emoji The animated emoji.
         */
        public ChatActionWatchingAnimations(String emoji) {
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2052990641;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has canceled the previous action.
     */
    public static class ChatActionCancel extends ChatAction {

        /**
         * The user has canceled the previous action.
         */
        public ChatActionCancel() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1160523958;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes actions which must be possible to do through a chat action bar.
     */
    public abstract static class ChatActionBar extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatActionBarReportSpam.CONSTRUCTOR,
            ChatActionBarReportUnrelatedLocation.CONSTRUCTOR,
            ChatActionBarInviteMembers.CONSTRUCTOR,
            ChatActionBarReportAddBlock.CONSTRUCTOR,
            ChatActionBarAddContact.CONSTRUCTOR,
            ChatActionBarSharePhoneNumber.CONSTRUCTOR,
            ChatActionBarJoinRequest.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatActionBar() {
        }
    }

    /**
     * The chat can be reported as spam using the method reportChat with the reason reportReasonSpam. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
     */
    public static class ChatActionBarReportSpam extends ChatActionBar {
        /**
         * If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings.
         */
        public boolean canUnarchive;

        /**
         * The chat can be reported as spam using the method reportChat with the reason reportReasonSpam. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
         */
        public ChatActionBarReportSpam() {
        }

        /**
         * The chat can be reported as spam using the method reportChat with the reason reportReasonSpam. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
         *
         * @param canUnarchive If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings.
         */
        public ChatActionBarReportSpam(boolean canUnarchive) {
            this.canUnarchive = canUnarchive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1312758246;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a location-based supergroup, which can be reported as having unrelated location using the method reportChat with the reason reportReasonUnrelatedLocation.
     */
    public static class ChatActionBarReportUnrelatedLocation extends ChatActionBar {

        /**
         * The chat is a location-based supergroup, which can be reported as having unrelated location using the method reportChat with the reason reportReasonUnrelatedLocation.
         */
        public ChatActionBarReportUnrelatedLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 758175489;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a recently created group chat to which new members can be invited.
     */
    public static class ChatActionBarInviteMembers extends ChatActionBar {

        /**
         * The chat is a recently created group chat to which new members can be invited.
         */
        public ChatActionBarInviteMembers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1985313904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a private or secret chat, which can be reported using the method reportChat, or the other user can be blocked using the method setMessageSenderBlockList, or the other user can be added to the contact list using the method addContact. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
     */
    public static class ChatActionBarReportAddBlock extends ChatActionBar {
        /**
         * If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings.
         */
        public boolean canUnarchive;
        /**
         * If non-negative, the current user was found by the other user through searchChatsNearby and this is the distance between the users.
         */
        public int distance;

        /**
         * The chat is a private or secret chat, which can be reported using the method reportChat, or the other user can be blocked using the method setMessageSenderBlockList, or the other user can be added to the contact list using the method addContact. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
         */
        public ChatActionBarReportAddBlock() {
        }

        /**
         * The chat is a private or secret chat, which can be reported using the method reportChat, or the other user can be blocked using the method setMessageSenderBlockList, or the other user can be added to the contact list using the method addContact. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
         *
         * @param canUnarchive If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings.
         * @param distance If non-negative, the current user was found by the other user through searchChatsNearby and this is the distance between the users.
         */
        public ChatActionBarReportAddBlock(boolean canUnarchive, int distance) {
            this.canUnarchive = canUnarchive;
            this.distance = distance;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -914150419;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a private or secret chat and the other user can be added to the contact list using the method addContact.
     */
    public static class ChatActionBarAddContact extends ChatActionBar {

        /**
         * The chat is a private or secret chat and the other user can be added to the contact list using the method addContact.
         */
        public ChatActionBarAddContact() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -733325295;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a private or secret chat with a mutual contact and the user's phone number can be shared with the other user using the method sharePhoneNumber.
     */
    public static class ChatActionBarSharePhoneNumber extends ChatActionBar {

        /**
         * The chat is a private or secret chat with a mutual contact and the user's phone number can be shared with the other user using the method sharePhoneNumber.
         */
        public ChatActionBarSharePhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 35188697;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a private chat with an administrator of a chat to which the user sent join request.
     */
    public static class ChatActionBarJoinRequest extends ChatActionBar {
        /**
         * Title of the chat to which the join request was sent.
         */
        public String title;
        /**
         * True, if the join request was sent to a channel chat.
         */
        public boolean isChannel;
        /**
         * Point in time (Unix timestamp) when the join request was sent.
         */
        public int requestDate;

        /**
         * The chat is a private chat with an administrator of a chat to which the user sent join request.
         */
        public ChatActionBarJoinRequest() {
        }

        /**
         * The chat is a private chat with an administrator of a chat to which the user sent join request.
         *
         * @param title Title of the chat to which the join request was sent.
         * @param isChannel True, if the join request was sent to a channel chat.
         * @param requestDate Point in time (Unix timestamp) when the join request was sent.
         */
        public ChatActionBarJoinRequest(String title, boolean isChannel, int requestDate) {
            this.title = title;
            this.isChannel = isChannel;
            this.requestDate = requestDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1037140744;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes active stories posted by a chat.
     */
    public static class ChatActiveStories extends Object {
        /**
         * Identifier of the chat that posted the stories.
         */
        public long chatId;
        /**
         * Identifier of the story list in which the stories are shown; may be null if the stories aren't shown in a story list.
         */
        @Nullable public StoryList list;
        /**
         * A parameter used to determine order of the stories in the story list; 0 if the stories doesn't need to be shown in the story list. Stories must be sorted by the pair (order, storySenderChatId) in descending order.
         */
        public long order;
        /**
         * Identifier of the last read active story.
         */
        public int maxReadStoryId;
        /**
         * Basic information about the stories; use getStory to get full information about the stories. The stories are in a chronological order (i.e., in order of increasing story identifiers).
         */
        public StoryInfo[] stories;

        /**
         * Describes active stories posted by a chat.
         */
        public ChatActiveStories() {
        }

        /**
         * Describes active stories posted by a chat.
         *
         * @param chatId Identifier of the chat that posted the stories.
         * @param list Identifier of the story list in which the stories are shown; may be null if the stories aren't shown in a story list.
         * @param order A parameter used to determine order of the stories in the story list; 0 if the stories doesn't need to be shown in the story list. Stories must be sorted by the pair (order, storySenderChatId) in descending order.
         * @param maxReadStoryId Identifier of the last read active story.
         * @param stories Basic information about the stories; use getStory to get full information about the stories. The stories are in a chronological order (i.e., in order of increasing story identifiers).
         */
        public ChatActiveStories(long chatId, StoryList list, long order, int maxReadStoryId, StoryInfo[] stories) {
            this.chatId = chatId;
            this.list = list;
            this.order = order;
            this.maxReadStoryId = maxReadStoryId;
            this.stories = stories;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1398869529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a chat administrator.
     */
    public static class ChatAdministrator extends Object {
        /**
         * User identifier of the administrator.
         */
        public long userId;
        /**
         * Custom title of the administrator.
         */
        public String customTitle;
        /**
         * True, if the user is the owner of the chat.
         */
        public boolean isOwner;

        /**
         * Contains information about a chat administrator.
         */
        public ChatAdministrator() {
        }

        /**
         * Contains information about a chat administrator.
         *
         * @param userId User identifier of the administrator.
         * @param customTitle Custom title of the administrator.
         * @param isOwner True, if the user is the owner of the chat.
         */
        public ChatAdministrator(long userId, String customTitle, boolean isOwner) {
            this.userId = userId;
            this.customTitle = customTitle;
            this.isOwner = isOwner;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1920449836;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes rights of the administrator.
     */
    public static class ChatAdministratorRights extends Object {
        /**
         * True, if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report supergroup spam messages and ignore slow mode. Implied by any other privilege; applicable to supergroups and channels only.
         */
        public boolean canManageChat;
        /**
         * True, if the administrator can change the chat title, photo, and other settings.
         */
        public boolean canChangeInfo;
        /**
         * True, if the administrator can create channel posts or view channel statistics; applicable to channels only.
         */
        public boolean canPostMessages;
        /**
         * True, if the administrator can edit messages of other users and pin messages; applicable to channels only.
         */
        public boolean canEditMessages;
        /**
         * True, if the administrator can delete messages of other users.
         */
        public boolean canDeleteMessages;
        /**
         * True, if the administrator can invite new users to the chat.
         */
        public boolean canInviteUsers;
        /**
         * True, if the administrator can restrict, ban, or unban chat members or view supergroup statistics; always true for channels.
         */
        public boolean canRestrictMembers;
        /**
         * True, if the administrator can pin messages; applicable to basic groups and supergroups only.
         */
        public boolean canPinMessages;
        /**
         * True, if the administrator can create, rename, close, reopen, hide, and unhide forum topics; applicable to forum supergroups only.
         */
        public boolean canManageTopics;
        /**
         * True, if the administrator can add new administrators with a subset of their own privileges or demote administrators that were directly or indirectly promoted by them.
         */
        public boolean canPromoteMembers;
        /**
         * True, if the administrator can manage video chats.
         */
        public boolean canManageVideoChats;
        /**
         * True, if the administrator can create new chat stories, or edit and delete posted stories; applicable to supergroups and channels only.
         */
        public boolean canPostStories;
        /**
         * True, if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access story archive; applicable to supergroups and channels only.
         */
        public boolean canEditStories;
        /**
         * True, if the administrator can delete stories posted by other users; applicable to supergroups and channels only.
         */
        public boolean canDeleteStories;
        /**
         * True, if the administrator isn't shown in the chat member list and sends messages anonymously; applicable to supergroups only.
         */
        public boolean isAnonymous;

        /**
         * Describes rights of the administrator.
         */
        public ChatAdministratorRights() {
        }

        /**
         * Describes rights of the administrator.
         *
         * @param canManageChat True, if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report supergroup spam messages and ignore slow mode. Implied by any other privilege; applicable to supergroups and channels only.
         * @param canChangeInfo True, if the administrator can change the chat title, photo, and other settings.
         * @param canPostMessages True, if the administrator can create channel posts or view channel statistics; applicable to channels only.
         * @param canEditMessages True, if the administrator can edit messages of other users and pin messages; applicable to channels only.
         * @param canDeleteMessages True, if the administrator can delete messages of other users.
         * @param canInviteUsers True, if the administrator can invite new users to the chat.
         * @param canRestrictMembers True, if the administrator can restrict, ban, or unban chat members or view supergroup statistics; always true for channels.
         * @param canPinMessages True, if the administrator can pin messages; applicable to basic groups and supergroups only.
         * @param canManageTopics True, if the administrator can create, rename, close, reopen, hide, and unhide forum topics; applicable to forum supergroups only.
         * @param canPromoteMembers True, if the administrator can add new administrators with a subset of their own privileges or demote administrators that were directly or indirectly promoted by them.
         * @param canManageVideoChats True, if the administrator can manage video chats.
         * @param canPostStories True, if the administrator can create new chat stories, or edit and delete posted stories; applicable to supergroups and channels only.
         * @param canEditStories True, if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access story archive; applicable to supergroups and channels only.
         * @param canDeleteStories True, if the administrator can delete stories posted by other users; applicable to supergroups and channels only.
         * @param isAnonymous True, if the administrator isn't shown in the chat member list and sends messages anonymously; applicable to supergroups only.
         */
        public ChatAdministratorRights(boolean canManageChat, boolean canChangeInfo, boolean canPostMessages, boolean canEditMessages, boolean canDeleteMessages, boolean canInviteUsers, boolean canRestrictMembers, boolean canPinMessages, boolean canManageTopics, boolean canPromoteMembers, boolean canManageVideoChats, boolean canPostStories, boolean canEditStories, boolean canDeleteStories, boolean isAnonymous) {
            this.canManageChat = canManageChat;
            this.canChangeInfo = canChangeInfo;
            this.canPostMessages = canPostMessages;
            this.canEditMessages = canEditMessages;
            this.canDeleteMessages = canDeleteMessages;
            this.canInviteUsers = canInviteUsers;
            this.canRestrictMembers = canRestrictMembers;
            this.canPinMessages = canPinMessages;
            this.canManageTopics = canManageTopics;
            this.canPromoteMembers = canPromoteMembers;
            this.canManageVideoChats = canManageVideoChats;
            this.canPostStories = canPostStories;
            this.canEditStories = canEditStories;
            this.canDeleteStories = canDeleteStories;
            this.isAnonymous = isAnonymous;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1599049796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of chat administrators.
     */
    public static class ChatAdministrators extends Object {
        /**
         * A list of chat administrators.
         */
        public ChatAdministrator[] administrators;

        /**
         * Represents a list of chat administrators.
         */
        public ChatAdministrators() {
        }

        /**
         * Represents a list of chat administrators.
         *
         * @param administrators A list of chat administrators.
         */
        public ChatAdministrators(ChatAdministrator[] administrators) {
            this.administrators = administrators;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2126186435;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes reactions available in the chat.
     */
    public abstract static class ChatAvailableReactions extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatAvailableReactionsAll.CONSTRUCTOR,
            ChatAvailableReactionsSome.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatAvailableReactions() {
        }
    }

    /**
     * All reactions are available in the chat.
     */
    public static class ChatAvailableReactionsAll extends ChatAvailableReactions {
        /**
         * The maximum allowed number of reactions per message; 1-11.
         */
        public int maxReactionCount;

        /**
         * All reactions are available in the chat.
         */
        public ChatAvailableReactionsAll() {
        }

        /**
         * All reactions are available in the chat.
         *
         * @param maxReactionCount The maximum allowed number of reactions per message; 1-11.
         */
        public ChatAvailableReactionsAll(int maxReactionCount) {
            this.maxReactionCount = maxReactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 694160279;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Only specific reactions are available in the chat.
     */
    public static class ChatAvailableReactionsSome extends ChatAvailableReactions {
        /**
         * The list of reactions.
         */
        public ReactionType[] reactions;
        /**
         * The maximum allowed number of reactions per message; 1-11.
         */
        public int maxReactionCount;

        /**
         * Only specific reactions are available in the chat.
         */
        public ChatAvailableReactionsSome() {
        }

        /**
         * Only specific reactions are available in the chat.
         *
         * @param reactions The list of reactions.
         * @param maxReactionCount The maximum allowed number of reactions per message; 1-11.
         */
        public ChatAvailableReactionsSome(ReactionType[] reactions, int maxReactionCount) {
            this.reactions = reactions;
            this.maxReactionCount = maxReactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 152513153;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a background set for a specific chat.
     */
    public static class ChatBackground extends Object {
        /**
         * The background.
         */
        public Background background;
        /**
         * Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background.
         */
        public int darkThemeDimming;

        /**
         * Describes a background set for a specific chat.
         */
        public ChatBackground() {
        }

        /**
         * Describes a background set for a specific chat.
         *
         * @param background The background.
         * @param darkThemeDimming Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background.
         */
        public ChatBackground(Background background, int darkThemeDimming) {
            this.background = background;
            this.darkThemeDimming = darkThemeDimming;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1653152104;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a boost applied to a chat.
     */
    public static class ChatBoost extends Object {
        /**
         * Unique identifier of the boost.
         */
        public String id;
        /**
         * The number of identical boosts applied.
         */
        public int count;
        /**
         * Source of the boost.
         */
        public ChatBoostSource source;
        /**
         * Point in time (Unix timestamp) when the chat was boosted.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the boost will expire.
         */
        public int expirationDate;

        /**
         * Describes a boost applied to a chat.
         */
        public ChatBoost() {
        }

        /**
         * Describes a boost applied to a chat.
         *
         * @param id Unique identifier of the boost.
         * @param count The number of identical boosts applied.
         * @param source Source of the boost.
         * @param startDate Point in time (Unix timestamp) when the chat was boosted.
         * @param expirationDate Point in time (Unix timestamp) when the boost will expire.
         */
        public ChatBoost(String id, int count, ChatBoostSource source, int startDate, int expirationDate) {
            this.id = id;
            this.count = count;
            this.source = source;
            this.startDate = startDate;
            this.expirationDate = expirationDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1765815118;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of features available on the first chat boost levels.
     */
    public static class ChatBoostFeatures extends Object {
        /**
         * The list of features.
         */
        public ChatBoostLevelFeatures[] features;
        /**
         * The minimum boost level required to set custom emoji for profile background.
         */
        public int minProfileBackgroundCustomEmojiBoostLevel;
        /**
         * The minimum boost level required to set custom emoji for reply header and link preview background; for channel chats only.
         */
        public int minBackgroundCustomEmojiBoostLevel;
        /**
         * The minimum boost level required to set emoji status.
         */
        public int minEmojiStatusBoostLevel;
        /**
         * The minimum boost level required to set a chat theme background as chat background.
         */
        public int minChatThemeBackgroundBoostLevel;
        /**
         * The minimum boost level required to set custom chat background.
         */
        public int minCustomBackgroundBoostLevel;
        /**
         * The minimum boost level required to set custom emoji sticker set for the chat; for supergroup chats only.
         */
        public int minCustomEmojiStickerSetBoostLevel;
        /**
         * The minimum boost level allowing to recognize speech in video note and voice note messages for non-Premium users; for supergroup chats only.
         */
        public int minSpeechRecognitionBoostLevel;
        /**
         * The minimum boost level allowing to disable sponsored messages in the chat; for channel chats only.
         */
        public int minSponsoredMessageDisableBoostLevel;

        /**
         * Contains a list of features available on the first chat boost levels.
         */
        public ChatBoostFeatures() {
        }

        /**
         * Contains a list of features available on the first chat boost levels.
         *
         * @param features The list of features.
         * @param minProfileBackgroundCustomEmojiBoostLevel The minimum boost level required to set custom emoji for profile background.
         * @param minBackgroundCustomEmojiBoostLevel The minimum boost level required to set custom emoji for reply header and link preview background; for channel chats only.
         * @param minEmojiStatusBoostLevel The minimum boost level required to set emoji status.
         * @param minChatThemeBackgroundBoostLevel The minimum boost level required to set a chat theme background as chat background.
         * @param minCustomBackgroundBoostLevel The minimum boost level required to set custom chat background.
         * @param minCustomEmojiStickerSetBoostLevel The minimum boost level required to set custom emoji sticker set for the chat; for supergroup chats only.
         * @param minSpeechRecognitionBoostLevel The minimum boost level allowing to recognize speech in video note and voice note messages for non-Premium users; for supergroup chats only.
         * @param minSponsoredMessageDisableBoostLevel The minimum boost level allowing to disable sponsored messages in the chat; for channel chats only.
         */
        public ChatBoostFeatures(ChatBoostLevelFeatures[] features, int minProfileBackgroundCustomEmojiBoostLevel, int minBackgroundCustomEmojiBoostLevel, int minEmojiStatusBoostLevel, int minChatThemeBackgroundBoostLevel, int minCustomBackgroundBoostLevel, int minCustomEmojiStickerSetBoostLevel, int minSpeechRecognitionBoostLevel, int minSponsoredMessageDisableBoostLevel) {
            this.features = features;
            this.minProfileBackgroundCustomEmojiBoostLevel = minProfileBackgroundCustomEmojiBoostLevel;
            this.minBackgroundCustomEmojiBoostLevel = minBackgroundCustomEmojiBoostLevel;
            this.minEmojiStatusBoostLevel = minEmojiStatusBoostLevel;
            this.minChatThemeBackgroundBoostLevel = minChatThemeBackgroundBoostLevel;
            this.minCustomBackgroundBoostLevel = minCustomBackgroundBoostLevel;
            this.minCustomEmojiStickerSetBoostLevel = minCustomEmojiStickerSetBoostLevel;
            this.minSpeechRecognitionBoostLevel = minSpeechRecognitionBoostLevel;
            this.minSponsoredMessageDisableBoostLevel = minSponsoredMessageDisableBoostLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 866182642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of features available on a specific chat boost level.
     */
    public static class ChatBoostLevelFeatures extends Object {
        /**
         * Target chat boost level.
         */
        public int level;
        /**
         * Number of stories that the chat can publish daily.
         */
        public int storyPerDayCount;
        /**
         * Number of custom emoji reactions that can be added to the list of available reactions.
         */
        public int customEmojiReactionCount;
        /**
         * Number of custom colors for chat title.
         */
        public int titleColorCount;
        /**
         * Number of custom colors for profile photo background.
         */
        public int profileAccentColorCount;
        /**
         * True, if custom emoji for profile background can be set.
         */
        public boolean canSetProfileBackgroundCustomEmoji;
        /**
         * Number of custom colors for background of empty chat photo, replies to messages and link previews.
         */
        public int accentColorCount;
        /**
         * True, if custom emoji for reply header and link preview background can be set.
         */
        public boolean canSetBackgroundCustomEmoji;
        /**
         * True, if emoji status can be set.
         */
        public boolean canSetEmojiStatus;
        /**
         * Number of chat theme backgrounds that can be set as chat background.
         */
        public int chatThemeBackgroundCount;
        /**
         * True, if custom background can be set in the chat for all users.
         */
        public boolean canSetCustomBackground;
        /**
         * True, if custom emoji sticker set can be set for the chat.
         */
        public boolean canSetCustomEmojiStickerSet;
        /**
         * True, if speech recognition can be used for video note and voice note messages by all users.
         */
        public boolean canRecognizeSpeech;
        /**
         * True, if sponsored messages can be disabled in the chat.
         */
        public boolean canDisableSponsoredMessages;

        /**
         * Contains a list of features available on a specific chat boost level.
         */
        public ChatBoostLevelFeatures() {
        }

        /**
         * Contains a list of features available on a specific chat boost level.
         *
         * @param level Target chat boost level.
         * @param storyPerDayCount Number of stories that the chat can publish daily.
         * @param customEmojiReactionCount Number of custom emoji reactions that can be added to the list of available reactions.
         * @param titleColorCount Number of custom colors for chat title.
         * @param profileAccentColorCount Number of custom colors for profile photo background.
         * @param canSetProfileBackgroundCustomEmoji True, if custom emoji for profile background can be set.
         * @param accentColorCount Number of custom colors for background of empty chat photo, replies to messages and link previews.
         * @param canSetBackgroundCustomEmoji True, if custom emoji for reply header and link preview background can be set.
         * @param canSetEmojiStatus True, if emoji status can be set.
         * @param chatThemeBackgroundCount Number of chat theme backgrounds that can be set as chat background.
         * @param canSetCustomBackground True, if custom background can be set in the chat for all users.
         * @param canSetCustomEmojiStickerSet True, if custom emoji sticker set can be set for the chat.
         * @param canRecognizeSpeech True, if speech recognition can be used for video note and voice note messages by all users.
         * @param canDisableSponsoredMessages True, if sponsored messages can be disabled in the chat.
         */
        public ChatBoostLevelFeatures(int level, int storyPerDayCount, int customEmojiReactionCount, int titleColorCount, int profileAccentColorCount, boolean canSetProfileBackgroundCustomEmoji, int accentColorCount, boolean canSetBackgroundCustomEmoji, boolean canSetEmojiStatus, int chatThemeBackgroundCount, boolean canSetCustomBackground, boolean canSetCustomEmojiStickerSet, boolean canRecognizeSpeech, boolean canDisableSponsoredMessages) {
            this.level = level;
            this.storyPerDayCount = storyPerDayCount;
            this.customEmojiReactionCount = customEmojiReactionCount;
            this.titleColorCount = titleColorCount;
            this.profileAccentColorCount = profileAccentColorCount;
            this.canSetProfileBackgroundCustomEmoji = canSetProfileBackgroundCustomEmoji;
            this.accentColorCount = accentColorCount;
            this.canSetBackgroundCustomEmoji = canSetBackgroundCustomEmoji;
            this.canSetEmojiStatus = canSetEmojiStatus;
            this.chatThemeBackgroundCount = chatThemeBackgroundCount;
            this.canSetCustomBackground = canSetCustomBackground;
            this.canSetCustomEmojiStickerSet = canSetCustomEmojiStickerSet;
            this.canRecognizeSpeech = canRecognizeSpeech;
            this.canDisableSponsoredMessages = canDisableSponsoredMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -189458156;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an HTTPS link to boost a chat.
     */
    public static class ChatBoostLink extends Object {
        /**
         * The link.
         */
        public String link;
        /**
         * True, if the link will work for non-members of the chat.
         */
        public boolean isPublic;

        /**
         * Contains an HTTPS link to boost a chat.
         */
        public ChatBoostLink() {
        }

        /**
         * Contains an HTTPS link to boost a chat.
         *
         * @param link The link.
         * @param isPublic True, if the link will work for non-members of the chat.
         */
        public ChatBoostLink(String link, boolean isPublic) {
            this.link = link;
            this.isPublic = isPublic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1253999503;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a link to boost a chat.
     */
    public static class ChatBoostLinkInfo extends Object {
        /**
         * True, if the link will work for non-members of the chat.
         */
        public boolean isPublic;
        /**
         * Identifier of the chat to which the link points; 0 if the chat isn't found.
         */
        public long chatId;

        /**
         * Contains information about a link to boost a chat.
         */
        public ChatBoostLinkInfo() {
        }

        /**
         * Contains information about a link to boost a chat.
         *
         * @param isPublic True, if the link will work for non-members of the chat.
         * @param chatId Identifier of the chat to which the link points; 0 if the chat isn't found.
         */
        public ChatBoostLinkInfo(boolean isPublic, long chatId) {
            this.isPublic = isPublic;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -602785660;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a slot for chat boost.
     */
    public static class ChatBoostSlot extends Object {
        /**
         * Unique identifier of the slot.
         */
        public int slotId;
        /**
         * Identifier of the currently boosted chat; 0 if none.
         */
        public long currentlyBoostedChatId;
        /**
         * Point in time (Unix timestamp) when the chat was boosted; 0 if none.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the boost will expire.
         */
        public int expirationDate;
        /**
         * Point in time (Unix timestamp) after which the boost can be used for another chat.
         */
        public int cooldownUntilDate;

        /**
         * Describes a slot for chat boost.
         */
        public ChatBoostSlot() {
        }

        /**
         * Describes a slot for chat boost.
         *
         * @param slotId Unique identifier of the slot.
         * @param currentlyBoostedChatId Identifier of the currently boosted chat; 0 if none.
         * @param startDate Point in time (Unix timestamp) when the chat was boosted; 0 if none.
         * @param expirationDate Point in time (Unix timestamp) when the boost will expire.
         * @param cooldownUntilDate Point in time (Unix timestamp) after which the boost can be used for another chat.
         */
        public ChatBoostSlot(int slotId, long currentlyBoostedChatId, int startDate, int expirationDate, int cooldownUntilDate) {
            this.slotId = slotId;
            this.currentlyBoostedChatId = currentlyBoostedChatId;
            this.startDate = startDate;
            this.expirationDate = expirationDate;
            this.cooldownUntilDate = cooldownUntilDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 123206343;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat boost slots.
     */
    public static class ChatBoostSlots extends Object {
        /**
         * List of boost slots.
         */
        public ChatBoostSlot[] slots;

        /**
         * Contains a list of chat boost slots.
         */
        public ChatBoostSlots() {
        }

        /**
         * Contains a list of chat boost slots.
         *
         * @param slots List of boost slots.
         */
        public ChatBoostSlots(ChatBoostSlot[] slots) {
            this.slots = slots;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1014966293;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes source of a chat boost.
     */
    public abstract static class ChatBoostSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatBoostSourceGiftCode.CONSTRUCTOR,
            ChatBoostSourceGiveaway.CONSTRUCTOR,
            ChatBoostSourcePremium.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatBoostSource() {
        }
    }

    /**
     * The chat created a Telegram Premium gift code for a user.
     */
    public static class ChatBoostSourceGiftCode extends ChatBoostSource {
        /**
         * Identifier of a user, for which the gift code was created.
         */
        public long userId;
        /**
         * The created Telegram Premium gift code, which is known only if this is a gift code for the current user, or it has already been claimed.
         */
        public String giftCode;

        /**
         * The chat created a Telegram Premium gift code for a user.
         */
        public ChatBoostSourceGiftCode() {
        }

        /**
         * The chat created a Telegram Premium gift code for a user.
         *
         * @param userId Identifier of a user, for which the gift code was created.
         * @param giftCode The created Telegram Premium gift code, which is known only if this is a gift code for the current user, or it has already been claimed.
         */
        public ChatBoostSourceGiftCode(long userId, String giftCode) {
            this.userId = userId;
            this.giftCode = giftCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -98299206;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat created a Telegram Premium giveaway.
     */
    public static class ChatBoostSourceGiveaway extends ChatBoostSource {
        /**
         * Identifier of a user that won in the giveaway; 0 if none.
         */
        public long userId;
        /**
         * The created Telegram Premium gift code if it was used by the user or can be claimed by the current user; an empty string otherwise.
         */
        public String giftCode;
        /**
         * Identifier of the corresponding giveaway message; can be an identifier of a deleted message.
         */
        public long giveawayMessageId;
        /**
         * True, if the winner for the corresponding Telegram Premium subscription wasn't chosen, because there were not enough participants.
         */
        public boolean isUnclaimed;

        /**
         * The chat created a Telegram Premium giveaway.
         */
        public ChatBoostSourceGiveaway() {
        }

        /**
         * The chat created a Telegram Premium giveaway.
         *
         * @param userId Identifier of a user that won in the giveaway; 0 if none.
         * @param giftCode The created Telegram Premium gift code if it was used by the user or can be claimed by the current user; an empty string otherwise.
         * @param giveawayMessageId Identifier of the corresponding giveaway message; can be an identifier of a deleted message.
         * @param isUnclaimed True, if the winner for the corresponding Telegram Premium subscription wasn't chosen, because there were not enough participants.
         */
        public ChatBoostSourceGiveaway(long userId, String giftCode, long giveawayMessageId, boolean isUnclaimed) {
            this.userId = userId;
            this.giftCode = giftCode;
            this.giveawayMessageId = giveawayMessageId;
            this.isUnclaimed = isUnclaimed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 151854192;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user with Telegram Premium subscription or gifted Telegram Premium boosted the chat.
     */
    public static class ChatBoostSourcePremium extends ChatBoostSource {
        /**
         * Identifier of the user.
         */
        public long userId;

        /**
         * A user with Telegram Premium subscription or gifted Telegram Premium boosted the chat.
         */
        public ChatBoostSourcePremium() {
        }

        /**
         * A user with Telegram Premium subscription or gifted Telegram Premium boosted the chat.
         *
         * @param userId Identifier of the user.
         */
        public ChatBoostSourcePremium(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 972011;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes current boost status of a chat.
     */
    public static class ChatBoostStatus extends Object {
        /**
         * An HTTP URL, which can be used to boost the chat.
         */
        public String boostUrl;
        /**
         * Identifiers of boost slots of the current user applied to the chat.
         */
        public int[] appliedSlotIds;
        /**
         * Current boost level of the chat.
         */
        public int level;
        /**
         * The number of boosts received by the chat from created Telegram Premium gift codes and giveaways; always 0 if the current user isn't an administrator in the chat.
         */
        public int giftCodeBoostCount;
        /**
         * The number of boosts received by the chat.
         */
        public int boostCount;
        /**
         * The number of boosts added to reach the current level.
         */
        public int currentLevelBoostCount;
        /**
         * The number of boosts needed to reach the next level; 0 if the next level isn't available.
         */
        public int nextLevelBoostCount;
        /**
         * Approximate number of Telegram Premium subscribers joined the chat; always 0 if the current user isn't an administrator in the chat.
         */
        public int premiumMemberCount;
        /**
         * A percentage of Telegram Premium subscribers joined the chat; always 0 if the current user isn't an administrator in the chat.
         */
        public double premiumMemberPercentage;
        /**
         * The list of prepaid giveaways available for the chat; only for chat administrators.
         */
        public PrepaidPremiumGiveaway[] prepaidGiveaways;

        /**
         * Describes current boost status of a chat.
         */
        public ChatBoostStatus() {
        }

        /**
         * Describes current boost status of a chat.
         *
         * @param boostUrl An HTTP URL, which can be used to boost the chat.
         * @param appliedSlotIds Identifiers of boost slots of the current user applied to the chat.
         * @param level Current boost level of the chat.
         * @param giftCodeBoostCount The number of boosts received by the chat from created Telegram Premium gift codes and giveaways; always 0 if the current user isn't an administrator in the chat.
         * @param boostCount The number of boosts received by the chat.
         * @param currentLevelBoostCount The number of boosts added to reach the current level.
         * @param nextLevelBoostCount The number of boosts needed to reach the next level; 0 if the next level isn't available.
         * @param premiumMemberCount Approximate number of Telegram Premium subscribers joined the chat; always 0 if the current user isn't an administrator in the chat.
         * @param premiumMemberPercentage A percentage of Telegram Premium subscribers joined the chat; always 0 if the current user isn't an administrator in the chat.
         * @param prepaidGiveaways The list of prepaid giveaways available for the chat; only for chat administrators.
         */
        public ChatBoostStatus(String boostUrl, int[] appliedSlotIds, int level, int giftCodeBoostCount, int boostCount, int currentLevelBoostCount, int nextLevelBoostCount, int premiumMemberCount, double premiumMemberPercentage, PrepaidPremiumGiveaway[] prepaidGiveaways) {
            this.boostUrl = boostUrl;
            this.appliedSlotIds = appliedSlotIds;
            this.level = level;
            this.giftCodeBoostCount = giftCodeBoostCount;
            this.boostCount = boostCount;
            this.currentLevelBoostCount = currentLevelBoostCount;
            this.nextLevelBoostCount = nextLevelBoostCount;
            this.premiumMemberCount = premiumMemberCount;
            this.premiumMemberPercentage = premiumMemberPercentage;
            this.prepaidGiveaways = prepaidGiveaways;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -347168798;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a chat event.
     */
    public static class ChatEvent extends Object {
        /**
         * Chat event identifier.
         */
        public long id;
        /**
         * Point in time (Unix timestamp) when the event happened.
         */
        public int date;
        /**
         * Identifier of the user or chat who performed the action.
         */
        public MessageSender memberId;
        /**
         * The action.
         */
        public ChatEventAction action;

        /**
         * Represents a chat event.
         */
        public ChatEvent() {
        }

        /**
         * Represents a chat event.
         *
         * @param id Chat event identifier.
         * @param date Point in time (Unix timestamp) when the event happened.
         * @param memberId Identifier of the user or chat who performed the action.
         * @param action The action.
         */
        public ChatEvent(long id, int date, MessageSender memberId, ChatEventAction action) {
            this.id = id;
            this.date = date;
            this.memberId = memberId;
            this.action = action;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -652102704;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a chat event.
     */
    public abstract static class ChatEventAction extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatEventMessageEdited.CONSTRUCTOR,
            ChatEventMessageDeleted.CONSTRUCTOR,
            ChatEventMessagePinned.CONSTRUCTOR,
            ChatEventMessageUnpinned.CONSTRUCTOR,
            ChatEventPollStopped.CONSTRUCTOR,
            ChatEventMemberJoined.CONSTRUCTOR,
            ChatEventMemberJoinedByInviteLink.CONSTRUCTOR,
            ChatEventMemberJoinedByRequest.CONSTRUCTOR,
            ChatEventMemberInvited.CONSTRUCTOR,
            ChatEventMemberLeft.CONSTRUCTOR,
            ChatEventMemberPromoted.CONSTRUCTOR,
            ChatEventMemberRestricted.CONSTRUCTOR,
            ChatEventAvailableReactionsChanged.CONSTRUCTOR,
            ChatEventBackgroundChanged.CONSTRUCTOR,
            ChatEventDescriptionChanged.CONSTRUCTOR,
            ChatEventEmojiStatusChanged.CONSTRUCTOR,
            ChatEventLinkedChatChanged.CONSTRUCTOR,
            ChatEventLocationChanged.CONSTRUCTOR,
            ChatEventMessageAutoDeleteTimeChanged.CONSTRUCTOR,
            ChatEventPermissionsChanged.CONSTRUCTOR,
            ChatEventPhotoChanged.CONSTRUCTOR,
            ChatEventSlowModeDelayChanged.CONSTRUCTOR,
            ChatEventStickerSetChanged.CONSTRUCTOR,
            ChatEventCustomEmojiStickerSetChanged.CONSTRUCTOR,
            ChatEventTitleChanged.CONSTRUCTOR,
            ChatEventUsernameChanged.CONSTRUCTOR,
            ChatEventActiveUsernamesChanged.CONSTRUCTOR,
            ChatEventAccentColorChanged.CONSTRUCTOR,
            ChatEventProfileAccentColorChanged.CONSTRUCTOR,
            ChatEventHasProtectedContentToggled.CONSTRUCTOR,
            ChatEventInvitesToggled.CONSTRUCTOR,
            ChatEventIsAllHistoryAvailableToggled.CONSTRUCTOR,
            ChatEventHasAggressiveAntiSpamEnabledToggled.CONSTRUCTOR,
            ChatEventSignMessagesToggled.CONSTRUCTOR,
            ChatEventInviteLinkEdited.CONSTRUCTOR,
            ChatEventInviteLinkRevoked.CONSTRUCTOR,
            ChatEventInviteLinkDeleted.CONSTRUCTOR,
            ChatEventVideoChatCreated.CONSTRUCTOR,
            ChatEventVideoChatEnded.CONSTRUCTOR,
            ChatEventVideoChatMuteNewParticipantsToggled.CONSTRUCTOR,
            ChatEventVideoChatParticipantIsMutedToggled.CONSTRUCTOR,
            ChatEventVideoChatParticipantVolumeLevelChanged.CONSTRUCTOR,
            ChatEventIsForumToggled.CONSTRUCTOR,
            ChatEventForumTopicCreated.CONSTRUCTOR,
            ChatEventForumTopicEdited.CONSTRUCTOR,
            ChatEventForumTopicToggleIsClosed.CONSTRUCTOR,
            ChatEventForumTopicToggleIsHidden.CONSTRUCTOR,
            ChatEventForumTopicDeleted.CONSTRUCTOR,
            ChatEventForumTopicPinned.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatEventAction() {
        }
    }

    /**
     * A message was edited.
     */
    public static class ChatEventMessageEdited extends ChatEventAction {
        /**
         * The original message before the edit.
         */
        public Message oldMessage;
        /**
         * The message after it was edited.
         */
        public Message newMessage;

        /**
         * A message was edited.
         */
        public ChatEventMessageEdited() {
        }

        /**
         * A message was edited.
         *
         * @param oldMessage The original message before the edit.
         * @param newMessage The message after it was edited.
         */
        public ChatEventMessageEdited(Message oldMessage, Message newMessage) {
            this.oldMessage = oldMessage;
            this.newMessage = newMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -430967304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was deleted.
     */
    public static class ChatEventMessageDeleted extends ChatEventAction {
        /**
         * Deleted message.
         */
        public Message message;
        /**
         * True, if the message deletion can be reported via reportSupergroupAntiSpamFalsePositive.
         */
        public boolean canReportAntiSpamFalsePositive;

        /**
         * A message was deleted.
         */
        public ChatEventMessageDeleted() {
        }

        /**
         * A message was deleted.
         *
         * @param message Deleted message.
         * @param canReportAntiSpamFalsePositive True, if the message deletion can be reported via reportSupergroupAntiSpamFalsePositive.
         */
        public ChatEventMessageDeleted(Message message, boolean canReportAntiSpamFalsePositive) {
            this.message = message;
            this.canReportAntiSpamFalsePositive = canReportAntiSpamFalsePositive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 935316851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was pinned.
     */
    public static class ChatEventMessagePinned extends ChatEventAction {
        /**
         * Pinned message.
         */
        public Message message;

        /**
         * A message was pinned.
         */
        public ChatEventMessagePinned() {
        }

        /**
         * A message was pinned.
         *
         * @param message Pinned message.
         */
        public ChatEventMessagePinned(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 438742298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was unpinned.
     */
    public static class ChatEventMessageUnpinned extends ChatEventAction {
        /**
         * Unpinned message.
         */
        public Message message;

        /**
         * A message was unpinned.
         */
        public ChatEventMessageUnpinned() {
        }

        /**
         * A message was unpinned.
         *
         * @param message Unpinned message.
         */
        public ChatEventMessageUnpinned(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -376161513;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A poll in a message was stopped.
     */
    public static class ChatEventPollStopped extends ChatEventAction {
        /**
         * The message with the poll.
         */
        public Message message;

        /**
         * A poll in a message was stopped.
         */
        public ChatEventPollStopped() {
        }

        /**
         * A poll in a message was stopped.
         *
         * @param message The message with the poll.
         */
        public ChatEventPollStopped(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2009893861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member joined the chat.
     */
    public static class ChatEventMemberJoined extends ChatEventAction {

        /**
         * A new member joined the chat.
         */
        public ChatEventMemberJoined() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -235468508;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member joined the chat via an invite link.
     */
    public static class ChatEventMemberJoinedByInviteLink extends ChatEventAction {
        /**
         * Invite link used to join the chat.
         */
        public ChatInviteLink inviteLink;
        /**
         * True, if the user has joined the chat using an invite link for a chat folder.
         */
        public boolean viaChatFolderInviteLink;

        /**
         * A new member joined the chat via an invite link.
         */
        public ChatEventMemberJoinedByInviteLink() {
        }

        /**
         * A new member joined the chat via an invite link.
         *
         * @param inviteLink Invite link used to join the chat.
         * @param viaChatFolderInviteLink True, if the user has joined the chat using an invite link for a chat folder.
         */
        public ChatEventMemberJoinedByInviteLink(ChatInviteLink inviteLink, boolean viaChatFolderInviteLink) {
            this.inviteLink = inviteLink;
            this.viaChatFolderInviteLink = viaChatFolderInviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1445536390;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member was accepted to the chat by an administrator.
     */
    public static class ChatEventMemberJoinedByRequest extends ChatEventAction {
        /**
         * User identifier of the chat administrator, approved user join request.
         */
        public long approverUserId;
        /**
         * Invite link used to join the chat; may be null.
         */
        @Nullable public ChatInviteLink inviteLink;

        /**
         * A new member was accepted to the chat by an administrator.
         */
        public ChatEventMemberJoinedByRequest() {
        }

        /**
         * A new member was accepted to the chat by an administrator.
         *
         * @param approverUserId User identifier of the chat administrator, approved user join request.
         * @param inviteLink Invite link used to join the chat; may be null.
         */
        public ChatEventMemberJoinedByRequest(long approverUserId, ChatInviteLink inviteLink) {
            this.approverUserId = approverUserId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1647804865;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new chat member was invited.
     */
    public static class ChatEventMemberInvited extends ChatEventAction {
        /**
         * New member user identifier.
         */
        public long userId;
        /**
         * New member status.
         */
        public ChatMemberStatus status;

        /**
         * A new chat member was invited.
         */
        public ChatEventMemberInvited() {
        }

        /**
         * A new chat member was invited.
         *
         * @param userId New member user identifier.
         * @param status New member status.
         */
        public ChatEventMemberInvited(long userId, ChatMemberStatus status) {
            this.userId = userId;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 953663433;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A member left the chat.
     */
    public static class ChatEventMemberLeft extends ChatEventAction {

        /**
         * A member left the chat.
         */
        public ChatEventMemberLeft() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -948420593;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member has gained/lost administrator status, or the list of their administrator privileges has changed.
     */
    public static class ChatEventMemberPromoted extends ChatEventAction {
        /**
         * Affected chat member user identifier.
         */
        public long userId;
        /**
         * Previous status of the chat member.
         */
        public ChatMemberStatus oldStatus;
        /**
         * New status of the chat member.
         */
        public ChatMemberStatus newStatus;

        /**
         * A chat member has gained/lost administrator status, or the list of their administrator privileges has changed.
         */
        public ChatEventMemberPromoted() {
        }

        /**
         * A chat member has gained/lost administrator status, or the list of their administrator privileges has changed.
         *
         * @param userId Affected chat member user identifier.
         * @param oldStatus Previous status of the chat member.
         * @param newStatus New status of the chat member.
         */
        public ChatEventMemberPromoted(long userId, ChatMemberStatus oldStatus, ChatMemberStatus newStatus) {
            this.userId = userId;
            this.oldStatus = oldStatus;
            this.newStatus = newStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 525297761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed.
     */
    public static class ChatEventMemberRestricted extends ChatEventAction {
        /**
         * Affected chat member identifier.
         */
        public MessageSender memberId;
        /**
         * Previous status of the chat member.
         */
        public ChatMemberStatus oldStatus;
        /**
         * New status of the chat member.
         */
        public ChatMemberStatus newStatus;

        /**
         * A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed.
         */
        public ChatEventMemberRestricted() {
        }

        /**
         * A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed.
         *
         * @param memberId Affected chat member identifier.
         * @param oldStatus Previous status of the chat member.
         * @param newStatus New status of the chat member.
         */
        public ChatEventMemberRestricted(MessageSender memberId, ChatMemberStatus oldStatus, ChatMemberStatus newStatus) {
            this.memberId = memberId;
            this.oldStatus = oldStatus;
            this.newStatus = newStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1603608069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat available reactions were changed.
     */
    public static class ChatEventAvailableReactionsChanged extends ChatEventAction {
        /**
         * Previous chat available reactions.
         */
        public ChatAvailableReactions oldAvailableReactions;
        /**
         * New chat available reactions.
         */
        public ChatAvailableReactions newAvailableReactions;

        /**
         * The chat available reactions were changed.
         */
        public ChatEventAvailableReactionsChanged() {
        }

        /**
         * The chat available reactions were changed.
         *
         * @param oldAvailableReactions Previous chat available reactions.
         * @param newAvailableReactions New chat available reactions.
         */
        public ChatEventAvailableReactionsChanged(ChatAvailableReactions oldAvailableReactions, ChatAvailableReactions newAvailableReactions) {
            this.oldAvailableReactions = oldAvailableReactions;
            this.newAvailableReactions = newAvailableReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1749491521;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat background was changed.
     */
    public static class ChatEventBackgroundChanged extends ChatEventAction {
        /**
         * Previous background; may be null if none.
         */
        @Nullable public ChatBackground oldBackground;
        /**
         * New background; may be null if none.
         */
        @Nullable public ChatBackground newBackground;

        /**
         * The chat background was changed.
         */
        public ChatEventBackgroundChanged() {
        }

        /**
         * The chat background was changed.
         *
         * @param oldBackground Previous background; may be null if none.
         * @param newBackground New background; may be null if none.
         */
        public ChatEventBackgroundChanged(ChatBackground oldBackground, ChatBackground newBackground) {
            this.oldBackground = oldBackground;
            this.newBackground = newBackground;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1225953992;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat description was changed.
     */
    public static class ChatEventDescriptionChanged extends ChatEventAction {
        /**
         * Previous chat description.
         */
        public String oldDescription;
        /**
         * New chat description.
         */
        public String newDescription;

        /**
         * The chat description was changed.
         */
        public ChatEventDescriptionChanged() {
        }

        /**
         * The chat description was changed.
         *
         * @param oldDescription Previous chat description.
         * @param newDescription New chat description.
         */
        public ChatEventDescriptionChanged(String oldDescription, String newDescription) {
            this.oldDescription = oldDescription;
            this.newDescription = newDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 39112478;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat emoji status was changed.
     */
    public static class ChatEventEmojiStatusChanged extends ChatEventAction {
        /**
         * Previous emoji status; may be null if none.
         */
        @Nullable public EmojiStatus oldEmojiStatus;
        /**
         * New emoji status; may be null if none.
         */
        @Nullable public EmojiStatus newEmojiStatus;

        /**
         * The chat emoji status was changed.
         */
        public ChatEventEmojiStatusChanged() {
        }

        /**
         * The chat emoji status was changed.
         *
         * @param oldEmojiStatus Previous emoji status; may be null if none.
         * @param newEmojiStatus New emoji status; may be null if none.
         */
        public ChatEventEmojiStatusChanged(EmojiStatus oldEmojiStatus, EmojiStatus newEmojiStatus) {
            this.oldEmojiStatus = oldEmojiStatus;
            this.newEmojiStatus = newEmojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2081850594;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The linked chat of a supergroup was changed.
     */
    public static class ChatEventLinkedChatChanged extends ChatEventAction {
        /**
         * Previous supergroup linked chat identifier.
         */
        public long oldLinkedChatId;
        /**
         * New supergroup linked chat identifier.
         */
        public long newLinkedChatId;

        /**
         * The linked chat of a supergroup was changed.
         */
        public ChatEventLinkedChatChanged() {
        }

        /**
         * The linked chat of a supergroup was changed.
         *
         * @param oldLinkedChatId Previous supergroup linked chat identifier.
         * @param newLinkedChatId New supergroup linked chat identifier.
         */
        public ChatEventLinkedChatChanged(long oldLinkedChatId, long newLinkedChatId) {
            this.oldLinkedChatId = oldLinkedChatId;
            this.newLinkedChatId = newLinkedChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1797419439;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The supergroup location was changed.
     */
    public static class ChatEventLocationChanged extends ChatEventAction {
        /**
         * Previous location; may be null.
         */
        @Nullable public ChatLocation oldLocation;
        /**
         * New location; may be null.
         */
        @Nullable public ChatLocation newLocation;

        /**
         * The supergroup location was changed.
         */
        public ChatEventLocationChanged() {
        }

        /**
         * The supergroup location was changed.
         *
         * @param oldLocation Previous location; may be null.
         * @param newLocation New location; may be null.
         */
        public ChatEventLocationChanged(ChatLocation oldLocation, ChatLocation newLocation) {
            this.oldLocation = oldLocation;
            this.newLocation = newLocation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -405930674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message auto-delete timer was changed.
     */
    public static class ChatEventMessageAutoDeleteTimeChanged extends ChatEventAction {
        /**
         * Previous value of messageAutoDeleteTime.
         */
        public int oldMessageAutoDeleteTime;
        /**
         * New value of messageAutoDeleteTime.
         */
        public int newMessageAutoDeleteTime;

        /**
         * The message auto-delete timer was changed.
         */
        public ChatEventMessageAutoDeleteTimeChanged() {
        }

        /**
         * The message auto-delete timer was changed.
         *
         * @param oldMessageAutoDeleteTime Previous value of messageAutoDeleteTime.
         * @param newMessageAutoDeleteTime New value of messageAutoDeleteTime.
         */
        public ChatEventMessageAutoDeleteTimeChanged(int oldMessageAutoDeleteTime, int newMessageAutoDeleteTime) {
            this.oldMessageAutoDeleteTime = oldMessageAutoDeleteTime;
            this.newMessageAutoDeleteTime = newMessageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 17317668;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat permissions were changed.
     */
    public static class ChatEventPermissionsChanged extends ChatEventAction {
        /**
         * Previous chat permissions.
         */
        public ChatPermissions oldPermissions;
        /**
         * New chat permissions.
         */
        public ChatPermissions newPermissions;

        /**
         * The chat permissions were changed.
         */
        public ChatEventPermissionsChanged() {
        }

        /**
         * The chat permissions were changed.
         *
         * @param oldPermissions Previous chat permissions.
         * @param newPermissions New chat permissions.
         */
        public ChatEventPermissionsChanged(ChatPermissions oldPermissions, ChatPermissions newPermissions) {
            this.oldPermissions = oldPermissions;
            this.newPermissions = newPermissions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1311557720;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat photo was changed.
     */
    public static class ChatEventPhotoChanged extends ChatEventAction {
        /**
         * Previous chat photo value; may be null.
         */
        @Nullable public ChatPhoto oldPhoto;
        /**
         * New chat photo value; may be null.
         */
        @Nullable public ChatPhoto newPhoto;

        /**
         * The chat photo was changed.
         */
        public ChatEventPhotoChanged() {
        }

        /**
         * The chat photo was changed.
         *
         * @param oldPhoto Previous chat photo value; may be null.
         * @param newPhoto New chat photo value; may be null.
         */
        public ChatEventPhotoChanged(ChatPhoto oldPhoto, ChatPhoto newPhoto) {
            this.oldPhoto = oldPhoto;
            this.newPhoto = newPhoto;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -811572541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The slowModeDelay setting of a supergroup was changed.
     */
    public static class ChatEventSlowModeDelayChanged extends ChatEventAction {
        /**
         * Previous value of slowModeDelay, in seconds.
         */
        public int oldSlowModeDelay;
        /**
         * New value of slowModeDelay, in seconds.
         */
        public int newSlowModeDelay;

        /**
         * The slowModeDelay setting of a supergroup was changed.
         */
        public ChatEventSlowModeDelayChanged() {
        }

        /**
         * The slowModeDelay setting of a supergroup was changed.
         *
         * @param oldSlowModeDelay Previous value of slowModeDelay, in seconds.
         * @param newSlowModeDelay New value of slowModeDelay, in seconds.
         */
        public ChatEventSlowModeDelayChanged(int oldSlowModeDelay, int newSlowModeDelay) {
            this.oldSlowModeDelay = oldSlowModeDelay;
            this.newSlowModeDelay = newSlowModeDelay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1653195765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The supergroup sticker set was changed.
     */
    public static class ChatEventStickerSetChanged extends ChatEventAction {
        /**
         * Previous identifier of the chat sticker set; 0 if none.
         */
        public long oldStickerSetId;
        /**
         * New identifier of the chat sticker set; 0 if none.
         */
        public long newStickerSetId;

        /**
         * The supergroup sticker set was changed.
         */
        public ChatEventStickerSetChanged() {
        }

        /**
         * The supergroup sticker set was changed.
         *
         * @param oldStickerSetId Previous identifier of the chat sticker set; 0 if none.
         * @param newStickerSetId New identifier of the chat sticker set; 0 if none.
         */
        public ChatEventStickerSetChanged(long oldStickerSetId, long newStickerSetId) {
            this.oldStickerSetId = oldStickerSetId;
            this.newStickerSetId = newStickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1243130481;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The supergroup sticker set with allowed custom emoji was changed.
     */
    public static class ChatEventCustomEmojiStickerSetChanged extends ChatEventAction {
        /**
         * Previous identifier of the chat sticker set; 0 if none.
         */
        public long oldStickerSetId;
        /**
         * New identifier of the chat sticker set; 0 if none.
         */
        public long newStickerSetId;

        /**
         * The supergroup sticker set with allowed custom emoji was changed.
         */
        public ChatEventCustomEmojiStickerSetChanged() {
        }

        /**
         * The supergroup sticker set with allowed custom emoji was changed.
         *
         * @param oldStickerSetId Previous identifier of the chat sticker set; 0 if none.
         * @param newStickerSetId New identifier of the chat sticker set; 0 if none.
         */
        public ChatEventCustomEmojiStickerSetChanged(long oldStickerSetId, long newStickerSetId) {
            this.oldStickerSetId = oldStickerSetId;
            this.newStickerSetId = newStickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 118244123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat title was changed.
     */
    public static class ChatEventTitleChanged extends ChatEventAction {
        /**
         * Previous chat title.
         */
        public String oldTitle;
        /**
         * New chat title.
         */
        public String newTitle;

        /**
         * The chat title was changed.
         */
        public ChatEventTitleChanged() {
        }

        /**
         * The chat title was changed.
         *
         * @param oldTitle Previous chat title.
         * @param newTitle New chat title.
         */
        public ChatEventTitleChanged(String oldTitle, String newTitle) {
            this.oldTitle = oldTitle;
            this.newTitle = newTitle;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1134103250;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat editable username was changed.
     */
    public static class ChatEventUsernameChanged extends ChatEventAction {
        /**
         * Previous chat username.
         */
        public String oldUsername;
        /**
         * New chat username.
         */
        public String newUsername;

        /**
         * The chat editable username was changed.
         */
        public ChatEventUsernameChanged() {
        }

        /**
         * The chat editable username was changed.
         *
         * @param oldUsername Previous chat username.
         * @param newUsername New chat username.
         */
        public ChatEventUsernameChanged(String oldUsername, String newUsername) {
            this.oldUsername = oldUsername;
            this.newUsername = newUsername;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1728558443;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat active usernames were changed.
     */
    public static class ChatEventActiveUsernamesChanged extends ChatEventAction {
        /**
         * Previous list of active usernames.
         */
        public String[] oldUsernames;
        /**
         * New list of active usernames.
         */
        public String[] newUsernames;

        /**
         * The chat active usernames were changed.
         */
        public ChatEventActiveUsernamesChanged() {
        }

        /**
         * The chat active usernames were changed.
         *
         * @param oldUsernames Previous list of active usernames.
         * @param newUsernames New list of active usernames.
         */
        public ChatEventActiveUsernamesChanged(String[] oldUsernames, String[] newUsernames) {
            this.oldUsernames = oldUsernames;
            this.newUsernames = newUsernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1508790810;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat accent color or background custom emoji were changed.
     */
    public static class ChatEventAccentColorChanged extends ChatEventAction {
        /**
         * Previous identifier of chat accent color.
         */
        public int oldAccentColorId;
        /**
         * Previous identifier of the custom emoji; 0 if none.
         */
        public long oldBackgroundCustomEmojiId;
        /**
         * New identifier of chat accent color.
         */
        public int newAccentColorId;
        /**
         * New identifier of the custom emoji; 0 if none.
         */
        public long newBackgroundCustomEmojiId;

        /**
         * The chat accent color or background custom emoji were changed.
         */
        public ChatEventAccentColorChanged() {
        }

        /**
         * The chat accent color or background custom emoji were changed.
         *
         * @param oldAccentColorId Previous identifier of chat accent color.
         * @param oldBackgroundCustomEmojiId Previous identifier of the custom emoji; 0 if none.
         * @param newAccentColorId New identifier of chat accent color.
         * @param newBackgroundCustomEmojiId New identifier of the custom emoji; 0 if none.
         */
        public ChatEventAccentColorChanged(int oldAccentColorId, long oldBackgroundCustomEmojiId, int newAccentColorId, long newBackgroundCustomEmojiId) {
            this.oldAccentColorId = oldAccentColorId;
            this.oldBackgroundCustomEmojiId = oldBackgroundCustomEmojiId;
            this.newAccentColorId = newAccentColorId;
            this.newBackgroundCustomEmojiId = newBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -427591885;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat's profile accent color or profile background custom emoji were changed.
     */
    public static class ChatEventProfileAccentColorChanged extends ChatEventAction {
        /**
         * Previous identifier of chat's profile accent color; -1 if none.
         */
        public int oldProfileAccentColorId;
        /**
         * Previous identifier of the custom emoji; 0 if none.
         */
        public long oldProfileBackgroundCustomEmojiId;
        /**
         * New identifier of chat's profile accent color; -1 if none.
         */
        public int newProfileAccentColorId;
        /**
         * New identifier of the custom emoji; 0 if none.
         */
        public long newProfileBackgroundCustomEmojiId;

        /**
         * The chat's profile accent color or profile background custom emoji were changed.
         */
        public ChatEventProfileAccentColorChanged() {
        }

        /**
         * The chat's profile accent color or profile background custom emoji were changed.
         *
         * @param oldProfileAccentColorId Previous identifier of chat's profile accent color; -1 if none.
         * @param oldProfileBackgroundCustomEmojiId Previous identifier of the custom emoji; 0 if none.
         * @param newProfileAccentColorId New identifier of chat's profile accent color; -1 if none.
         * @param newProfileBackgroundCustomEmojiId New identifier of the custom emoji; 0 if none.
         */
        public ChatEventProfileAccentColorChanged(int oldProfileAccentColorId, long oldProfileBackgroundCustomEmojiId, int newProfileAccentColorId, long newProfileBackgroundCustomEmojiId) {
            this.oldProfileAccentColorId = oldProfileAccentColorId;
            this.oldProfileBackgroundCustomEmojiId = oldProfileBackgroundCustomEmojiId;
            this.newProfileAccentColorId = newProfileAccentColorId;
            this.newProfileBackgroundCustomEmojiId = newProfileBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1514612124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The hasProtectedContent setting of a channel was toggled.
     */
    public static class ChatEventHasProtectedContentToggled extends ChatEventAction {
        /**
         * New value of hasProtectedContent.
         */
        public boolean hasProtectedContent;

        /**
         * The hasProtectedContent setting of a channel was toggled.
         */
        public ChatEventHasProtectedContentToggled() {
        }

        /**
         * The hasProtectedContent setting of a channel was toggled.
         *
         * @param hasProtectedContent New value of hasProtectedContent.
         */
        public ChatEventHasProtectedContentToggled(boolean hasProtectedContent) {
            this.hasProtectedContent = hasProtectedContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -184270335;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The canInviteUsers permission of a supergroup chat was toggled.
     */
    public static class ChatEventInvitesToggled extends ChatEventAction {
        /**
         * New value of canInviteUsers permission.
         */
        public boolean canInviteUsers;

        /**
         * The canInviteUsers permission of a supergroup chat was toggled.
         */
        public ChatEventInvitesToggled() {
        }

        /**
         * The canInviteUsers permission of a supergroup chat was toggled.
         *
         * @param canInviteUsers New value of canInviteUsers permission.
         */
        public ChatEventInvitesToggled(boolean canInviteUsers) {
            this.canInviteUsers = canInviteUsers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -62548373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The isAllHistoryAvailable setting of a supergroup was toggled.
     */
    public static class ChatEventIsAllHistoryAvailableToggled extends ChatEventAction {
        /**
         * New value of isAllHistoryAvailable.
         */
        public boolean isAllHistoryAvailable;

        /**
         * The isAllHistoryAvailable setting of a supergroup was toggled.
         */
        public ChatEventIsAllHistoryAvailableToggled() {
        }

        /**
         * The isAllHistoryAvailable setting of a supergroup was toggled.
         *
         * @param isAllHistoryAvailable New value of isAllHistoryAvailable.
         */
        public ChatEventIsAllHistoryAvailableToggled(boolean isAllHistoryAvailable) {
            this.isAllHistoryAvailable = isAllHistoryAvailable;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1599063019;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The hasAggressiveAntiSpamEnabled setting of a supergroup was toggled.
     */
    public static class ChatEventHasAggressiveAntiSpamEnabledToggled extends ChatEventAction {
        /**
         * New value of hasAggressiveAntiSpamEnabled.
         */
        public boolean hasAggressiveAntiSpamEnabled;

        /**
         * The hasAggressiveAntiSpamEnabled setting of a supergroup was toggled.
         */
        public ChatEventHasAggressiveAntiSpamEnabledToggled() {
        }

        /**
         * The hasAggressiveAntiSpamEnabled setting of a supergroup was toggled.
         *
         * @param hasAggressiveAntiSpamEnabled New value of hasAggressiveAntiSpamEnabled.
         */
        public ChatEventHasAggressiveAntiSpamEnabledToggled(boolean hasAggressiveAntiSpamEnabled) {
            this.hasAggressiveAntiSpamEnabled = hasAggressiveAntiSpamEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -125348094;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The signMessages setting of a channel was toggled.
     */
    public static class ChatEventSignMessagesToggled extends ChatEventAction {
        /**
         * New value of signMessages.
         */
        public boolean signMessages;

        /**
         * The signMessages setting of a channel was toggled.
         */
        public ChatEventSignMessagesToggled() {
        }

        /**
         * The signMessages setting of a channel was toggled.
         *
         * @param signMessages New value of signMessages.
         */
        public ChatEventSignMessagesToggled(boolean signMessages) {
            this.signMessages = signMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1313265634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat invite link was edited.
     */
    public static class ChatEventInviteLinkEdited extends ChatEventAction {
        /**
         * Previous information about the invite link.
         */
        public ChatInviteLink oldInviteLink;
        /**
         * New information about the invite link.
         */
        public ChatInviteLink newInviteLink;

        /**
         * A chat invite link was edited.
         */
        public ChatEventInviteLinkEdited() {
        }

        /**
         * A chat invite link was edited.
         *
         * @param oldInviteLink Previous information about the invite link.
         * @param newInviteLink New information about the invite link.
         */
        public ChatEventInviteLinkEdited(ChatInviteLink oldInviteLink, ChatInviteLink newInviteLink) {
            this.oldInviteLink = oldInviteLink;
            this.newInviteLink = newInviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -460190366;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat invite link was revoked.
     */
    public static class ChatEventInviteLinkRevoked extends ChatEventAction {
        /**
         * The invite link.
         */
        public ChatInviteLink inviteLink;

        /**
         * A chat invite link was revoked.
         */
        public ChatEventInviteLinkRevoked() {
        }

        /**
         * A chat invite link was revoked.
         *
         * @param inviteLink The invite link.
         */
        public ChatEventInviteLinkRevoked(ChatInviteLink inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1579417629;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A revoked chat invite link was deleted.
     */
    public static class ChatEventInviteLinkDeleted extends ChatEventAction {
        /**
         * The invite link.
         */
        public ChatInviteLink inviteLink;

        /**
         * A revoked chat invite link was deleted.
         */
        public ChatEventInviteLinkDeleted() {
        }

        /**
         * A revoked chat invite link was deleted.
         *
         * @param inviteLink The invite link.
         */
        public ChatEventInviteLinkDeleted(ChatInviteLink inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1394974361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat was created.
     */
    public static class ChatEventVideoChatCreated extends ChatEventAction {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;

        /**
         * A video chat was created.
         */
        public ChatEventVideoChatCreated() {
        }

        /**
         * A video chat was created.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public ChatEventVideoChatCreated(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1822853755;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat was ended.
     */
    public static class ChatEventVideoChatEnded extends ChatEventAction {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;

        /**
         * A video chat was ended.
         */
        public ChatEventVideoChatEnded() {
        }

        /**
         * A video chat was ended.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public ChatEventVideoChatEnded(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1630039112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The muteNewParticipants setting of a video chat was toggled.
     */
    public static class ChatEventVideoChatMuteNewParticipantsToggled extends ChatEventAction {
        /**
         * New value of the muteNewParticipants setting.
         */
        public boolean muteNewParticipants;

        /**
         * The muteNewParticipants setting of a video chat was toggled.
         */
        public ChatEventVideoChatMuteNewParticipantsToggled() {
        }

        /**
         * The muteNewParticipants setting of a video chat was toggled.
         *
         * @param muteNewParticipants New value of the muteNewParticipants setting.
         */
        public ChatEventVideoChatMuteNewParticipantsToggled(boolean muteNewParticipants) {
            this.muteNewParticipants = muteNewParticipants;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -126547970;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat participant was muted or unmuted.
     */
    public static class ChatEventVideoChatParticipantIsMutedToggled extends ChatEventAction {
        /**
         * Identifier of the affected group call participant.
         */
        public MessageSender participantId;
        /**
         * New value of isMuted.
         */
        public boolean isMuted;

        /**
         * A video chat participant was muted or unmuted.
         */
        public ChatEventVideoChatParticipantIsMutedToggled() {
        }

        /**
         * A video chat participant was muted or unmuted.
         *
         * @param participantId Identifier of the affected group call participant.
         * @param isMuted New value of isMuted.
         */
        public ChatEventVideoChatParticipantIsMutedToggled(MessageSender participantId, boolean isMuted) {
            this.participantId = participantId;
            this.isMuted = isMuted;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 521165047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat participant volume level was changed.
     */
    public static class ChatEventVideoChatParticipantVolumeLevelChanged extends ChatEventAction {
        /**
         * Identifier of the affected group call participant.
         */
        public MessageSender participantId;
        /**
         * New value of volumeLevel; 1-20000 in hundreds of percents.
         */
        public int volumeLevel;

        /**
         * A video chat participant volume level was changed.
         */
        public ChatEventVideoChatParticipantVolumeLevelChanged() {
        }

        /**
         * A video chat participant volume level was changed.
         *
         * @param participantId Identifier of the affected group call participant.
         * @param volumeLevel New value of volumeLevel; 1-20000 in hundreds of percents.
         */
        public ChatEventVideoChatParticipantVolumeLevelChanged(MessageSender participantId, int volumeLevel) {
            this.participantId = participantId;
            this.volumeLevel = volumeLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1131385534;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The isForum setting of a channel was toggled.
     */
    public static class ChatEventIsForumToggled extends ChatEventAction {
        /**
         * New value of isForum.
         */
        public boolean isForum;

        /**
         * The isForum setting of a channel was toggled.
         */
        public ChatEventIsForumToggled() {
        }

        /**
         * The isForum setting of a channel was toggled.
         *
         * @param isForum New value of isForum.
         */
        public ChatEventIsForumToggled(boolean isForum) {
            this.isForum = isForum;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1516491033;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new forum topic was created.
     */
    public static class ChatEventForumTopicCreated extends ChatEventAction {
        /**
         * Information about the topic.
         */
        public ForumTopicInfo topicInfo;

        /**
         * A new forum topic was created.
         */
        public ChatEventForumTopicCreated() {
        }

        /**
         * A new forum topic was created.
         *
         * @param topicInfo Information about the topic.
         */
        public ChatEventForumTopicCreated(ForumTopicInfo topicInfo) {
            this.topicInfo = topicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2005269314;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic was edited.
     */
    public static class ChatEventForumTopicEdited extends ChatEventAction {
        /**
         * Old information about the topic.
         */
        public ForumTopicInfo oldTopicInfo;
        /**
         * New information about the topic.
         */
        public ForumTopicInfo newTopicInfo;

        /**
         * A forum topic was edited.
         */
        public ChatEventForumTopicEdited() {
        }

        /**
         * A forum topic was edited.
         *
         * @param oldTopicInfo Old information about the topic.
         * @param newTopicInfo New information about the topic.
         */
        public ChatEventForumTopicEdited(ForumTopicInfo oldTopicInfo, ForumTopicInfo newTopicInfo) {
            this.oldTopicInfo = oldTopicInfo;
            this.newTopicInfo = newTopicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1624910860;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic was closed or reopened.
     */
    public static class ChatEventForumTopicToggleIsClosed extends ChatEventAction {
        /**
         * New information about the topic.
         */
        public ForumTopicInfo topicInfo;

        /**
         * A forum topic was closed or reopened.
         */
        public ChatEventForumTopicToggleIsClosed() {
        }

        /**
         * A forum topic was closed or reopened.
         *
         * @param topicInfo New information about the topic.
         */
        public ChatEventForumTopicToggleIsClosed(ForumTopicInfo topicInfo) {
            this.topicInfo = topicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -962704070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The General forum topic was hidden or unhidden.
     */
    public static class ChatEventForumTopicToggleIsHidden extends ChatEventAction {
        /**
         * New information about the topic.
         */
        public ForumTopicInfo topicInfo;

        /**
         * The General forum topic was hidden or unhidden.
         */
        public ChatEventForumTopicToggleIsHidden() {
        }

        /**
         * The General forum topic was hidden or unhidden.
         *
         * @param topicInfo New information about the topic.
         */
        public ChatEventForumTopicToggleIsHidden(ForumTopicInfo topicInfo) {
            this.topicInfo = topicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1609175250;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic was deleted.
     */
    public static class ChatEventForumTopicDeleted extends ChatEventAction {
        /**
         * Information about the topic.
         */
        public ForumTopicInfo topicInfo;

        /**
         * A forum topic was deleted.
         */
        public ChatEventForumTopicDeleted() {
        }

        /**
         * A forum topic was deleted.
         *
         * @param topicInfo Information about the topic.
         */
        public ChatEventForumTopicDeleted(ForumTopicInfo topicInfo) {
            this.topicInfo = topicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1332795123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A pinned forum topic was changed.
     */
    public static class ChatEventForumTopicPinned extends ChatEventAction {
        /**
         * Information about the old pinned topic; may be null.
         */
        @Nullable public ForumTopicInfo oldTopicInfo;
        /**
         * Information about the new pinned topic; may be null.
         */
        @Nullable public ForumTopicInfo newTopicInfo;

        /**
         * A pinned forum topic was changed.
         */
        public ChatEventForumTopicPinned() {
        }

        /**
         * A pinned forum topic was changed.
         *
         * @param oldTopicInfo Information about the old pinned topic; may be null.
         * @param newTopicInfo Information about the new pinned topic; may be null.
         */
        public ChatEventForumTopicPinned(ForumTopicInfo oldTopicInfo, ForumTopicInfo newTopicInfo) {
            this.oldTopicInfo = oldTopicInfo;
            this.newTopicInfo = newTopicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2143626222;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a set of filters used to obtain a chat event log.
     */
    public static class ChatEventLogFilters extends Object {
        /**
         * True, if message edits need to be returned.
         */
        public boolean messageEdits;
        /**
         * True, if message deletions need to be returned.
         */
        public boolean messageDeletions;
        /**
         * True, if pin/unpin events need to be returned.
         */
        public boolean messagePins;
        /**
         * True, if members joining events need to be returned.
         */
        public boolean memberJoins;
        /**
         * True, if members leaving events need to be returned.
         */
        public boolean memberLeaves;
        /**
         * True, if invited member events need to be returned.
         */
        public boolean memberInvites;
        /**
         * True, if member promotion/demotion events need to be returned.
         */
        public boolean memberPromotions;
        /**
         * True, if member restricted/unrestricted/banned/unbanned events need to be returned.
         */
        public boolean memberRestrictions;
        /**
         * True, if changes in chat information need to be returned.
         */
        public boolean infoChanges;
        /**
         * True, if changes in chat settings need to be returned.
         */
        public boolean settingChanges;
        /**
         * True, if changes to invite links need to be returned.
         */
        public boolean inviteLinkChanges;
        /**
         * True, if video chat actions need to be returned.
         */
        public boolean videoChatChanges;
        /**
         * True, if forum-related actions need to be returned.
         */
        public boolean forumChanges;

        /**
         * Represents a set of filters used to obtain a chat event log.
         */
        public ChatEventLogFilters() {
        }

        /**
         * Represents a set of filters used to obtain a chat event log.
         *
         * @param messageEdits True, if message edits need to be returned.
         * @param messageDeletions True, if message deletions need to be returned.
         * @param messagePins True, if pin/unpin events need to be returned.
         * @param memberJoins True, if members joining events need to be returned.
         * @param memberLeaves True, if members leaving events need to be returned.
         * @param memberInvites True, if invited member events need to be returned.
         * @param memberPromotions True, if member promotion/demotion events need to be returned.
         * @param memberRestrictions True, if member restricted/unrestricted/banned/unbanned events need to be returned.
         * @param infoChanges True, if changes in chat information need to be returned.
         * @param settingChanges True, if changes in chat settings need to be returned.
         * @param inviteLinkChanges True, if changes to invite links need to be returned.
         * @param videoChatChanges True, if video chat actions need to be returned.
         * @param forumChanges True, if forum-related actions need to be returned.
         */
        public ChatEventLogFilters(boolean messageEdits, boolean messageDeletions, boolean messagePins, boolean memberJoins, boolean memberLeaves, boolean memberInvites, boolean memberPromotions, boolean memberRestrictions, boolean infoChanges, boolean settingChanges, boolean inviteLinkChanges, boolean videoChatChanges, boolean forumChanges) {
            this.messageEdits = messageEdits;
            this.messageDeletions = messageDeletions;
            this.messagePins = messagePins;
            this.memberJoins = memberJoins;
            this.memberLeaves = memberLeaves;
            this.memberInvites = memberInvites;
            this.memberPromotions = memberPromotions;
            this.memberRestrictions = memberRestrictions;
            this.infoChanges = infoChanges;
            this.settingChanges = settingChanges;
            this.inviteLinkChanges = inviteLinkChanges;
            this.videoChatChanges = videoChatChanges;
            this.forumChanges = forumChanges;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1648261677;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat events.
     */
    public static class ChatEvents extends Object {
        /**
         * List of events.
         */
        public ChatEvent[] events;

        /**
         * Contains a list of chat events.
         */
        public ChatEvents() {
        }

        /**
         * Contains a list of chat events.
         *
         * @param events List of events.
         */
        public ChatEvents(ChatEvent[] events) {
            this.events = events;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -585329664;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a folder for user chats.
     */
    public static class ChatFolder extends Object {
        /**
         * The title of the folder; 1-12 characters without line feeds.
         */
        public String title;
        /**
         * The chosen icon for the chat folder; may be null. If null, use getChatFolderDefaultIconName to get default icon name for the folder.
         */
        @Nullable public ChatFolderIcon icon;
        /**
         * The identifier of the chosen color for the chat folder icon; from -1 to 6. If -1, then color is disabled. Can't be changed if folder tags are disabled or the current user doesn't have Telegram Premium subscription.
         */
        public int colorId;
        /**
         * True, if at least one link has been created for the folder.
         */
        public boolean isShareable;
        /**
         * The chat identifiers of pinned chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) pinned and always included non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         */
        public long[] pinnedChatIds;
        /**
         * The chat identifiers of always included chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) pinned and always included non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         */
        public long[] includedChatIds;
        /**
         * The chat identifiers of always excluded chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) always excluded non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         */
        public long[] excludedChatIds;
        /**
         * True, if muted chats need to be excluded.
         */
        public boolean excludeMuted;
        /**
         * True, if read chats need to be excluded.
         */
        public boolean excludeRead;
        /**
         * True, if archived chats need to be excluded.
         */
        public boolean excludeArchived;
        /**
         * True, if contacts need to be included.
         */
        public boolean includeContacts;
        /**
         * True, if non-contact users need to be included.
         */
        public boolean includeNonContacts;
        /**
         * True, if bots need to be included.
         */
        public boolean includeBots;
        /**
         * True, if basic groups and supergroups need to be included.
         */
        public boolean includeGroups;
        /**
         * True, if channels need to be included.
         */
        public boolean includeChannels;

        /**
         * Represents a folder for user chats.
         */
        public ChatFolder() {
        }

        /**
         * Represents a folder for user chats.
         *
         * @param title The title of the folder; 1-12 characters without line feeds.
         * @param icon The chosen icon for the chat folder; may be null. If null, use getChatFolderDefaultIconName to get default icon name for the folder.
         * @param colorId The identifier of the chosen color for the chat folder icon; from -1 to 6. If -1, then color is disabled. Can't be changed if folder tags are disabled or the current user doesn't have Telegram Premium subscription.
         * @param isShareable True, if at least one link has been created for the folder.
         * @param pinnedChatIds The chat identifiers of pinned chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) pinned and always included non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         * @param includedChatIds The chat identifiers of always included chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) pinned and always included non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         * @param excludedChatIds The chat identifiers of always excluded chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) always excluded non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         * @param excludeMuted True, if muted chats need to be excluded.
         * @param excludeRead True, if read chats need to be excluded.
         * @param excludeArchived True, if archived chats need to be excluded.
         * @param includeContacts True, if contacts need to be included.
         * @param includeNonContacts True, if non-contact users need to be included.
         * @param includeBots True, if bots need to be included.
         * @param includeGroups True, if basic groups and supergroups need to be included.
         * @param includeChannels True, if channels need to be included.
         */
        public ChatFolder(String title, ChatFolderIcon icon, int colorId, boolean isShareable, long[] pinnedChatIds, long[] includedChatIds, long[] excludedChatIds, boolean excludeMuted, boolean excludeRead, boolean excludeArchived, boolean includeContacts, boolean includeNonContacts, boolean includeBots, boolean includeGroups, boolean includeChannels) {
            this.title = title;
            this.icon = icon;
            this.colorId = colorId;
            this.isShareable = isShareable;
            this.pinnedChatIds = pinnedChatIds;
            this.includedChatIds = includedChatIds;
            this.excludedChatIds = excludedChatIds;
            this.excludeMuted = excludeMuted;
            this.excludeRead = excludeRead;
            this.excludeArchived = excludeArchived;
            this.includeContacts = includeContacts;
            this.includeNonContacts = includeNonContacts;
            this.includeBots = includeBots;
            this.includeGroups = includeGroups;
            this.includeChannels = includeChannels;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -474905057;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an icon for a chat folder.
     */
    public static class ChatFolderIcon extends Object {
        /**
         * The chosen icon name for short folder representation; one of &quot;All&quot;, &quot;Unread&quot;, &quot;Unmuted&quot;, &quot;Bots&quot;, &quot;Channels&quot;, &quot;Groups&quot;, &quot;Private&quot;, &quot;Custom&quot;, &quot;Setup&quot;, &quot;Cat&quot;, &quot;Crown&quot;, &quot;Favorite&quot;, &quot;Flower&quot;, &quot;Game&quot;, &quot;Home&quot;, &quot;Love&quot;, &quot;Mask&quot;, &quot;Party&quot;, &quot;Sport&quot;, &quot;Study&quot;, &quot;Trade&quot;, &quot;Travel&quot;, &quot;Work&quot;, &quot;Airplane&quot;, &quot;Book&quot;, &quot;Light&quot;, &quot;Like&quot;, &quot;Money&quot;, &quot;Note&quot;, &quot;Palette&quot;.
         */
        public String name;

        /**
         * Represents an icon for a chat folder.
         */
        public ChatFolderIcon() {
        }

        /**
         * Represents an icon for a chat folder.
         *
         * @param name The chosen icon name for short folder representation; one of &quot;All&quot;, &quot;Unread&quot;, &quot;Unmuted&quot;, &quot;Bots&quot;, &quot;Channels&quot;, &quot;Groups&quot;, &quot;Private&quot;, &quot;Custom&quot;, &quot;Setup&quot;, &quot;Cat&quot;, &quot;Crown&quot;, &quot;Favorite&quot;, &quot;Flower&quot;, &quot;Game&quot;, &quot;Home&quot;, &quot;Love&quot;, &quot;Mask&quot;, &quot;Party&quot;, &quot;Sport&quot;, &quot;Study&quot;, &quot;Trade&quot;, &quot;Travel&quot;, &quot;Work&quot;, &quot;Airplane&quot;, &quot;Book&quot;, &quot;Light&quot;, &quot;Like&quot;, &quot;Money&quot;, &quot;Note&quot;, &quot;Palette&quot;.
         */
        public ChatFolderIcon(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -146104090;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about a chat folder.
     */
    public static class ChatFolderInfo extends Object {
        /**
         * Unique chat folder identifier.
         */
        public int id;
        /**
         * The title of the folder; 1-12 characters without line feeds.
         */
        public String title;
        /**
         * The chosen or default icon for the chat folder.
         */
        public ChatFolderIcon icon;
        /**
         * The identifier of the chosen color for the chat folder icon; from -1 to 6. If -1, then color is disabled.
         */
        public int colorId;
        /**
         * True, if at least one link has been created for the folder.
         */
        public boolean isShareable;
        /**
         * True, if the chat folder has invite links created by the current user.
         */
        public boolean hasMyInviteLinks;

        /**
         * Contains basic information about a chat folder.
         */
        public ChatFolderInfo() {
        }

        /**
         * Contains basic information about a chat folder.
         *
         * @param id Unique chat folder identifier.
         * @param title The title of the folder; 1-12 characters without line feeds.
         * @param icon The chosen or default icon for the chat folder.
         * @param colorId The identifier of the chosen color for the chat folder icon; from -1 to 6. If -1, then color is disabled.
         * @param isShareable True, if at least one link has been created for the folder.
         * @param hasMyInviteLinks True, if the chat folder has invite links created by the current user.
         */
        public ChatFolderInfo(int id, String title, ChatFolderIcon icon, int colorId, boolean isShareable, boolean hasMyInviteLinks) {
            this.id = id;
            this.title = title;
            this.icon = icon;
            this.colorId = colorId;
            this.isShareable = isShareable;
            this.hasMyInviteLinks = hasMyInviteLinks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 190948485;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a chat folder invite link.
     */
    public static class ChatFolderInviteLink extends Object {
        /**
         * The chat folder invite link.
         */
        public String inviteLink;
        /**
         * Name of the link.
         */
        public String name;
        /**
         * Identifiers of chats, included in the link.
         */
        public long[] chatIds;

        /**
         * Contains a chat folder invite link.
         */
        public ChatFolderInviteLink() {
        }

        /**
         * Contains a chat folder invite link.
         *
         * @param inviteLink The chat folder invite link.
         * @param name Name of the link.
         * @param chatIds Identifiers of chats, included in the link.
         */
        public ChatFolderInviteLink(String inviteLink, String name, long[] chatIds) {
            this.inviteLink = inviteLink;
            this.name = name;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 493969661;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an invite link to a chat folder.
     */
    public static class ChatFolderInviteLinkInfo extends Object {
        /**
         * Basic information about the chat folder; chat folder identifier will be 0 if the user didn't have the chat folder yet.
         */
        public ChatFolderInfo chatFolderInfo;
        /**
         * Identifiers of the chats from the link, which aren't added to the folder yet.
         */
        public long[] missingChatIds;
        /**
         * Identifiers of the chats from the link, which are added to the folder already.
         */
        public long[] addedChatIds;

        /**
         * Contains information about an invite link to a chat folder.
         */
        public ChatFolderInviteLinkInfo() {
        }

        /**
         * Contains information about an invite link to a chat folder.
         *
         * @param chatFolderInfo Basic information about the chat folder; chat folder identifier will be 0 if the user didn't have the chat folder yet.
         * @param missingChatIds Identifiers of the chats from the link, which aren't added to the folder yet.
         * @param addedChatIds Identifiers of the chats from the link, which are added to the folder already.
         */
        public ChatFolderInviteLinkInfo(ChatFolderInfo chatFolderInfo, long[] missingChatIds, long[] addedChatIds) {
            this.chatFolderInfo = chatFolderInfo;
            this.missingChatIds = missingChatIds;
            this.addedChatIds = addedChatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119450395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of chat folder invite links.
     */
    public static class ChatFolderInviteLinks extends Object {
        /**
         * List of the invite links.
         */
        public ChatFolderInviteLink[] inviteLinks;

        /**
         * Represents a list of chat folder invite links.
         */
        public ChatFolderInviteLinks() {
        }

        /**
         * Represents a list of chat folder invite links.
         *
         * @param inviteLinks List of the invite links.
         */
        public ChatFolderInviteLinks(ChatFolderInviteLink[] inviteLinks) {
            this.inviteLinks = inviteLinks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1853351525;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a chat invite link.
     */
    public static class ChatInviteLink extends Object {
        /**
         * Chat invite link.
         */
        public String inviteLink;
        /**
         * Name of the link.
         */
        public String name;
        /**
         * User identifier of an administrator created the link.
         */
        public long creatorUserId;
        /**
         * Point in time (Unix timestamp) when the link was created.
         */
        public int date;
        /**
         * Point in time (Unix timestamp) when the link was last edited; 0 if never or unknown.
         */
        public int editDate;
        /**
         * Point in time (Unix timestamp) when the link will expire; 0 if never.
         */
        public int expirationDate;
        /**
         * The maximum number of members, which can join the chat using the link simultaneously; 0 if not limited. Always 0 if the link requires approval.
         */
        public int memberLimit;
        /**
         * Number of chat members, which joined the chat using the link.
         */
        public int memberCount;
        /**
         * Number of pending join requests created using this link.
         */
        public int pendingJoinRequestCount;
        /**
         * True, if the link only creates join request. If true, total number of joining members will be unlimited.
         */
        public boolean createsJoinRequest;
        /**
         * True, if the link is primary. Primary invite link can't have name, expiration date, or usage limit. There is exactly one primary invite link for each administrator with canInviteUsers right at a given time.
         */
        public boolean isPrimary;
        /**
         * True, if the link was revoked.
         */
        public boolean isRevoked;

        /**
         * Contains a chat invite link.
         */
        public ChatInviteLink() {
        }

        /**
         * Contains a chat invite link.
         *
         * @param inviteLink Chat invite link.
         * @param name Name of the link.
         * @param creatorUserId User identifier of an administrator created the link.
         * @param date Point in time (Unix timestamp) when the link was created.
         * @param editDate Point in time (Unix timestamp) when the link was last edited; 0 if never or unknown.
         * @param expirationDate Point in time (Unix timestamp) when the link will expire; 0 if never.
         * @param memberLimit The maximum number of members, which can join the chat using the link simultaneously; 0 if not limited. Always 0 if the link requires approval.
         * @param memberCount Number of chat members, which joined the chat using the link.
         * @param pendingJoinRequestCount Number of pending join requests created using this link.
         * @param createsJoinRequest True, if the link only creates join request. If true, total number of joining members will be unlimited.
         * @param isPrimary True, if the link is primary. Primary invite link can't have name, expiration date, or usage limit. There is exactly one primary invite link for each administrator with canInviteUsers right at a given time.
         * @param isRevoked True, if the link was revoked.
         */
        public ChatInviteLink(String inviteLink, String name, long creatorUserId, int date, int editDate, int expirationDate, int memberLimit, int memberCount, int pendingJoinRequestCount, boolean createsJoinRequest, boolean isPrimary, boolean isRevoked) {
            this.inviteLink = inviteLink;
            this.name = name;
            this.creatorUserId = creatorUserId;
            this.date = date;
            this.editDate = editDate;
            this.expirationDate = expirationDate;
            this.memberLimit = memberLimit;
            this.memberCount = memberCount;
            this.pendingJoinRequestCount = pendingJoinRequestCount;
            this.createsJoinRequest = createsJoinRequest;
            this.isPrimary = isPrimary;
            this.isRevoked = isRevoked;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -205812476;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat administrator with a number of active and revoked chat invite links.
     */
    public static class ChatInviteLinkCount extends Object {
        /**
         * Administrator's user identifier.
         */
        public long userId;
        /**
         * Number of active invite links.
         */
        public int inviteLinkCount;
        /**
         * Number of revoked invite links.
         */
        public int revokedInviteLinkCount;

        /**
         * Describes a chat administrator with a number of active and revoked chat invite links.
         */
        public ChatInviteLinkCount() {
        }

        /**
         * Describes a chat administrator with a number of active and revoked chat invite links.
         *
         * @param userId Administrator's user identifier.
         * @param inviteLinkCount Number of active invite links.
         * @param revokedInviteLinkCount Number of revoked invite links.
         */
        public ChatInviteLinkCount(long userId, int inviteLinkCount, int revokedInviteLinkCount) {
            this.userId = userId;
            this.inviteLinkCount = inviteLinkCount;
            this.revokedInviteLinkCount = revokedInviteLinkCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1021999210;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat invite link counts.
     */
    public static class ChatInviteLinkCounts extends Object {
        /**
         * List of invite link counts.
         */
        public ChatInviteLinkCount[] inviteLinkCounts;

        /**
         * Contains a list of chat invite link counts.
         */
        public ChatInviteLinkCounts() {
        }

        /**
         * Contains a list of chat invite link counts.
         *
         * @param inviteLinkCounts List of invite link counts.
         */
        public ChatInviteLinkCounts(ChatInviteLinkCount[] inviteLinkCounts) {
            this.inviteLinkCounts = inviteLinkCounts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 920326637;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a chat invite link.
     */
    public static class ChatInviteLinkInfo extends Object {
        /**
         * Chat identifier of the invite link; 0 if the user has no access to the chat before joining.
         */
        public long chatId;
        /**
         * If non-zero, the amount of time for which read access to the chat will remain available, in seconds.
         */
        public int accessibleFor;
        /**
         * Type of the chat.
         */
        public InviteLinkChatType type;
        /**
         * Title of the chat.
         */
        public String title;
        /**
         * Chat photo; may be null.
         */
        @Nullable public ChatPhotoInfo photo;
        /**
         * Identifier of the accent color for chat title and background of chat photo.
         */
        public int accentColorId;
        /**
         * Chat description.
         */
        public String description;
        /**
         * Number of members in the chat.
         */
        public int memberCount;
        /**
         * User identifiers of some chat members that may be known to the current user.
         */
        public long[] memberUserIds;
        /**
         * True, if the link only creates join request.
         */
        public boolean createsJoinRequest;
        /**
         * True, if the chat is a public supergroup or channel, i.e. it has a username or it is a location-based supergroup.
         */
        public boolean isPublic;
        /**
         * True, if the chat is verified.
         */
        public boolean isVerified;
        /**
         * True, if many users reported this chat as a scam.
         */
        public boolean isScam;
        /**
         * True, if many users reported this chat as a fake account.
         */
        public boolean isFake;

        /**
         * Contains information about a chat invite link.
         */
        public ChatInviteLinkInfo() {
        }

        /**
         * Contains information about a chat invite link.
         *
         * @param chatId Chat identifier of the invite link; 0 if the user has no access to the chat before joining.
         * @param accessibleFor If non-zero, the amount of time for which read access to the chat will remain available, in seconds.
         * @param type Type of the chat.
         * @param title Title of the chat.
         * @param photo Chat photo; may be null.
         * @param accentColorId Identifier of the accent color for chat title and background of chat photo.
         * @param description Chat description.
         * @param memberCount Number of members in the chat.
         * @param memberUserIds User identifiers of some chat members that may be known to the current user.
         * @param createsJoinRequest True, if the link only creates join request.
         * @param isPublic True, if the chat is a public supergroup or channel, i.e. it has a username or it is a location-based supergroup.
         * @param isVerified True, if the chat is verified.
         * @param isScam True, if many users reported this chat as a scam.
         * @param isFake True, if many users reported this chat as a fake account.
         */
        public ChatInviteLinkInfo(long chatId, int accessibleFor, InviteLinkChatType type, String title, ChatPhotoInfo photo, int accentColorId, String description, int memberCount, long[] memberUserIds, boolean createsJoinRequest, boolean isPublic, boolean isVerified, boolean isScam, boolean isFake) {
            this.chatId = chatId;
            this.accessibleFor = accessibleFor;
            this.type = type;
            this.title = title;
            this.photo = photo;
            this.accentColorId = accentColorId;
            this.description = description;
            this.memberCount = memberCount;
            this.memberUserIds = memberUserIds;
            this.createsJoinRequest = createsJoinRequest;
            this.isPublic = isPublic;
            this.isVerified = isVerified;
            this.isScam = isScam;
            this.isFake = isFake;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1683383858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat member joined a chat via an invite link.
     */
    public static class ChatInviteLinkMember extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Point in time (Unix timestamp) when the user joined the chat.
         */
        public int joinedChatDate;
        /**
         * True, if the user has joined the chat using an invite link for a chat folder.
         */
        public boolean viaChatFolderInviteLink;
        /**
         * User identifier of the chat administrator, approved user join request.
         */
        public long approverUserId;

        /**
         * Describes a chat member joined a chat via an invite link.
         */
        public ChatInviteLinkMember() {
        }

        /**
         * Describes a chat member joined a chat via an invite link.
         *
         * @param userId User identifier.
         * @param joinedChatDate Point in time (Unix timestamp) when the user joined the chat.
         * @param viaChatFolderInviteLink True, if the user has joined the chat using an invite link for a chat folder.
         * @param approverUserId User identifier of the chat administrator, approved user join request.
         */
        public ChatInviteLinkMember(long userId, int joinedChatDate, boolean viaChatFolderInviteLink, long approverUserId) {
            this.userId = userId;
            this.joinedChatDate = joinedChatDate;
            this.viaChatFolderInviteLink = viaChatFolderInviteLink;
            this.approverUserId = approverUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 29156795;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat members joined a chat via an invite link.
     */
    public static class ChatInviteLinkMembers extends Object {
        /**
         * Approximate total number of chat members found.
         */
        public int totalCount;
        /**
         * List of chat members, joined a chat via an invite link.
         */
        public ChatInviteLinkMember[] members;

        /**
         * Contains a list of chat members joined a chat via an invite link.
         */
        public ChatInviteLinkMembers() {
        }

        /**
         * Contains a list of chat members joined a chat via an invite link.
         *
         * @param totalCount Approximate total number of chat members found.
         * @param members List of chat members, joined a chat via an invite link.
         */
        public ChatInviteLinkMembers(int totalCount, ChatInviteLinkMember[] members) {
            this.totalCount = totalCount;
            this.members = members;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 315635051;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat invite links.
     */
    public static class ChatInviteLinks extends Object {
        /**
         * Approximate total number of chat invite links found.
         */
        public int totalCount;
        /**
         * List of invite links.
         */
        public ChatInviteLink[] inviteLinks;

        /**
         * Contains a list of chat invite links.
         */
        public ChatInviteLinks() {
        }

        /**
         * Contains a list of chat invite links.
         *
         * @param totalCount Approximate total number of chat invite links found.
         * @param inviteLinks List of invite links.
         */
        public ChatInviteLinks(int totalCount, ChatInviteLink[] inviteLinks) {
            this.totalCount = totalCount;
            this.inviteLinks = inviteLinks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 112891427;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user that sent a join request and waits for administrator approval.
     */
    public static class ChatJoinRequest extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Point in time (Unix timestamp) when the user sent the join request.
         */
        public int date;
        /**
         * A short bio of the user.
         */
        public String bio;

        /**
         * Describes a user that sent a join request and waits for administrator approval.
         */
        public ChatJoinRequest() {
        }

        /**
         * Describes a user that sent a join request and waits for administrator approval.
         *
         * @param userId User identifier.
         * @param date Point in time (Unix timestamp) when the user sent the join request.
         * @param bio A short bio of the user.
         */
        public ChatJoinRequest(long userId, int date, String bio) {
            this.userId = userId;
            this.date = date;
            this.bio = bio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 59341416;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of requests to join a chat.
     */
    public static class ChatJoinRequests extends Object {
        /**
         * Approximate total number of requests found.
         */
        public int totalCount;
        /**
         * List of the requests.
         */
        public ChatJoinRequest[] requests;

        /**
         * Contains a list of requests to join a chat.
         */
        public ChatJoinRequests() {
        }

        /**
         * Contains a list of requests to join a chat.
         *
         * @param totalCount Approximate total number of requests found.
         * @param requests List of the requests.
         */
        public ChatJoinRequests(int totalCount, ChatJoinRequest[] requests) {
            this.totalCount = totalCount;
            this.requests = requests;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1291680519;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about pending join requests for a chat.
     */
    public static class ChatJoinRequestsInfo extends Object {
        /**
         * Total number of pending join requests.
         */
        public int totalCount;
        /**
         * Identifiers of at most 3 users sent the newest pending join requests.
         */
        public long[] userIds;

        /**
         * Contains information about pending join requests for a chat.
         */
        public ChatJoinRequestsInfo() {
        }

        /**
         * Contains information about pending join requests for a chat.
         *
         * @param totalCount Total number of pending join requests.
         * @param userIds Identifiers of at most 3 users sent the newest pending join requests.
         */
        public ChatJoinRequestsInfo(int totalCount, long[] userIds) {
            this.totalCount = totalCount;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 888534463;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a list of chats.
     */
    public abstract static class ChatList extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatListMain.CONSTRUCTOR,
            ChatListArchive.CONSTRUCTOR,
            ChatListFolder.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatList() {
        }
    }

    /**
     * A main list of chats.
     */
    public static class ChatListMain extends ChatList {

        /**
         * A main list of chats.
         */
        public ChatListMain() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -400991316;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of chats usually located at the top of the main chat list. Unmuted chats are automatically moved from the Archive to the Main chat list when a new message arrives.
     */
    public static class ChatListArchive extends ChatList {

        /**
         * A list of chats usually located at the top of the main chat list. Unmuted chats are automatically moved from the Archive to the Main chat list when a new message arrives.
         */
        public ChatListArchive() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 362770115;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of chats added to a chat folder.
     */
    public static class ChatListFolder extends ChatList {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * A list of chats added to a chat folder.
         */
        public ChatListFolder() {
        }

        /**
         * A list of chats added to a chat folder.
         *
         * @param chatFolderId Chat folder identifier.
         */
        public ChatListFolder(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 385760856;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat lists.
     */
    public static class ChatLists extends Object {
        /**
         * List of chat lists.
         */
        public ChatList[] chatLists;

        /**
         * Contains a list of chat lists.
         */
        public ChatLists() {
        }

        /**
         * Contains a list of chat lists.
         *
         * @param chatLists List of chat lists.
         */
        public ChatLists(ChatList[] chatLists) {
            this.chatLists = chatLists;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -258292771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a location to which a chat is connected.
     */
    public static class ChatLocation extends Object {
        /**
         * The location.
         */
        public Location location;
        /**
         * Location address; 1-64 characters, as defined by the chat owner.
         */
        public String address;

        /**
         * Represents a location to which a chat is connected.
         */
        public ChatLocation() {
        }

        /**
         * Represents a location to which a chat is connected.
         *
         * @param location The location.
         * @param address Location address; 1-64 characters, as defined by the chat owner.
         */
        public ChatLocation(Location location, String address) {
            this.location = location;
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1566863583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user or a chat as a member of another chat.
     */
    public static class ChatMember extends Object {
        /**
         * Identifier of the chat member. Currently, other chats can be only Left or Banned. Only supergroups and channels can have other chats as Left or Banned members and these chats must be supergroups or channels.
         */
        public MessageSender memberId;
        /**
         * Identifier of a user that invited/promoted/banned this member in the chat; 0 if unknown.
         */
        public long inviterUserId;
        /**
         * Point in time (Unix timestamp) when the user joined/was promoted/was banned in the chat.
         */
        public int joinedChatDate;
        /**
         * Status of the member in the chat.
         */
        public ChatMemberStatus status;

        /**
         * Describes a user or a chat as a member of another chat.
         */
        public ChatMember() {
        }

        /**
         * Describes a user or a chat as a member of another chat.
         *
         * @param memberId Identifier of the chat member. Currently, other chats can be only Left or Banned. Only supergroups and channels can have other chats as Left or Banned members and these chats must be supergroups or channels.
         * @param inviterUserId Identifier of a user that invited/promoted/banned this member in the chat; 0 if unknown.
         * @param joinedChatDate Point in time (Unix timestamp) when the user joined/was promoted/was banned in the chat.
         * @param status Status of the member in the chat.
         */
        public ChatMember(MessageSender memberId, long inviterUserId, int joinedChatDate, ChatMemberStatus status) {
            this.memberId = memberId;
            this.inviterUserId = inviterUserId;
            this.joinedChatDate = joinedChatDate;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1829953909;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Provides information about the status of a member in a chat.
     */
    public abstract static class ChatMemberStatus extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatMemberStatusCreator.CONSTRUCTOR,
            ChatMemberStatusAdministrator.CONSTRUCTOR,
            ChatMemberStatusMember.CONSTRUCTOR,
            ChatMemberStatusRestricted.CONSTRUCTOR,
            ChatMemberStatusLeft.CONSTRUCTOR,
            ChatMemberStatusBanned.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatMemberStatus() {
        }
    }

    /**
     * The user is the owner of the chat and has all the administrator privileges.
     */
    public static class ChatMemberStatusCreator extends ChatMemberStatus {
        /**
         * A custom title of the owner; 0-16 characters without emoji; applicable to supergroups only.
         */
        public String customTitle;
        /**
         * True, if the creator isn't shown in the chat member list and sends messages anonymously; applicable to supergroups only.
         */
        public boolean isAnonymous;
        /**
         * True, if the user is a member of the chat.
         */
        public boolean isMember;

        /**
         * The user is the owner of the chat and has all the administrator privileges.
         */
        public ChatMemberStatusCreator() {
        }

        /**
         * The user is the owner of the chat and has all the administrator privileges.
         *
         * @param customTitle A custom title of the owner; 0-16 characters without emoji; applicable to supergroups only.
         * @param isAnonymous True, if the creator isn't shown in the chat member list and sends messages anonymously; applicable to supergroups only.
         * @param isMember True, if the user is a member of the chat.
         */
        public ChatMemberStatusCreator(String customTitle, boolean isAnonymous, boolean isMember) {
            this.customTitle = customTitle;
            this.isAnonymous = isAnonymous;
            this.isMember = isMember;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -160019714;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is a member of the chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, ban unprivileged members, and manage video chats. In supergroups and channels, there are more detailed options for administrator privileges.
     */
    public static class ChatMemberStatusAdministrator extends ChatMemberStatus {
        /**
         * A custom title of the administrator; 0-16 characters without emoji; applicable to supergroups only.
         */
        public String customTitle;
        /**
         * True, if the current user can edit the administrator privileges for the called user.
         */
        public boolean canBeEdited;
        /**
         * Rights of the administrator.
         */
        public ChatAdministratorRights rights;

        /**
         * The user is a member of the chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, ban unprivileged members, and manage video chats. In supergroups and channels, there are more detailed options for administrator privileges.
         */
        public ChatMemberStatusAdministrator() {
        }

        /**
         * The user is a member of the chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, ban unprivileged members, and manage video chats. In supergroups and channels, there are more detailed options for administrator privileges.
         *
         * @param customTitle A custom title of the administrator; 0-16 characters without emoji; applicable to supergroups only.
         * @param canBeEdited True, if the current user can edit the administrator privileges for the called user.
         * @param rights Rights of the administrator.
         */
        public ChatMemberStatusAdministrator(String customTitle, boolean canBeEdited, ChatAdministratorRights rights) {
            this.customTitle = customTitle;
            this.canBeEdited = canBeEdited;
            this.rights = rights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -70024163;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is a member of the chat, without any additional privileges or restrictions.
     */
    public static class ChatMemberStatusMember extends ChatMemberStatus {

        /**
         * The user is a member of the chat, without any additional privileges or restrictions.
         */
        public ChatMemberStatusMember() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 844723285;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is under certain restrictions in the chat. Not supported in basic groups and channels.
     */
    public static class ChatMemberStatusRestricted extends ChatMemberStatus {
        /**
         * True, if the user is a member of the chat.
         */
        public boolean isMember;
        /**
         * Point in time (Unix timestamp) when restrictions will be lifted from the user; 0 if never. If the user is restricted for more than 366 days or for less than 30 seconds from the current time, the user is considered to be restricted forever.
         */
        public int restrictedUntilDate;
        /**
         * User permissions in the chat.
         */
        public ChatPermissions permissions;

        /**
         * The user is under certain restrictions in the chat. Not supported in basic groups and channels.
         */
        public ChatMemberStatusRestricted() {
        }

        /**
         * The user is under certain restrictions in the chat. Not supported in basic groups and channels.
         *
         * @param isMember True, if the user is a member of the chat.
         * @param restrictedUntilDate Point in time (Unix timestamp) when restrictions will be lifted from the user; 0 if never. If the user is restricted for more than 366 days or for less than 30 seconds from the current time, the user is considered to be restricted forever.
         * @param permissions User permissions in the chat.
         */
        public ChatMemberStatusRestricted(boolean isMember, int restrictedUntilDate, ChatPermissions permissions) {
            this.isMember = isMember;
            this.restrictedUntilDate = restrictedUntilDate;
            this.permissions = permissions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1661432998;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user or the chat is not a chat member.
     */
    public static class ChatMemberStatusLeft extends ChatMemberStatus {

        /**
         * The user or the chat is not a chat member.
         */
        public ChatMemberStatusLeft() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -5815259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user or the chat was banned (and hence is not a member of the chat). Implies the user can't return to the chat, view messages, or be used as a participant identifier to join a video chat of the chat.
     */
    public static class ChatMemberStatusBanned extends ChatMemberStatus {
        /**
         * Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever. Always 0 in basic groups.
         */
        public int bannedUntilDate;

        /**
         * The user or the chat was banned (and hence is not a member of the chat). Implies the user can't return to the chat, view messages, or be used as a participant identifier to join a video chat of the chat.
         */
        public ChatMemberStatusBanned() {
        }

        /**
         * The user or the chat was banned (and hence is not a member of the chat). Implies the user can't return to the chat, view messages, or be used as a participant identifier to join a video chat of the chat.
         *
         * @param bannedUntilDate Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever. Always 0 in basic groups.
         */
        public ChatMemberStatusBanned(int bannedUntilDate) {
            this.bannedUntilDate = bannedUntilDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1653518666;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat members.
     */
    public static class ChatMembers extends Object {
        /**
         * Approximate total number of chat members found.
         */
        public int totalCount;
        /**
         * A list of chat members.
         */
        public ChatMember[] members;

        /**
         * Contains a list of chat members.
         */
        public ChatMembers() {
        }

        /**
         * Contains a list of chat members.
         *
         * @param totalCount Approximate total number of chat members found.
         * @param members A list of chat members.
         */
        public ChatMembers(int totalCount, ChatMember[] members) {
            this.totalCount = totalCount;
            this.members = members;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -497558622;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Specifies the kind of chat members to return in searchChatMembers.
     */
    public abstract static class ChatMembersFilter extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatMembersFilterContacts.CONSTRUCTOR,
            ChatMembersFilterAdministrators.CONSTRUCTOR,
            ChatMembersFilterMembers.CONSTRUCTOR,
            ChatMembersFilterMention.CONSTRUCTOR,
            ChatMembersFilterRestricted.CONSTRUCTOR,
            ChatMembersFilterBanned.CONSTRUCTOR,
            ChatMembersFilterBots.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatMembersFilter() {
        }
    }

    /**
     * Returns contacts of the user.
     */
    public static class ChatMembersFilterContacts extends ChatMembersFilter {

        /**
         * Returns contacts of the user.
         */
        public ChatMembersFilterContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1774485671;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the owner and administrators.
     */
    public static class ChatMembersFilterAdministrators extends ChatMembersFilter {

        /**
         * Returns the owner and administrators.
         */
        public ChatMembersFilterAdministrators() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1266893796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all chat members, including restricted chat members.
     */
    public static class ChatMembersFilterMembers extends ChatMembersFilter {

        /**
         * Returns all chat members, including restricted chat members.
         */
        public ChatMembersFilterMembers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 670504342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users which can be mentioned in the chat.
     */
    public static class ChatMembersFilterMention extends ChatMembersFilter {
        /**
         * If non-zero, the identifier of the current message thread.
         */
        public long messageThreadId;

        /**
         * Returns users which can be mentioned in the chat.
         */
        public ChatMembersFilterMention() {
        }

        /**
         * Returns users which can be mentioned in the chat.
         *
         * @param messageThreadId If non-zero, the identifier of the current message thread.
         */
        public ChatMembersFilterMention(long messageThreadId) {
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 856419831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users under certain restrictions in the chat; can be used only by administrators in a supergroup.
     */
    public static class ChatMembersFilterRestricted extends ChatMembersFilter {

        /**
         * Returns users under certain restrictions in the chat; can be used only by administrators in a supergroup.
         */
        public ChatMembersFilterRestricted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1256282813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users banned from the chat; can be used only by administrators in a supergroup or in a channel.
     */
    public static class ChatMembersFilterBanned extends ChatMembersFilter {

        /**
         * Returns users banned from the chat; can be used only by administrators in a supergroup or in a channel.
         */
        public ChatMembersFilterBanned() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1863102648;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns bot members of the chat.
     */
    public static class ChatMembersFilterBots extends ChatMembersFilter {

        /**
         * Returns bot members of the chat.
         */
        public ChatMembersFilterBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1422567288;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a message sender, which can be used to send messages in a chat.
     */
    public static class ChatMessageSender extends Object {
        /**
         * The message sender.
         */
        public MessageSender sender;
        /**
         * True, if Telegram Premium is needed to use the message sender.
         */
        public boolean needsPremium;

        /**
         * Represents a message sender, which can be used to send messages in a chat.
         */
        public ChatMessageSender() {
        }

        /**
         * Represents a message sender, which can be used to send messages in a chat.
         *
         * @param sender The message sender.
         * @param needsPremium True, if Telegram Premium is needed to use the message sender.
         */
        public ChatMessageSender(MessageSender sender, boolean needsPremium) {
            this.sender = sender;
            this.needsPremium = needsPremium;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 760590010;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of message senders, which can be used to send messages in a chat.
     */
    public static class ChatMessageSenders extends Object {
        /**
         * List of available message senders.
         */
        public ChatMessageSender[] senders;

        /**
         * Represents a list of message senders, which can be used to send messages in a chat.
         */
        public ChatMessageSenders() {
        }

        /**
         * Represents a list of message senders, which can be used to send messages in a chat.
         *
         * @param senders List of available message senders.
         */
        public ChatMessageSenders(ChatMessageSender[] senders) {
            this.senders = senders;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1866230970;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat located nearby.
     */
    public static class ChatNearby extends Object {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Distance to the chat location, in meters.
         */
        public int distance;

        /**
         * Describes a chat located nearby.
         */
        public ChatNearby() {
        }

        /**
         * Describes a chat located nearby.
         *
         * @param chatId Chat identifier.
         * @param distance Distance to the chat location, in meters.
         */
        public ChatNearby(long chatId, int distance) {
            this.chatId = chatId;
            this.distance = distance;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 48120405;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about notification settings for a chat or a forum topic.
     */
    public static class ChatNotificationSettings extends Object {
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of muteFor.
         */
        public boolean useDefaultMuteFor;
        /**
         * Time left before notifications will be unmuted, in seconds.
         */
        public int muteFor;
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of soundId.
         */
        public boolean useDefaultSound;
        /**
         * Identifier of the notification sound to be played for messages; 0 if sound is disabled.
         */
        public long soundId;
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of showPreview.
         */
        public boolean useDefaultShowPreview;
        /**
         * True, if message content must be displayed in notifications.
         */
        public boolean showPreview;
        /**
         * If true, the value for the relevant type of chat is used instead of muteStories.
         */
        public boolean useDefaultMuteStories;
        /**
         * True, if story notifications are disabled for the chat.
         */
        public boolean muteStories;
        /**
         * If true, the value for the relevant type of chat is used instead of storySoundId.
         */
        public boolean useDefaultStorySound;
        /**
         * Identifier of the notification sound to be played for stories; 0 if sound is disabled.
         */
        public long storySoundId;
        /**
         * If true, the value for the relevant type of chat is used instead of showStorySender.
         */
        public boolean useDefaultShowStorySender;
        /**
         * True, if the sender of stories must be displayed in notifications.
         */
        public boolean showStorySender;
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of disablePinnedMessageNotifications.
         */
        public boolean useDefaultDisablePinnedMessageNotifications;
        /**
         * If true, notifications for incoming pinned messages will be created as for an ordinary unread message.
         */
        public boolean disablePinnedMessageNotifications;
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of disableMentionNotifications.
         */
        public boolean useDefaultDisableMentionNotifications;
        /**
         * If true, notifications for messages with mentions will be created as for an ordinary unread message.
         */
        public boolean disableMentionNotifications;

        /**
         * Contains information about notification settings for a chat or a forum topic.
         */
        public ChatNotificationSettings() {
        }

        /**
         * Contains information about notification settings for a chat or a forum topic.
         *
         * @param useDefaultMuteFor If true, the value for the relevant type of chat or the forum chat is used instead of muteFor.
         * @param muteFor Time left before notifications will be unmuted, in seconds.
         * @param useDefaultSound If true, the value for the relevant type of chat or the forum chat is used instead of soundId.
         * @param soundId Identifier of the notification sound to be played for messages; 0 if sound is disabled.
         * @param useDefaultShowPreview If true, the value for the relevant type of chat or the forum chat is used instead of showPreview.
         * @param showPreview True, if message content must be displayed in notifications.
         * @param useDefaultMuteStories If true, the value for the relevant type of chat is used instead of muteStories.
         * @param muteStories True, if story notifications are disabled for the chat.
         * @param useDefaultStorySound If true, the value for the relevant type of chat is used instead of storySoundId.
         * @param storySoundId Identifier of the notification sound to be played for stories; 0 if sound is disabled.
         * @param useDefaultShowStorySender If true, the value for the relevant type of chat is used instead of showStorySender.
         * @param showStorySender True, if the sender of stories must be displayed in notifications.
         * @param useDefaultDisablePinnedMessageNotifications If true, the value for the relevant type of chat or the forum chat is used instead of disablePinnedMessageNotifications.
         * @param disablePinnedMessageNotifications If true, notifications for incoming pinned messages will be created as for an ordinary unread message.
         * @param useDefaultDisableMentionNotifications If true, the value for the relevant type of chat or the forum chat is used instead of disableMentionNotifications.
         * @param disableMentionNotifications If true, notifications for messages with mentions will be created as for an ordinary unread message.
         */
        public ChatNotificationSettings(boolean useDefaultMuteFor, int muteFor, boolean useDefaultSound, long soundId, boolean useDefaultShowPreview, boolean showPreview, boolean useDefaultMuteStories, boolean muteStories, boolean useDefaultStorySound, long storySoundId, boolean useDefaultShowStorySender, boolean showStorySender, boolean useDefaultDisablePinnedMessageNotifications, boolean disablePinnedMessageNotifications, boolean useDefaultDisableMentionNotifications, boolean disableMentionNotifications) {
            this.useDefaultMuteFor = useDefaultMuteFor;
            this.muteFor = muteFor;
            this.useDefaultSound = useDefaultSound;
            this.soundId = soundId;
            this.useDefaultShowPreview = useDefaultShowPreview;
            this.showPreview = showPreview;
            this.useDefaultMuteStories = useDefaultMuteStories;
            this.muteStories = muteStories;
            this.useDefaultStorySound = useDefaultStorySound;
            this.storySoundId = storySoundId;
            this.useDefaultShowStorySender = useDefaultShowStorySender;
            this.showStorySender = showStorySender;
            this.useDefaultDisablePinnedMessageNotifications = useDefaultDisablePinnedMessageNotifications;
            this.disablePinnedMessageNotifications = disablePinnedMessageNotifications;
            this.useDefaultDisableMentionNotifications = useDefaultDisableMentionNotifications;
            this.disableMentionNotifications = disableMentionNotifications;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -572779825;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes actions that a user is allowed to take in a chat.
     */
    public static class ChatPermissions extends Object {
        /**
         * True, if the user can send text messages, contacts, giveaways, giveaway winners, invoices, locations, and venues.
         */
        public boolean canSendBasicMessages;
        /**
         * True, if the user can send music files.
         */
        public boolean canSendAudios;
        /**
         * True, if the user can send documents.
         */
        public boolean canSendDocuments;
        /**
         * True, if the user can send photos.
         */
        public boolean canSendPhotos;
        /**
         * True, if the user can send videos.
         */
        public boolean canSendVideos;
        /**
         * True, if the user can send video notes.
         */
        public boolean canSendVideoNotes;
        /**
         * True, if the user can send voice notes.
         */
        public boolean canSendVoiceNotes;
        /**
         * True, if the user can send polls.
         */
        public boolean canSendPolls;
        /**
         * True, if the user can send animations, games, stickers, and dice and use inline bots.
         */
        public boolean canSendOtherMessages;
        /**
         * True, if the user may add a link preview to their messages.
         */
        public boolean canAddLinkPreviews;
        /**
         * True, if the user can change the chat title, photo, and other settings.
         */
        public boolean canChangeInfo;
        /**
         * True, if the user can invite new users to the chat.
         */
        public boolean canInviteUsers;
        /**
         * True, if the user can pin messages.
         */
        public boolean canPinMessages;
        /**
         * True, if the user can create topics.
         */
        public boolean canCreateTopics;

        /**
         * Describes actions that a user is allowed to take in a chat.
         */
        public ChatPermissions() {
        }

        /**
         * Describes actions that a user is allowed to take in a chat.
         *
         * @param canSendBasicMessages True, if the user can send text messages, contacts, giveaways, giveaway winners, invoices, locations, and venues.
         * @param canSendAudios True, if the user can send music files.
         * @param canSendDocuments True, if the user can send documents.
         * @param canSendPhotos True, if the user can send photos.
         * @param canSendVideos True, if the user can send videos.
         * @param canSendVideoNotes True, if the user can send video notes.
         * @param canSendVoiceNotes True, if the user can send voice notes.
         * @param canSendPolls True, if the user can send polls.
         * @param canSendOtherMessages True, if the user can send animations, games, stickers, and dice and use inline bots.
         * @param canAddLinkPreviews True, if the user may add a link preview to their messages.
         * @param canChangeInfo True, if the user can change the chat title, photo, and other settings.
         * @param canInviteUsers True, if the user can invite new users to the chat.
         * @param canPinMessages True, if the user can pin messages.
         * @param canCreateTopics True, if the user can create topics.
         */
        public ChatPermissions(boolean canSendBasicMessages, boolean canSendAudios, boolean canSendDocuments, boolean canSendPhotos, boolean canSendVideos, boolean canSendVideoNotes, boolean canSendVoiceNotes, boolean canSendPolls, boolean canSendOtherMessages, boolean canAddLinkPreviews, boolean canChangeInfo, boolean canInviteUsers, boolean canPinMessages, boolean canCreateTopics) {
            this.canSendBasicMessages = canSendBasicMessages;
            this.canSendAudios = canSendAudios;
            this.canSendDocuments = canSendDocuments;
            this.canSendPhotos = canSendPhotos;
            this.canSendVideos = canSendVideos;
            this.canSendVideoNotes = canSendVideoNotes;
            this.canSendVoiceNotes = canSendVoiceNotes;
            this.canSendPolls = canSendPolls;
            this.canSendOtherMessages = canSendOtherMessages;
            this.canAddLinkPreviews = canAddLinkPreviews;
            this.canChangeInfo = canChangeInfo;
            this.canInviteUsers = canInviteUsers;
            this.canPinMessages = canPinMessages;
            this.canCreateTopics = canCreateTopics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -118334855;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat or user profile photo.
     */
    public static class ChatPhoto extends Object {
        /**
         * Unique photo identifier.
         */
        public long id;
        /**
         * Point in time (Unix timestamp) when the photo has been added.
         */
        public int addedDate;
        /**
         * Photo minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Available variants of the photo in JPEG format, in different size.
         */
        public PhotoSize[] sizes;
        /**
         * A big (up to 1280x1280) animated variant of the photo in MPEG4 format; may be null.
         */
        @Nullable public AnimatedChatPhoto animation;
        /**
         * A small (160x160) animated variant of the photo in MPEG4 format; may be null even the big animation is available.
         */
        @Nullable public AnimatedChatPhoto smallAnimation;
        /**
         * Sticker-based version of the chat photo; may be null.
         */
        @Nullable public ChatPhotoSticker sticker;

        /**
         * Describes a chat or user profile photo.
         */
        public ChatPhoto() {
        }

        /**
         * Describes a chat or user profile photo.
         *
         * @param id Unique photo identifier.
         * @param addedDate Point in time (Unix timestamp) when the photo has been added.
         * @param minithumbnail Photo minithumbnail; may be null.
         * @param sizes Available variants of the photo in JPEG format, in different size.
         * @param animation A big (up to 1280x1280) animated variant of the photo in MPEG4 format; may be null.
         * @param smallAnimation A small (160x160) animated variant of the photo in MPEG4 format; may be null even the big animation is available.
         * @param sticker Sticker-based version of the chat photo; may be null.
         */
        public ChatPhoto(long id, int addedDate, Minithumbnail minithumbnail, PhotoSize[] sizes, AnimatedChatPhoto animation, AnimatedChatPhoto smallAnimation, ChatPhotoSticker sticker) {
            this.id = id;
            this.addedDate = addedDate;
            this.minithumbnail = minithumbnail;
            this.sizes = sizes;
            this.animation = animation;
            this.smallAnimation = smallAnimation;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1430870201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about the photo of a chat.
     */
    public static class ChatPhotoInfo extends Object {
        /**
         * A small (160x160) chat photo variant in JPEG format. The file can be downloaded only before the photo is changed.
         */
        public File small;
        /**
         * A big (640x640) chat photo variant in JPEG format. The file can be downloaded only before the photo is changed.
         */
        public File big;
        /**
         * Chat photo minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * True, if the photo has animated variant.
         */
        public boolean hasAnimation;
        /**
         * True, if the photo is visible only for the current user.
         */
        public boolean isPersonal;

        /**
         * Contains basic information about the photo of a chat.
         */
        public ChatPhotoInfo() {
        }

        /**
         * Contains basic information about the photo of a chat.
         *
         * @param small A small (160x160) chat photo variant in JPEG format. The file can be downloaded only before the photo is changed.
         * @param big A big (640x640) chat photo variant in JPEG format. The file can be downloaded only before the photo is changed.
         * @param minithumbnail Chat photo minithumbnail; may be null.
         * @param hasAnimation True, if the photo has animated variant.
         * @param isPersonal True, if the photo is visible only for the current user.
         */
        public ChatPhotoInfo(File small, File big, Minithumbnail minithumbnail, boolean hasAnimation, boolean isPersonal) {
            this.small = small;
            this.big = big;
            this.minithumbnail = minithumbnail;
            this.hasAnimation = hasAnimation;
            this.isPersonal = isPersonal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 281195686;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the sticker, which was used to create the chat photo. The sticker is shown at the center of the photo and occupies at most 67% of it.
     */
    public static class ChatPhotoSticker extends Object {
        /**
         * Type of the sticker.
         */
        public ChatPhotoStickerType type;
        /**
         * The fill to be used as background for the sticker; rotation angle in backgroundFillGradient isn't supported.
         */
        public BackgroundFill backgroundFill;

        /**
         * Information about the sticker, which was used to create the chat photo. The sticker is shown at the center of the photo and occupies at most 67% of it.
         */
        public ChatPhotoSticker() {
        }

        /**
         * Information about the sticker, which was used to create the chat photo. The sticker is shown at the center of the photo and occupies at most 67% of it.
         *
         * @param type Type of the sticker.
         * @param backgroundFill The fill to be used as background for the sticker; rotation angle in backgroundFillGradient isn't supported.
         */
        public ChatPhotoSticker(ChatPhotoStickerType type, BackgroundFill backgroundFill) {
            this.type = type;
            this.backgroundFill = backgroundFill;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1459387485;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of sticker, which was used to create a chat photo.
     */
    public abstract static class ChatPhotoStickerType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatPhotoStickerTypeRegularOrMask.CONSTRUCTOR,
            ChatPhotoStickerTypeCustomEmoji.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatPhotoStickerType() {
        }
    }

    /**
     * Information about the sticker, which was used to create the chat photo.
     */
    public static class ChatPhotoStickerTypeRegularOrMask extends ChatPhotoStickerType {
        /**
         * Sticker set identifier.
         */
        public long stickerSetId;
        /**
         * Identifier of the sticker in the set.
         */
        public long stickerId;

        /**
         * Information about the sticker, which was used to create the chat photo.
         */
        public ChatPhotoStickerTypeRegularOrMask() {
        }

        /**
         * Information about the sticker, which was used to create the chat photo.
         *
         * @param stickerSetId Sticker set identifier.
         * @param stickerId Identifier of the sticker in the set.
         */
        public ChatPhotoStickerTypeRegularOrMask(long stickerSetId, long stickerId) {
            this.stickerSetId = stickerSetId;
            this.stickerId = stickerId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -415147620;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the custom emoji, which was used to create the chat photo.
     */
    public static class ChatPhotoStickerTypeCustomEmoji extends ChatPhotoStickerType {
        /**
         * Identifier of the custom emoji.
         */
        public long customEmojiId;

        /**
         * Information about the custom emoji, which was used to create the chat photo.
         */
        public ChatPhotoStickerTypeCustomEmoji() {
        }

        /**
         * Information about the custom emoji, which was used to create the chat photo.
         *
         * @param customEmojiId Identifier of the custom emoji.
         */
        public ChatPhotoStickerTypeCustomEmoji(long customEmojiId) {
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -266224943;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat or user profile photos.
     */
    public static class ChatPhotos extends Object {
        /**
         * Total number of photos.
         */
        public int totalCount;
        /**
         * List of photos.
         */
        public ChatPhoto[] photos;

        /**
         * Contains a list of chat or user profile photos.
         */
        public ChatPhotos() {
        }

        /**
         * Contains a list of chat or user profile photos.
         *
         * @param totalCount Total number of photos.
         * @param photos List of photos.
         */
        public ChatPhotos(int totalCount, ChatPhoto[] photos) {
            this.totalCount = totalCount;
            this.photos = photos;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1510699180;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a position of a chat in a chat list.
     */
    public static class ChatPosition extends Object {
        /**
         * The chat list.
         */
        public ChatList list;
        /**
         * A parameter used to determine order of the chat in the chat list. Chats must be sorted by the pair (order, chat.id) in descending order.
         */
        public long order;
        /**
         * True, if the chat is pinned in the chat list.
         */
        public boolean isPinned;
        /**
         * Source of the chat in the chat list; may be null.
         */
        @Nullable public ChatSource source;

        /**
         * Describes a position of a chat in a chat list.
         */
        public ChatPosition() {
        }

        /**
         * Describes a position of a chat in a chat list.
         *
         * @param list The chat list.
         * @param order A parameter used to determine order of the chat in the chat list. Chats must be sorted by the pair (order, chat.id) in descending order.
         * @param isPinned True, if the chat is pinned in the chat list.
         * @param source Source of the chat in the chat list; may be null.
         */
        public ChatPosition(ChatList list, long order, boolean isPinned, ChatSource source) {
            this.list = list;
            this.order = order;
            this.isPinned = isPinned;
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -622557355;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about revenue earned from sponsored messages in a chat.
     */
    public static class ChatRevenueAmount extends Object {
        /**
         * Cryptocurrency in which revenue is calculated.
         */
        public String cryptocurrency;
        /**
         * Total amount of the cryptocurrency earned, in the smallest units of the cryptocurrency.
         */
        public long totalAmount;
        /**
         * Amount of the cryptocurrency that isn't withdrawn yet, in the smallest units of the cryptocurrency.
         */
        public long balanceAmount;
        /**
         * Amount of the cryptocurrency available for withdrawal, in the smallest units of the cryptocurrency.
         */
        public long availableAmount;

        /**
         * Contains information about revenue earned from sponsored messages in a chat.
         */
        public ChatRevenueAmount() {
        }

        /**
         * Contains information about revenue earned from sponsored messages in a chat.
         *
         * @param cryptocurrency Cryptocurrency in which revenue is calculated.
         * @param totalAmount Total amount of the cryptocurrency earned, in the smallest units of the cryptocurrency.
         * @param balanceAmount Amount of the cryptocurrency that isn't withdrawn yet, in the smallest units of the cryptocurrency.
         * @param availableAmount Amount of the cryptocurrency available for withdrawal, in the smallest units of the cryptocurrency.
         */
        public ChatRevenueAmount(String cryptocurrency, long totalAmount, long balanceAmount, long availableAmount) {
            this.cryptocurrency = cryptocurrency;
            this.totalAmount = totalAmount;
            this.balanceAmount = balanceAmount;
            this.availableAmount = availableAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1329312415;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about revenue earned from sponsored messages in a chat.
     */
    public static class ChatRevenueStatistics extends Object {
        /**
         * A graph containing amount of revenue in a given hour.
         */
        public StatisticalGraph revenueByHourGraph;
        /**
         * A graph containing amount of revenue.
         */
        public StatisticalGraph revenueGraph;
        /**
         * Amount of earned revenue.
         */
        public ChatRevenueAmount revenueAmount;
        /**
         * Current conversion rate of the cryptocurrency in which revenue is calculated to USD.
         */
        public double usdRate;

        /**
         * A detailed statistics about revenue earned from sponsored messages in a chat.
         */
        public ChatRevenueStatistics() {
        }

        /**
         * A detailed statistics about revenue earned from sponsored messages in a chat.
         *
         * @param revenueByHourGraph A graph containing amount of revenue in a given hour.
         * @param revenueGraph A graph containing amount of revenue.
         * @param revenueAmount Amount of earned revenue.
         * @param usdRate Current conversion rate of the cryptocurrency in which revenue is calculated to USD.
         */
        public ChatRevenueStatistics(StatisticalGraph revenueByHourGraph, StatisticalGraph revenueGraph, ChatRevenueAmount revenueAmount, double usdRate) {
            this.revenueByHourGraph = revenueByHourGraph;
            this.revenueGraph = revenueGraph;
            this.revenueAmount = revenueAmount;
            this.usdRate = usdRate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1667438779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a chat revenue transactions.
     */
    public static class ChatRevenueTransaction extends Object {
        /**
         * Cryptocurrency in which revenue is calculated.
         */
        public String cryptocurrency;
        /**
         * The withdrawn amount, in the smallest units of the cryptocurrency.
         */
        public long cryptocurrencyAmount;
        /**
         * Type of the transaction.
         */
        public ChatRevenueTransactionType type;

        /**
         * Contains a chat revenue transactions.
         */
        public ChatRevenueTransaction() {
        }

        /**
         * Contains a chat revenue transactions.
         *
         * @param cryptocurrency Cryptocurrency in which revenue is calculated.
         * @param cryptocurrencyAmount The withdrawn amount, in the smallest units of the cryptocurrency.
         * @param type Type of the transaction.
         */
        public ChatRevenueTransaction(String cryptocurrency, long cryptocurrencyAmount, ChatRevenueTransactionType type) {
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 80192767;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of transaction for revenue earned from sponsored messages in a chat.
     */
    public abstract static class ChatRevenueTransactionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatRevenueTransactionTypeEarnings.CONSTRUCTOR,
            ChatRevenueTransactionTypeWithdrawal.CONSTRUCTOR,
            ChatRevenueTransactionTypeRefund.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatRevenueTransactionType() {
        }
    }

    /**
     * Describes earnings from sponsored messages in a chat in some time frame.
     */
    public static class ChatRevenueTransactionTypeEarnings extends ChatRevenueTransactionType {
        /**
         * Point in time (Unix timestamp) when the earnings started.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the earnings ended.
         */
        public int endDate;

        /**
         * Describes earnings from sponsored messages in a chat in some time frame.
         */
        public ChatRevenueTransactionTypeEarnings() {
        }

        /**
         * Describes earnings from sponsored messages in a chat in some time frame.
         *
         * @param startDate Point in time (Unix timestamp) when the earnings started.
         * @param endDate Point in time (Unix timestamp) when the earnings ended.
         */
        public ChatRevenueTransactionTypeEarnings(int startDate, int endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -400776056;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a withdrawal of earnings.
     */
    public static class ChatRevenueTransactionTypeWithdrawal extends ChatRevenueTransactionType {
        /**
         * Point in time (Unix timestamp) when the earnings withdrawal started.
         */
        public int withdrawalDate;
        /**
         * Name of the payment provider.
         */
        public String provider;
        /**
         * State of the withdrawal.
         */
        public RevenueWithdrawalState state;

        /**
         * Describes a withdrawal of earnings.
         */
        public ChatRevenueTransactionTypeWithdrawal() {
        }

        /**
         * Describes a withdrawal of earnings.
         *
         * @param withdrawalDate Point in time (Unix timestamp) when the earnings withdrawal started.
         * @param provider Name of the payment provider.
         * @param state State of the withdrawal.
         */
        public ChatRevenueTransactionTypeWithdrawal(int withdrawalDate, String provider, RevenueWithdrawalState state) {
            this.withdrawalDate = withdrawalDate;
            this.provider = provider;
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 252939755;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a refund for failed withdrawal of earnings.
     */
    public static class ChatRevenueTransactionTypeRefund extends ChatRevenueTransactionType {
        /**
         * Point in time (Unix timestamp) when the transaction was refunded.
         */
        public int refundDate;
        /**
         * Name of the payment provider.
         */
        public String provider;

        /**
         * Describes a refund for failed withdrawal of earnings.
         */
        public ChatRevenueTransactionTypeRefund() {
        }

        /**
         * Describes a refund for failed withdrawal of earnings.
         *
         * @param refundDate Point in time (Unix timestamp) when the transaction was refunded.
         * @param provider Name of the payment provider.
         */
        public ChatRevenueTransactionTypeRefund(int refundDate, String provider) {
            this.refundDate = refundDate;
            this.provider = provider;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 302430279;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat revenue transactions.
     */
    public static class ChatRevenueTransactions extends Object {
        /**
         * Total number of transactions.
         */
        public int totalCount;
        /**
         * List of transactions.
         */
        public ChatRevenueTransaction[] transactions;

        /**
         * Contains a list of chat revenue transactions.
         */
        public ChatRevenueTransactions() {
        }

        /**
         * Contains a list of chat revenue transactions.
         *
         * @param totalCount Total number of transactions.
         * @param transactions List of transactions.
         */
        public ChatRevenueTransactions(int totalCount, ChatRevenueTransaction[] transactions) {
            this.totalCount = totalCount;
            this.transactions = transactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -553258171;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a reason why an external chat is shown in a chat list.
     */
    public abstract static class ChatSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatSourceMtprotoProxy.CONSTRUCTOR,
            ChatSourcePublicServiceAnnouncement.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatSource() {
        }
    }

    /**
     * The chat is sponsored by the user's MTProxy server.
     */
    public static class ChatSourceMtprotoProxy extends ChatSource {

        /**
         * The chat is sponsored by the user's MTProxy server.
         */
        public ChatSourceMtprotoProxy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 394074115;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat contains a public service announcement.
     */
    public static class ChatSourcePublicServiceAnnouncement extends ChatSource {
        /**
         * The type of the announcement.
         */
        public String type;
        /**
         * The text of the announcement.
         */
        public String text;

        /**
         * The chat contains a public service announcement.
         */
        public ChatSourcePublicServiceAnnouncement() {
        }

        /**
         * The chat contains a public service announcement.
         *
         * @param type The type of the announcement.
         * @param text The text of the announcement.
         */
        public ChatSourcePublicServiceAnnouncement(String type, String text) {
            this.type = type;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -328571244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains a detailed statistics about a chat.
     */
    public abstract static class ChatStatistics extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatStatisticsSupergroup.CONSTRUCTOR,
            ChatStatisticsChannel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatStatistics() {
        }
    }

    /**
     * A detailed statistics about a supergroup chat.
     */
    public static class ChatStatisticsSupergroup extends ChatStatistics {
        /**
         * A period to which the statistics applies.
         */
        public DateRange period;
        /**
         * Number of members in the chat.
         */
        public StatisticalValue memberCount;
        /**
         * Number of messages sent to the chat.
         */
        public StatisticalValue messageCount;
        /**
         * Number of users who viewed messages in the chat.
         */
        public StatisticalValue viewerCount;
        /**
         * Number of users who sent messages to the chat.
         */
        public StatisticalValue senderCount;
        /**
         * A graph containing number of members in the chat.
         */
        public StatisticalGraph memberCountGraph;
        /**
         * A graph containing number of members joined and left the chat.
         */
        public StatisticalGraph joinGraph;
        /**
         * A graph containing number of new member joins per source.
         */
        public StatisticalGraph joinBySourceGraph;
        /**
         * A graph containing distribution of active users per language.
         */
        public StatisticalGraph languageGraph;
        /**
         * A graph containing distribution of sent messages by content type.
         */
        public StatisticalGraph messageContentGraph;
        /**
         * A graph containing number of different actions in the chat.
         */
        public StatisticalGraph actionGraph;
        /**
         * A graph containing distribution of message views per hour.
         */
        public StatisticalGraph dayGraph;
        /**
         * A graph containing distribution of message views per day of week.
         */
        public StatisticalGraph weekGraph;
        /**
         * List of users sent most messages in the last week.
         */
        public ChatStatisticsMessageSenderInfo[] topSenders;
        /**
         * List of most active administrators in the last week.
         */
        public ChatStatisticsAdministratorActionsInfo[] topAdministrators;
        /**
         * List of most active inviters of new members in the last week.
         */
        public ChatStatisticsInviterInfo[] topInviters;

        /**
         * A detailed statistics about a supergroup chat.
         */
        public ChatStatisticsSupergroup() {
        }

        /**
         * A detailed statistics about a supergroup chat.
         *
         * @param period A period to which the statistics applies.
         * @param memberCount Number of members in the chat.
         * @param messageCount Number of messages sent to the chat.
         * @param viewerCount Number of users who viewed messages in the chat.
         * @param senderCount Number of users who sent messages to the chat.
         * @param memberCountGraph A graph containing number of members in the chat.
         * @param joinGraph A graph containing number of members joined and left the chat.
         * @param joinBySourceGraph A graph containing number of new member joins per source.
         * @param languageGraph A graph containing distribution of active users per language.
         * @param messageContentGraph A graph containing distribution of sent messages by content type.
         * @param actionGraph A graph containing number of different actions in the chat.
         * @param dayGraph A graph containing distribution of message views per hour.
         * @param weekGraph A graph containing distribution of message views per day of week.
         * @param topSenders List of users sent most messages in the last week.
         * @param topAdministrators List of most active administrators in the last week.
         * @param topInviters List of most active inviters of new members in the last week.
         */
        public ChatStatisticsSupergroup(DateRange period, StatisticalValue memberCount, StatisticalValue messageCount, StatisticalValue viewerCount, StatisticalValue senderCount, StatisticalGraph memberCountGraph, StatisticalGraph joinGraph, StatisticalGraph joinBySourceGraph, StatisticalGraph languageGraph, StatisticalGraph messageContentGraph, StatisticalGraph actionGraph, StatisticalGraph dayGraph, StatisticalGraph weekGraph, ChatStatisticsMessageSenderInfo[] topSenders, ChatStatisticsAdministratorActionsInfo[] topAdministrators, ChatStatisticsInviterInfo[] topInviters) {
            this.period = period;
            this.memberCount = memberCount;
            this.messageCount = messageCount;
            this.viewerCount = viewerCount;
            this.senderCount = senderCount;
            this.memberCountGraph = memberCountGraph;
            this.joinGraph = joinGraph;
            this.joinBySourceGraph = joinBySourceGraph;
            this.languageGraph = languageGraph;
            this.messageContentGraph = messageContentGraph;
            this.actionGraph = actionGraph;
            this.dayGraph = dayGraph;
            this.weekGraph = weekGraph;
            this.topSenders = topSenders;
            this.topAdministrators = topAdministrators;
            this.topInviters = topInviters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -17244633;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about a channel chat.
     */
    public static class ChatStatisticsChannel extends ChatStatistics {
        /**
         * A period to which the statistics applies.
         */
        public DateRange period;
        /**
         * Number of members in the chat.
         */
        public StatisticalValue memberCount;
        /**
         * Mean number of times the recently sent messages were viewed.
         */
        public StatisticalValue meanMessageViewCount;
        /**
         * Mean number of times the recently sent messages were shared.
         */
        public StatisticalValue meanMessageShareCount;
        /**
         * Mean number of times reactions were added to the recently sent messages.
         */
        public StatisticalValue meanMessageReactionCount;
        /**
         * Mean number of times the recently sent stories were viewed.
         */
        public StatisticalValue meanStoryViewCount;
        /**
         * Mean number of times the recently sent stories were shared.
         */
        public StatisticalValue meanStoryShareCount;
        /**
         * Mean number of times reactions were added to the recently sent stories.
         */
        public StatisticalValue meanStoryReactionCount;
        /**
         * A percentage of users with enabled notifications for the chat; 0-100.
         */
        public double enabledNotificationsPercentage;
        /**
         * A graph containing number of members in the chat.
         */
        public StatisticalGraph memberCountGraph;
        /**
         * A graph containing number of members joined and left the chat.
         */
        public StatisticalGraph joinGraph;
        /**
         * A graph containing number of members muted and unmuted the chat.
         */
        public StatisticalGraph muteGraph;
        /**
         * A graph containing number of message views in a given hour in the last two weeks.
         */
        public StatisticalGraph viewCountByHourGraph;
        /**
         * A graph containing number of message views per source.
         */
        public StatisticalGraph viewCountBySourceGraph;
        /**
         * A graph containing number of new member joins per source.
         */
        public StatisticalGraph joinBySourceGraph;
        /**
         * A graph containing number of users viewed chat messages per language.
         */
        public StatisticalGraph languageGraph;
        /**
         * A graph containing number of chat message views and shares.
         */
        public StatisticalGraph messageInteractionGraph;
        /**
         * A graph containing number of reactions on messages.
         */
        public StatisticalGraph messageReactionGraph;
        /**
         * A graph containing number of story views and shares.
         */
        public StatisticalGraph storyInteractionGraph;
        /**
         * A graph containing number of reactions on stories.
         */
        public StatisticalGraph storyReactionGraph;
        /**
         * A graph containing number of views of associated with the chat instant views.
         */
        public StatisticalGraph instantViewInteractionGraph;
        /**
         * Detailed statistics about number of views and shares of recently sent messages and stories.
         */
        public ChatStatisticsInteractionInfo[] recentInteractions;

        /**
         * A detailed statistics about a channel chat.
         */
        public ChatStatisticsChannel() {
        }

        /**
         * A detailed statistics about a channel chat.
         *
         * @param period A period to which the statistics applies.
         * @param memberCount Number of members in the chat.
         * @param meanMessageViewCount Mean number of times the recently sent messages were viewed.
         * @param meanMessageShareCount Mean number of times the recently sent messages were shared.
         * @param meanMessageReactionCount Mean number of times reactions were added to the recently sent messages.
         * @param meanStoryViewCount Mean number of times the recently sent stories were viewed.
         * @param meanStoryShareCount Mean number of times the recently sent stories were shared.
         * @param meanStoryReactionCount Mean number of times reactions were added to the recently sent stories.
         * @param enabledNotificationsPercentage A percentage of users with enabled notifications for the chat; 0-100.
         * @param memberCountGraph A graph containing number of members in the chat.
         * @param joinGraph A graph containing number of members joined and left the chat.
         * @param muteGraph A graph containing number of members muted and unmuted the chat.
         * @param viewCountByHourGraph A graph containing number of message views in a given hour in the last two weeks.
         * @param viewCountBySourceGraph A graph containing number of message views per source.
         * @param joinBySourceGraph A graph containing number of new member joins per source.
         * @param languageGraph A graph containing number of users viewed chat messages per language.
         * @param messageInteractionGraph A graph containing number of chat message views and shares.
         * @param messageReactionGraph A graph containing number of reactions on messages.
         * @param storyInteractionGraph A graph containing number of story views and shares.
         * @param storyReactionGraph A graph containing number of reactions on stories.
         * @param instantViewInteractionGraph A graph containing number of views of associated with the chat instant views.
         * @param recentInteractions Detailed statistics about number of views and shares of recently sent messages and stories.
         */
        public ChatStatisticsChannel(DateRange period, StatisticalValue memberCount, StatisticalValue meanMessageViewCount, StatisticalValue meanMessageShareCount, StatisticalValue meanMessageReactionCount, StatisticalValue meanStoryViewCount, StatisticalValue meanStoryShareCount, StatisticalValue meanStoryReactionCount, double enabledNotificationsPercentage, StatisticalGraph memberCountGraph, StatisticalGraph joinGraph, StatisticalGraph muteGraph, StatisticalGraph viewCountByHourGraph, StatisticalGraph viewCountBySourceGraph, StatisticalGraph joinBySourceGraph, StatisticalGraph languageGraph, StatisticalGraph messageInteractionGraph, StatisticalGraph messageReactionGraph, StatisticalGraph storyInteractionGraph, StatisticalGraph storyReactionGraph, StatisticalGraph instantViewInteractionGraph, ChatStatisticsInteractionInfo[] recentInteractions) {
            this.period = period;
            this.memberCount = memberCount;
            this.meanMessageViewCount = meanMessageViewCount;
            this.meanMessageShareCount = meanMessageShareCount;
            this.meanMessageReactionCount = meanMessageReactionCount;
            this.meanStoryViewCount = meanStoryViewCount;
            this.meanStoryShareCount = meanStoryShareCount;
            this.meanStoryReactionCount = meanStoryReactionCount;
            this.enabledNotificationsPercentage = enabledNotificationsPercentage;
            this.memberCountGraph = memberCountGraph;
            this.joinGraph = joinGraph;
            this.muteGraph = muteGraph;
            this.viewCountByHourGraph = viewCountByHourGraph;
            this.viewCountBySourceGraph = viewCountBySourceGraph;
            this.joinBySourceGraph = joinBySourceGraph;
            this.languageGraph = languageGraph;
            this.messageInteractionGraph = messageInteractionGraph;
            this.messageReactionGraph = messageReactionGraph;
            this.storyInteractionGraph = storyInteractionGraph;
            this.storyReactionGraph = storyReactionGraph;
            this.instantViewInteractionGraph = instantViewInteractionGraph;
            this.recentInteractions = recentInteractions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1375151660;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains statistics about administrator actions done by a user.
     */
    public static class ChatStatisticsAdministratorActionsInfo extends Object {
        /**
         * Administrator user identifier.
         */
        public long userId;
        /**
         * Number of messages deleted by the administrator.
         */
        public int deletedMessageCount;
        /**
         * Number of users banned by the administrator.
         */
        public int bannedUserCount;
        /**
         * Number of users restricted by the administrator.
         */
        public int restrictedUserCount;

        /**
         * Contains statistics about administrator actions done by a user.
         */
        public ChatStatisticsAdministratorActionsInfo() {
        }

        /**
         * Contains statistics about administrator actions done by a user.
         *
         * @param userId Administrator user identifier.
         * @param deletedMessageCount Number of messages deleted by the administrator.
         * @param bannedUserCount Number of users banned by the administrator.
         * @param restrictedUserCount Number of users restricted by the administrator.
         */
        public ChatStatisticsAdministratorActionsInfo(long userId, int deletedMessageCount, int bannedUserCount, int restrictedUserCount) {
            this.userId = userId;
            this.deletedMessageCount = deletedMessageCount;
            this.bannedUserCount = bannedUserCount;
            this.restrictedUserCount = restrictedUserCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -406467202;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains statistics about interactions with a message sent in the chat or a story sent by the chat.
     */
    public static class ChatStatisticsInteractionInfo extends Object {
        /**
         * Type of the object.
         */
        public ChatStatisticsObjectType objectType;
        /**
         * Number of times the object was viewed.
         */
        public int viewCount;
        /**
         * Number of times the object was forwarded.
         */
        public int forwardCount;
        /**
         * Number of times reactions were added to the object.
         */
        public int reactionCount;

        /**
         * Contains statistics about interactions with a message sent in the chat or a story sent by the chat.
         */
        public ChatStatisticsInteractionInfo() {
        }

        /**
         * Contains statistics about interactions with a message sent in the chat or a story sent by the chat.
         *
         * @param objectType Type of the object.
         * @param viewCount Number of times the object was viewed.
         * @param forwardCount Number of times the object was forwarded.
         * @param reactionCount Number of times reactions were added to the object.
         */
        public ChatStatisticsInteractionInfo(ChatStatisticsObjectType objectType, int viewCount, int forwardCount, int reactionCount) {
            this.objectType = objectType;
            this.viewCount = viewCount;
            this.forwardCount = forwardCount;
            this.reactionCount = reactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1766496909;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains statistics about number of new members invited by a user.
     */
    public static class ChatStatisticsInviterInfo extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Number of new members invited by the user.
         */
        public int addedMemberCount;

        /**
         * Contains statistics about number of new members invited by a user.
         */
        public ChatStatisticsInviterInfo() {
        }

        /**
         * Contains statistics about number of new members invited by a user.
         *
         * @param userId User identifier.
         * @param addedMemberCount Number of new members invited by the user.
         */
        public ChatStatisticsInviterInfo(long userId, int addedMemberCount) {
            this.userId = userId;
            this.addedMemberCount = addedMemberCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 629396619;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains statistics about messages sent by a user.
     */
    public static class ChatStatisticsMessageSenderInfo extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Number of sent messages.
         */
        public int sentMessageCount;
        /**
         * Average number of characters in sent messages; 0 if unknown.
         */
        public int averageCharacterCount;

        /**
         * Contains statistics about messages sent by a user.
         */
        public ChatStatisticsMessageSenderInfo() {
        }

        /**
         * Contains statistics about messages sent by a user.
         *
         * @param userId User identifier.
         * @param sentMessageCount Number of sent messages.
         * @param averageCharacterCount Average number of characters in sent messages; 0 if unknown.
         */
        public ChatStatisticsMessageSenderInfo(long userId, int sentMessageCount, int averageCharacterCount) {
            this.userId = userId;
            this.sentMessageCount = sentMessageCount;
            this.averageCharacterCount = averageCharacterCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1762295371;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of object, for which statistics are provided.
     */
    public abstract static class ChatStatisticsObjectType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatStatisticsObjectTypeMessage.CONSTRUCTOR,
            ChatStatisticsObjectTypeStory.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatStatisticsObjectType() {
        }
    }

    /**
     * Describes a message sent in the chat.
     */
    public static class ChatStatisticsObjectTypeMessage extends ChatStatisticsObjectType {
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * Describes a message sent in the chat.
         */
        public ChatStatisticsObjectTypeMessage() {
        }

        /**
         * Describes a message sent in the chat.
         *
         * @param messageId Message identifier.
         */
        public ChatStatisticsObjectTypeMessage(long messageId) {
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1872700662;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a story sent by the chat.
     */
    public static class ChatStatisticsObjectTypeStory extends ChatStatisticsObjectType {
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * Describes a story sent by the chat.
         */
        public ChatStatisticsObjectTypeStory() {
        }

        /**
         * Describes a story sent by the chat.
         *
         * @param storyId Story identifier.
         */
        public ChatStatisticsObjectTypeStory(int storyId) {
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 364575152;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat theme.
     */
    public static class ChatTheme extends Object {
        /**
         * Theme name.
         */
        public String name;
        /**
         * Theme settings for a light chat theme.
         */
        public ThemeSettings lightSettings;
        /**
         * Theme settings for a dark chat theme.
         */
        public ThemeSettings darkSettings;

        /**
         * Describes a chat theme.
         */
        public ChatTheme() {
        }

        /**
         * Describes a chat theme.
         *
         * @param name Theme name.
         * @param lightSettings Theme settings for a light chat theme.
         * @param darkSettings Theme settings for a dark chat theme.
         */
        public ChatTheme(String name, ThemeSettings lightSettings, ThemeSettings darkSettings) {
            this.name = name;
            this.lightSettings = lightSettings;
            this.darkSettings = darkSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -113218503;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of chat.
     */
    public abstract static class ChatType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatTypePrivate.CONSTRUCTOR,
            ChatTypeBasicGroup.CONSTRUCTOR,
            ChatTypeSupergroup.CONSTRUCTOR,
            ChatTypeSecret.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatType() {
        }
    }

    /**
     * An ordinary chat with a user.
     */
    public static class ChatTypePrivate extends ChatType {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * An ordinary chat with a user.
         */
        public ChatTypePrivate() {
        }

        /**
         * An ordinary chat with a user.
         *
         * @param userId User identifier.
         */
        public ChatTypePrivate(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1579049844;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A basic group (a chat with 0-200 other users).
     */
    public static class ChatTypeBasicGroup extends ChatType {
        /**
         * Basic group identifier.
         */
        public long basicGroupId;

        /**
         * A basic group (a chat with 0-200 other users).
         */
        public ChatTypeBasicGroup() {
        }

        /**
         * A basic group (a chat with 0-200 other users).
         *
         * @param basicGroupId Basic group identifier.
         */
        public ChatTypeBasicGroup(long basicGroupId) {
            this.basicGroupId = basicGroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 973884508;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A supergroup or channel (with unlimited members).
     */
    public static class ChatTypeSupergroup extends ChatType {
        /**
         * Supergroup or channel identifier.
         */
        public long supergroupId;
        /**
         * True, if the supergroup is a channel.
         */
        public boolean isChannel;

        /**
         * A supergroup or channel (with unlimited members).
         */
        public ChatTypeSupergroup() {
        }

        /**
         * A supergroup or channel (with unlimited members).
         *
         * @param supergroupId Supergroup or channel identifier.
         * @param isChannel True, if the supergroup is a channel.
         */
        public ChatTypeSupergroup(long supergroupId, boolean isChannel) {
            this.supergroupId = supergroupId;
            this.isChannel = isChannel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1472570774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A secret chat with a user.
     */
    public static class ChatTypeSecret extends ChatType {
        /**
         * Secret chat identifier.
         */
        public int secretChatId;
        /**
         * User identifier of the other user in the secret chat.
         */
        public long userId;

        /**
         * A secret chat with a user.
         */
        public ChatTypeSecret() {
        }

        /**
         * A secret chat with a user.
         *
         * @param secretChatId Secret chat identifier.
         * @param userId User identifier of the other user in the secret chat.
         */
        public ChatTypeSecret(int secretChatId, long userId) {
            this.secretChatId = secretChatId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 862366513;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of chats.
     */
    public static class Chats extends Object {
        /**
         * Approximate total number of chats found.
         */
        public int totalCount;
        /**
         * List of chat identifiers.
         */
        public long[] chatIds;

        /**
         * Represents a list of chats.
         */
        public Chats() {
        }

        /**
         * Represents a list of chats.
         *
         * @param totalCount Approximate total number of chats found.
         * @param chatIds List of chat identifiers.
         */
        public Chats(int totalCount, long[] chatIds) {
            this.totalCount = totalCount;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1809654812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of chats located nearby.
     */
    public static class ChatsNearby extends Object {
        /**
         * List of users nearby.
         */
        public ChatNearby[] usersNearby;
        /**
         * List of location-based supergroups nearby.
         */
        public ChatNearby[] supergroupsNearby;

        /**
         * Represents a list of chats located nearby.
         */
        public ChatsNearby() {
        }

        /**
         * Represents a list of chats located nearby.
         *
         * @param usersNearby List of users nearby.
         * @param supergroupsNearby List of location-based supergroups nearby.
         */
        public ChatsNearby(ChatNearby[] usersNearby, ChatNearby[] supergroupsNearby) {
            this.usersNearby = usersNearby;
            this.supergroupsNearby = supergroupsNearby;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 187746081;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of checking whether a username can be set for a chat.
     */
    public abstract static class CheckChatUsernameResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CheckChatUsernameResultOk.CONSTRUCTOR,
            CheckChatUsernameResultUsernameInvalid.CONSTRUCTOR,
            CheckChatUsernameResultUsernameOccupied.CONSTRUCTOR,
            CheckChatUsernameResultUsernamePurchasable.CONSTRUCTOR,
            CheckChatUsernameResultPublicChatsTooMany.CONSTRUCTOR,
            CheckChatUsernameResultPublicGroupsUnavailable.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CheckChatUsernameResult() {
        }
    }

    /**
     * The username can be set.
     */
    public static class CheckChatUsernameResultOk extends CheckChatUsernameResult {

        /**
         * The username can be set.
         */
        public CheckChatUsernameResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1498956964;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The username is invalid.
     */
    public static class CheckChatUsernameResultUsernameInvalid extends CheckChatUsernameResult {

        /**
         * The username is invalid.
         */
        public CheckChatUsernameResultUsernameInvalid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -636979370;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The username is occupied.
     */
    public static class CheckChatUsernameResultUsernameOccupied extends CheckChatUsernameResult {

        /**
         * The username is occupied.
         */
        public CheckChatUsernameResultUsernameOccupied() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1320892201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The username can be purchased at https://fragment.com. Information about the username can be received using getCollectibleItemInfo.
     */
    public static class CheckChatUsernameResultUsernamePurchasable extends CheckChatUsernameResult {

        /**
         * The username can be purchased at https://fragment.com. Information about the username can be received using getCollectibleItemInfo.
         */
        public CheckChatUsernameResultUsernamePurchasable() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 5885529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has too many chats with username, one of them must be made private first.
     */
    public static class CheckChatUsernameResultPublicChatsTooMany extends CheckChatUsernameResult {

        /**
         * The user has too many chats with username, one of them must be made private first.
         */
        public CheckChatUsernameResultPublicChatsTooMany() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -659264388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't be a member of a public supergroup.
     */
    public static class CheckChatUsernameResultPublicGroupsUnavailable extends CheckChatUsernameResult {

        /**
         * The user can't be a member of a public supergroup.
         */
        public CheckChatUsernameResultPublicGroupsUnavailable() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -51833641;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of checking whether a name can be used for a new sticker set.
     */
    public abstract static class CheckStickerSetNameResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CheckStickerSetNameResultOk.CONSTRUCTOR,
            CheckStickerSetNameResultNameInvalid.CONSTRUCTOR,
            CheckStickerSetNameResultNameOccupied.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CheckStickerSetNameResult() {
        }
    }

    /**
     * The name can be set.
     */
    public static class CheckStickerSetNameResultOk extends CheckStickerSetNameResult {

        /**
         * The name can be set.
         */
        public CheckStickerSetNameResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1404308904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The name is invalid.
     */
    public static class CheckStickerSetNameResultNameInvalid extends CheckStickerSetNameResult {

        /**
         * The name is invalid.
         */
        public CheckStickerSetNameResultNameInvalid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 177992244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The name is occupied.
     */
    public static class CheckStickerSetNameResultNameOccupied extends CheckStickerSetNameResult {

        /**
         * The name is occupied.
         */
        public CheckStickerSetNameResultNameOccupied() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1012980872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user that had or will have a birthday soon.
     */
    public static class CloseBirthdayUser extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Birthdate of the user.
         */
        public Birthdate birthdate;

        /**
         * Describes a user that had or will have a birthday soon.
         */
        public CloseBirthdayUser() {
        }

        /**
         * Describes a user that had or will have a birthday soon.
         *
         * @param userId User identifier.
         * @param birthdate Birthdate of the user.
         */
        public CloseBirthdayUser(long userId, Birthdate birthdate) {
            this.userId = userId;
            this.birthdate = birthdate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2147067410;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a closed vector path. The path begins at the end point of the last command.
     */
    public static class ClosedVectorPath extends Object {
        /**
         * List of vector path commands.
         */
        public VectorPathCommand[] commands;

        /**
         * Represents a closed vector path. The path begins at the end point of the last command.
         */
        public ClosedVectorPath() {
        }

        /**
         * Represents a closed vector path. The path begins at the end point of the last command.
         *
         * @param commands List of vector path commands.
         */
        public ClosedVectorPath(VectorPathCommand[] commands) {
            this.commands = commands;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 589951657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a collectible item and its last purchase.
     */
    public static class CollectibleItemInfo extends Object {
        /**
         * Point in time (Unix timestamp) when the item was purchased.
         */
        public int purchaseDate;
        /**
         * Currency for the paid amount.
         */
        public String currency;
        /**
         * The paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Cryptocurrency used to pay for the item.
         */
        public String cryptocurrency;
        /**
         * The paid amount, in the smallest units of the cryptocurrency.
         */
        public long cryptocurrencyAmount;
        /**
         * Individual URL for the item on https://fragment.com.
         */
        public String url;

        /**
         * Contains information about a collectible item and its last purchase.
         */
        public CollectibleItemInfo() {
        }

        /**
         * Contains information about a collectible item and its last purchase.
         *
         * @param purchaseDate Point in time (Unix timestamp) when the item was purchased.
         * @param currency Currency for the paid amount.
         * @param amount The paid amount, in the smallest units of the currency.
         * @param cryptocurrency Cryptocurrency used to pay for the item.
         * @param cryptocurrencyAmount The paid amount, in the smallest units of the cryptocurrency.
         * @param url Individual URL for the item on https://fragment.com.
         */
        public CollectibleItemInfo(int purchaseDate, String currency, long amount, String cryptocurrency, long cryptocurrencyAmount, String url) {
            this.purchaseDate = purchaseDate;
            this.currency = currency;
            this.amount = amount;
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1460640717;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a collectible item that can be purchased at https://fragment.com.
     */
    public abstract static class CollectibleItemType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CollectibleItemTypeUsername.CONSTRUCTOR,
            CollectibleItemTypePhoneNumber.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CollectibleItemType() {
        }
    }

    /**
     * A username.
     */
    public static class CollectibleItemTypeUsername extends CollectibleItemType {
        /**
         * The username.
         */
        public String username;

        /**
         * A username.
         */
        public CollectibleItemTypeUsername() {
        }

        /**
         * A username.
         *
         * @param username The username.
         */
        public CollectibleItemTypeUsername(String username) {
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 458680273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A phone number.
     */
    public static class CollectibleItemTypePhoneNumber extends CollectibleItemType {
        /**
         * The phone number.
         */
        public String phoneNumber;

        /**
         * A phone number.
         */
        public CollectibleItemTypePhoneNumber() {
        }

        /**
         * A phone number.
         *
         * @param phoneNumber The phone number.
         */
        public CollectibleItemTypePhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1256251714;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about one website the current user is logged in with Telegram.
     */
    public static class ConnectedWebsite extends Object {
        /**
         * Website identifier.
         */
        public long id;
        /**
         * The domain name of the website.
         */
        public String domainName;
        /**
         * User identifier of a bot linked with the website.
         */
        public long botUserId;
        /**
         * The version of a browser used to log in.
         */
        public String browser;
        /**
         * Operating system the browser is running on.
         */
        public String platform;
        /**
         * Point in time (Unix timestamp) when the user was logged in.
         */
        public int logInDate;
        /**
         * Point in time (Unix timestamp) when obtained authorization was last used.
         */
        public int lastActiveDate;
        /**
         * IP address from which the user was logged in, in human-readable format.
         */
        public String ipAddress;
        /**
         * Human-readable description of a country and a region from which the user was logged in, based on the IP address.
         */
        public String location;

        /**
         * Contains information about one website the current user is logged in with Telegram.
         */
        public ConnectedWebsite() {
        }

        /**
         * Contains information about one website the current user is logged in with Telegram.
         *
         * @param id Website identifier.
         * @param domainName The domain name of the website.
         * @param botUserId User identifier of a bot linked with the website.
         * @param browser The version of a browser used to log in.
         * @param platform Operating system the browser is running on.
         * @param logInDate Point in time (Unix timestamp) when the user was logged in.
         * @param lastActiveDate Point in time (Unix timestamp) when obtained authorization was last used.
         * @param ipAddress IP address from which the user was logged in, in human-readable format.
         * @param location Human-readable description of a country and a region from which the user was logged in, based on the IP address.
         */
        public ConnectedWebsite(long id, String domainName, long botUserId, String browser, String platform, int logInDate, int lastActiveDate, String ipAddress, String location) {
            this.id = id;
            this.domainName = domainName;
            this.botUserId = botUserId;
            this.browser = browser;
            this.platform = platform;
            this.logInDate = logInDate;
            this.lastActiveDate = lastActiveDate;
            this.ipAddress = ipAddress;
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1978115978;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of websites the current user is logged in with Telegram.
     */
    public static class ConnectedWebsites extends Object {
        /**
         * List of connected websites.
         */
        public ConnectedWebsite[] websites;

        /**
         * Contains a list of websites the current user is logged in with Telegram.
         */
        public ConnectedWebsites() {
        }

        /**
         * Contains a list of websites the current user is logged in with Telegram.
         *
         * @param websites List of connected websites.
         */
        public ConnectedWebsites(ConnectedWebsite[] websites) {
            this.websites = websites;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1727949694;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the current state of the connection to Telegram servers.
     */
    public abstract static class ConnectionState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ConnectionStateWaitingForNetwork.CONSTRUCTOR,
            ConnectionStateConnectingToProxy.CONSTRUCTOR,
            ConnectionStateConnecting.CONSTRUCTOR,
            ConnectionStateUpdating.CONSTRUCTOR,
            ConnectionStateReady.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ConnectionState() {
        }
    }

    /**
     * Waiting for the network to become available. Use setNetworkType to change the available network type.
     */
    public static class ConnectionStateWaitingForNetwork extends ConnectionState {

        /**
         * Waiting for the network to become available. Use setNetworkType to change the available network type.
         */
        public ConnectionStateWaitingForNetwork() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1695405912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Establishing a connection with a proxy server.
     */
    public static class ConnectionStateConnectingToProxy extends ConnectionState {

        /**
         * Establishing a connection with a proxy server.
         */
        public ConnectionStateConnectingToProxy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -93187239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Establishing a connection to the Telegram servers.
     */
    public static class ConnectionStateConnecting extends ConnectionState {

        /**
         * Establishing a connection to the Telegram servers.
         */
        public ConnectionStateConnecting() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1298400670;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Downloading data supposed to be received while the application was offline.
     */
    public static class ConnectionStateUpdating extends ConnectionState {

        /**
         * Downloading data supposed to be received while the application was offline.
         */
        public ConnectionStateUpdating() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -188104009;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * There is a working connection to the Telegram servers.
     */
    public static class ConnectionStateReady extends ConnectionState {

        /**
         * There is a working connection to the Telegram servers.
         */
        public ConnectionStateReady() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 48608492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user contact.
     */
    public static class Contact extends Object {
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * First name of the user; 1-255 characters in length.
         */
        public String firstName;
        /**
         * Last name of the user.
         */
        public String lastName;
        /**
         * Additional data about the user in a form of vCard; 0-2048 bytes in length.
         */
        public String vcard;
        /**
         * Identifier of the user, if known; 0 otherwise.
         */
        public long userId;

        /**
         * Describes a user contact.
         */
        public Contact() {
        }

        /**
         * Describes a user contact.
         *
         * @param phoneNumber Phone number of the user.
         * @param firstName First name of the user; 1-255 characters in length.
         * @param lastName Last name of the user.
         * @param vcard Additional data about the user in a form of vCard; 0-2048 bytes in length.
         * @param userId Identifier of the user, if known; 0 otherwise.
         */
        public Contact(String phoneNumber, String firstName, String lastName, String vcard, long userId) {
            this.phoneNumber = phoneNumber;
            this.firstName = firstName;
            this.lastName = lastName;
            this.vcard = vcard;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1993844876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a counter.
     */
    public static class Count extends Object {
        /**
         * Count.
         */
        public int count;

        /**
         * Contains a counter.
         */
        public Count() {
        }

        /**
         * Contains a counter.
         *
         * @param count Count.
         */
        public Count(int count) {
            this.count = count;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1295577348;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about countries.
     */
    public static class Countries extends Object {
        /**
         * The list of countries.
         */
        public CountryInfo[] countries;

        /**
         * Contains information about countries.
         */
        public Countries() {
        }

        /**
         * Contains information about countries.
         *
         * @param countries The list of countries.
         */
        public Countries(CountryInfo[] countries) {
            this.countries = countries;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1854211813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a country.
     */
    public static class CountryInfo extends Object {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code.
         */
        public String countryCode;
        /**
         * Native name of the country.
         */
        public String name;
        /**
         * English name of the country.
         */
        public String englishName;
        /**
         * True, if the country must be hidden from the list of all countries.
         */
        public boolean isHidden;
        /**
         * List of country calling codes.
         */
        public String[] callingCodes;

        /**
         * Contains information about a country.
         */
        public CountryInfo() {
        }

        /**
         * Contains information about a country.
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code.
         * @param name Native name of the country.
         * @param englishName English name of the country.
         * @param isHidden True, if the country must be hidden from the list of all countries.
         * @param callingCodes List of country calling codes.
         */
        public CountryInfo(String countryCode, String name, String englishName, boolean isHidden, String[] callingCodes) {
            this.countryCode = countryCode;
            this.name = name;
            this.englishName = englishName;
            this.isHidden = isHidden;
            this.callingCodes = callingCodes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1617195722;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a newly created basic group chat.
     */
    public static class CreatedBasicGroupChat extends Object {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Information about failed to add members.
         */
        public FailedToAddMembers failedToAddMembers;

        /**
         * Contains information about a newly created basic group chat.
         */
        public CreatedBasicGroupChat() {
        }

        /**
         * Contains information about a newly created basic group chat.
         *
         * @param chatId Chat identifier.
         * @param failedToAddMembers Information about failed to add members.
         */
        public CreatedBasicGroupChat(long chatId, FailedToAddMembers failedToAddMembers) {
            this.chatId = chatId;
            this.failedToAddMembers = failedToAddMembers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -20417068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the result of a custom request.
     */
    public static class CustomRequestResult extends Object {
        /**
         * A JSON-serialized result.
         */
        public String result;

        /**
         * Contains the result of a custom request.
         */
        public CustomRequestResult() {
        }

        /**
         * Contains the result of a custom request.
         *
         * @param result A JSON-serialized result.
         */
        public CustomRequestResult(String result) {
            this.result = result;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2009960452;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains database statistics.
     */
    public static class DatabaseStatistics extends Object {
        /**
         * Database statistics in an unspecified human-readable format.
         */
        public String statistics;

        /**
         * Contains database statistics.
         */
        public DatabaseStatistics() {
        }

        /**
         * Contains database statistics.
         *
         * @param statistics Database statistics in an unspecified human-readable format.
         */
        public DatabaseStatistics(String statistics) {
            this.statistics = statistics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1123912880;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a date according to the Gregorian calendar.
     */
    public static class Date extends Object {
        /**
         * Day of the month; 1-31.
         */
        public int day;
        /**
         * Month; 1-12.
         */
        public int month;
        /**
         * Year; 1-9999.
         */
        public int year;

        /**
         * Represents a date according to the Gregorian calendar.
         */
        public Date() {
        }

        /**
         * Represents a date according to the Gregorian calendar.
         *
         * @param day Day of the month; 1-31.
         * @param month Month; 1-12.
         * @param year Year; 1-9999.
         */
        public Date(int day, int month, int year) {
            this.day = day;
            this.month = month;
            this.year = year;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -277956960;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a date range.
     */
    public static class DateRange extends Object {
        /**
         * Point in time (Unix timestamp) at which the date range begins.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) at which the date range ends.
         */
        public int endDate;

        /**
         * Represents a date range.
         */
        public DateRange() {
        }

        /**
         * Represents a date range.
         *
         * @param startDate Point in time (Unix timestamp) at which the date range begins.
         * @param endDate Point in time (Unix timestamp) at which the date range ends.
         */
        public DateRange(int startDate, int endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1360333926;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * File with the date it was uploaded.
     */
    public static class DatedFile extends Object {
        /**
         * The file.
         */
        public File file;
        /**
         * Point in time (Unix timestamp) when the file was uploaded.
         */
        public int date;

        /**
         * File with the date it was uploaded.
         */
        public DatedFile() {
        }

        /**
         * File with the date it was uploaded.
         *
         * @param file The file.
         * @param date Point in time (Unix timestamp) when the file was uploaded.
         */
        public DatedFile(File file, int date) {
            this.file = file;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1840795491;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a tg: deep link.
     */
    public static class DeepLinkInfo extends Object {
        /**
         * Text to be shown to the user.
         */
        public FormattedText text;
        /**
         * True, if the user must be asked to update the application.
         */
        public boolean needUpdateApplication;

        /**
         * Contains information about a tg: deep link.
         */
        public DeepLinkInfo() {
        }

        /**
         * Contains information about a tg: deep link.
         *
         * @param text Text to be shown to the user.
         * @param needUpdateApplication True, if the user must be asked to update the application.
         */
        public DeepLinkInfo(FormattedText text, boolean needUpdateApplication) {
            this.text = text;
            this.needUpdateApplication = needUpdateApplication;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1864081662;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a data needed to subscribe for push notifications through registerDevice method. To use specific push notification service, the correct application platform must be specified and a valid server authentication data must be uploaded at https://my.telegram.org.
     */
    public abstract static class DeviceToken extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            DeviceTokenFirebaseCloudMessaging.CONSTRUCTOR,
            DeviceTokenApplePush.CONSTRUCTOR,
            DeviceTokenApplePushVoIP.CONSTRUCTOR,
            DeviceTokenWindowsPush.CONSTRUCTOR,
            DeviceTokenMicrosoftPush.CONSTRUCTOR,
            DeviceTokenMicrosoftPushVoIP.CONSTRUCTOR,
            DeviceTokenWebPush.CONSTRUCTOR,
            DeviceTokenSimplePush.CONSTRUCTOR,
            DeviceTokenUbuntuPush.CONSTRUCTOR,
            DeviceTokenBlackBerryPush.CONSTRUCTOR,
            DeviceTokenTizenPush.CONSTRUCTOR,
            DeviceTokenHuaweiPush.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public DeviceToken() {
        }
    }

    /**
     * A token for Firebase Cloud Messaging.
     */
    public static class DeviceTokenFirebaseCloudMessaging extends DeviceToken {
        /**
         * Device registration token; may be empty to deregister a device.
         */
        public String token;
        /**
         * True, if push notifications must be additionally encrypted.
         */
        public boolean encrypt;

        /**
         * A token for Firebase Cloud Messaging.
         */
        public DeviceTokenFirebaseCloudMessaging() {
        }

        /**
         * A token for Firebase Cloud Messaging.
         *
         * @param token Device registration token; may be empty to deregister a device.
         * @param encrypt True, if push notifications must be additionally encrypted.
         */
        public DeviceTokenFirebaseCloudMessaging(String token, boolean encrypt) {
            this.token = token;
            this.encrypt = encrypt;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -797881849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Apple Push Notification service.
     */
    public static class DeviceTokenApplePush extends DeviceToken {
        /**
         * Device token; may be empty to deregister a device.
         */
        public String deviceToken;
        /**
         * True, if App Sandbox is enabled.
         */
        public boolean isAppSandbox;

        /**
         * A token for Apple Push Notification service.
         */
        public DeviceTokenApplePush() {
        }

        /**
         * A token for Apple Push Notification service.
         *
         * @param deviceToken Device token; may be empty to deregister a device.
         * @param isAppSandbox True, if App Sandbox is enabled.
         */
        public DeviceTokenApplePush(String deviceToken, boolean isAppSandbox) {
            this.deviceToken = deviceToken;
            this.isAppSandbox = isAppSandbox;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 387541955;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Apple Push Notification service VoIP notifications.
     */
    public static class DeviceTokenApplePushVoIP extends DeviceToken {
        /**
         * Device token; may be empty to deregister a device.
         */
        public String deviceToken;
        /**
         * True, if App Sandbox is enabled.
         */
        public boolean isAppSandbox;
        /**
         * True, if push notifications must be additionally encrypted.
         */
        public boolean encrypt;

        /**
         * A token for Apple Push Notification service VoIP notifications.
         */
        public DeviceTokenApplePushVoIP() {
        }

        /**
         * A token for Apple Push Notification service VoIP notifications.
         *
         * @param deviceToken Device token; may be empty to deregister a device.
         * @param isAppSandbox True, if App Sandbox is enabled.
         * @param encrypt True, if push notifications must be additionally encrypted.
         */
        public DeviceTokenApplePushVoIP(String deviceToken, boolean isAppSandbox, boolean encrypt) {
            this.deviceToken = deviceToken;
            this.isAppSandbox = isAppSandbox;
            this.encrypt = encrypt;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 804275689;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Windows Push Notification Services.
     */
    public static class DeviceTokenWindowsPush extends DeviceToken {
        /**
         * The access token that will be used to send notifications; may be empty to deregister a device.
         */
        public String accessToken;

        /**
         * A token for Windows Push Notification Services.
         */
        public DeviceTokenWindowsPush() {
        }

        /**
         * A token for Windows Push Notification Services.
         *
         * @param accessToken The access token that will be used to send notifications; may be empty to deregister a device.
         */
        public DeviceTokenWindowsPush(String accessToken) {
            this.accessToken = accessToken;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1410514289;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Microsoft Push Notification Service.
     */
    public static class DeviceTokenMicrosoftPush extends DeviceToken {
        /**
         * Push notification channel URI; may be empty to deregister a device.
         */
        public String channelUri;

        /**
         * A token for Microsoft Push Notification Service.
         */
        public DeviceTokenMicrosoftPush() {
        }

        /**
         * A token for Microsoft Push Notification Service.
         *
         * @param channelUri Push notification channel URI; may be empty to deregister a device.
         */
        public DeviceTokenMicrosoftPush(String channelUri) {
            this.channelUri = channelUri;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1224269900;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Microsoft Push Notification Service VoIP channel.
     */
    public static class DeviceTokenMicrosoftPushVoIP extends DeviceToken {
        /**
         * Push notification channel URI; may be empty to deregister a device.
         */
        public String channelUri;

        /**
         * A token for Microsoft Push Notification Service VoIP channel.
         */
        public DeviceTokenMicrosoftPushVoIP() {
        }

        /**
         * A token for Microsoft Push Notification Service VoIP channel.
         *
         * @param channelUri Push notification channel URI; may be empty to deregister a device.
         */
        public DeviceTokenMicrosoftPushVoIP(String channelUri) {
            this.channelUri = channelUri;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -785603759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for web Push API.
     */
    public static class DeviceTokenWebPush extends DeviceToken {
        /**
         * Absolute URL exposed by the push service where the application server can send push messages; may be empty to deregister a device.
         */
        public String endpoint;
        /**
         * Base64url-encoded P-256 elliptic curve Diffie-Hellman public key.
         */
        public String p256dhBase64url;
        /**
         * Base64url-encoded authentication secret.
         */
        public String authBase64url;

        /**
         * A token for web Push API.
         */
        public DeviceTokenWebPush() {
        }

        /**
         * A token for web Push API.
         *
         * @param endpoint Absolute URL exposed by the push service where the application server can send push messages; may be empty to deregister a device.
         * @param p256dhBase64url Base64url-encoded P-256 elliptic curve Diffie-Hellman public key.
         * @param authBase64url Base64url-encoded authentication secret.
         */
        public DeviceTokenWebPush(String endpoint, String p256dhBase64url, String authBase64url) {
            this.endpoint = endpoint;
            this.p256dhBase64url = p256dhBase64url;
            this.authBase64url = authBase64url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1694507273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Simple Push API for Firefox OS.
     */
    public static class DeviceTokenSimplePush extends DeviceToken {
        /**
         * Absolute URL exposed by the push service where the application server can send push messages; may be empty to deregister a device.
         */
        public String endpoint;

        /**
         * A token for Simple Push API for Firefox OS.
         */
        public DeviceTokenSimplePush() {
        }

        /**
         * A token for Simple Push API for Firefox OS.
         *
         * @param endpoint Absolute URL exposed by the push service where the application server can send push messages; may be empty to deregister a device.
         */
        public DeviceTokenSimplePush(String endpoint) {
            this.endpoint = endpoint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 49584736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Ubuntu Push Client service.
     */
    public static class DeviceTokenUbuntuPush extends DeviceToken {
        /**
         * Token; may be empty to deregister a device.
         */
        public String token;

        /**
         * A token for Ubuntu Push Client service.
         */
        public DeviceTokenUbuntuPush() {
        }

        /**
         * A token for Ubuntu Push Client service.
         *
         * @param token Token; may be empty to deregister a device.
         */
        public DeviceTokenUbuntuPush(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1782320422;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for BlackBerry Push Service.
     */
    public static class DeviceTokenBlackBerryPush extends DeviceToken {
        /**
         * Token; may be empty to deregister a device.
         */
        public String token;

        /**
         * A token for BlackBerry Push Service.
         */
        public DeviceTokenBlackBerryPush() {
        }

        /**
         * A token for BlackBerry Push Service.
         *
         * @param token Token; may be empty to deregister a device.
         */
        public DeviceTokenBlackBerryPush(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1559167234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Tizen Push Service.
     */
    public static class DeviceTokenTizenPush extends DeviceToken {
        /**
         * Push service registration identifier; may be empty to deregister a device.
         */
        public String regId;

        /**
         * A token for Tizen Push Service.
         */
        public DeviceTokenTizenPush() {
        }

        /**
         * A token for Tizen Push Service.
         *
         * @param regId Push service registration identifier; may be empty to deregister a device.
         */
        public DeviceTokenTizenPush(String regId) {
            this.regId = regId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1359947213;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for HUAWEI Push Service.
     */
    public static class DeviceTokenHuaweiPush extends DeviceToken {
        /**
         * Device registration token; may be empty to deregister a device.
         */
        public String token;
        /**
         * True, if push notifications must be additionally encrypted.
         */
        public boolean encrypt;

        /**
         * A token for HUAWEI Push Service.
         */
        public DeviceTokenHuaweiPush() {
        }

        /**
         * A token for HUAWEI Push Service.
         *
         * @param token Device registration token; may be empty to deregister a device.
         * @param encrypt True, if push notifications must be additionally encrypted.
         */
        public DeviceTokenHuaweiPush(String token, boolean encrypt) {
            this.token = token;
            this.encrypt = encrypt;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1989103142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains animated stickers which must be used for dice animation rendering.
     */
    public abstract static class DiceStickers extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            DiceStickersRegular.CONSTRUCTOR,
            DiceStickersSlotMachine.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public DiceStickers() {
        }
    }

    /**
     * A regular animated sticker.
     */
    public static class DiceStickersRegular extends DiceStickers {
        /**
         * The animated sticker with the dice animation.
         */
        public Sticker sticker;

        /**
         * A regular animated sticker.
         */
        public DiceStickersRegular() {
        }

        /**
         * A regular animated sticker.
         *
         * @param sticker The animated sticker with the dice animation.
         */
        public DiceStickersRegular(Sticker sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -740299570;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Animated stickers to be combined into a slot machine.
     */
    public static class DiceStickersSlotMachine extends DiceStickers {
        /**
         * The animated sticker with the slot machine background. The background animation must start playing after all reel animations finish.
         */
        public Sticker background;
        /**
         * The animated sticker with the lever animation. The lever animation must play once in the initial dice state.
         */
        public Sticker lever;
        /**
         * The animated sticker with the left reel.
         */
        public Sticker leftReel;
        /**
         * The animated sticker with the center reel.
         */
        public Sticker centerReel;
        /**
         * The animated sticker with the right reel.
         */
        public Sticker rightReel;

        /**
         * Animated stickers to be combined into a slot machine.
         */
        public DiceStickersSlotMachine() {
        }

        /**
         * Animated stickers to be combined into a slot machine.
         *
         * @param background The animated sticker with the slot machine background. The background animation must start playing after all reel animations finish.
         * @param lever The animated sticker with the lever animation. The lever animation must play once in the initial dice state.
         * @param leftReel The animated sticker with the left reel.
         * @param centerReel The animated sticker with the center reel.
         * @param rightReel The animated sticker with the right reel.
         */
        public DiceStickersSlotMachine(Sticker background, Sticker lever, Sticker leftReel, Sticker centerReel, Sticker rightReel) {
            this.background = background;
            this.lever = lever;
            this.leftReel = leftReel;
            this.centerReel = centerReel;
            this.rightReel = rightReel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -375223124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a document of any type.
     */
    public static class Document extends Object {
        /**
         * Original name of the file; as defined by the sender.
         */
        public String fileName;
        /**
         * MIME type of the file; as defined by the sender.
         */
        public String mimeType;
        /**
         * Document minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Document thumbnail in JPEG or PNG format (PNG will be used only for background patterns); as defined by the sender; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * File containing the document.
         */
        public File document;

        /**
         * Describes a document of any type.
         */
        public Document() {
        }

        /**
         * Describes a document of any type.
         *
         * @param fileName Original name of the file; as defined by the sender.
         * @param mimeType MIME type of the file; as defined by the sender.
         * @param minithumbnail Document minithumbnail; may be null.
         * @param thumbnail Document thumbnail in JPEG or PNG format (PNG will be used only for background patterns); as defined by the sender; may be null.
         * @param document File containing the document.
         */
        public Document(String fileName, String mimeType, Minithumbnail minithumbnail, Thumbnail thumbnail, File document) {
            this.fileName = fileName;
            this.mimeType = mimeType;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.document = document;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1357271080;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains number of being downloaded and recently downloaded files found.
     */
    public static class DownloadedFileCounts extends Object {
        /**
         * Number of active file downloads found, including paused.
         */
        public int activeCount;
        /**
         * Number of paused file downloads found.
         */
        public int pausedCount;
        /**
         * Number of completed file downloads found.
         */
        public int completedCount;

        /**
         * Contains number of being downloaded and recently downloaded files found.
         */
        public DownloadedFileCounts() {
        }

        /**
         * Contains number of being downloaded and recently downloaded files found.
         *
         * @param activeCount Number of active file downloads found, including paused.
         * @param pausedCount Number of paused file downloads found.
         * @param completedCount Number of completed file downloads found.
         */
        public DownloadedFileCounts(int activeCount, int pausedCount, int completedCount) {
            this.activeCount = activeCount;
            this.pausedCount = pausedCount;
            this.completedCount = completedCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1973999550;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a message draft.
     */
    public static class DraftMessage extends Object {
        /**
         * Information about the message to be replied; must be of the type inputMessageReplyToMessage; may be null if none.
         */
        @Nullable public InputMessageReplyTo replyTo;
        /**
         * Point in time (Unix timestamp) when the draft was created.
         */
        public int date;
        /**
         * Content of the message draft; must be of the type inputMessageText, inputMessageVideoNote, or inputMessageVoiceNote.
         */
        public InputMessageContent inputMessageText;
        /**
         * Identifier of the effect to apply to the message when it is sent; 0 if none.
         */
        public long effectId;

        /**
         * Contains information about a message draft.
         */
        public DraftMessage() {
        }

        /**
         * Contains information about a message draft.
         *
         * @param replyTo Information about the message to be replied; must be of the type inputMessageReplyToMessage; may be null if none.
         * @param date Point in time (Unix timestamp) when the draft was created.
         * @param inputMessageText Content of the message draft; must be of the type inputMessageText, inputMessageVideoNote, or inputMessageVoiceNote.
         * @param effectId Identifier of the effect to apply to the message when it is sent; 0 if none.
         */
        public DraftMessage(InputMessageReplyTo replyTo, int date, InputMessageContent inputMessageText, long effectId) {
            this.replyTo = replyTo;
            this.date = date;
            this.inputMessageText = inputMessageText;
            this.effectId = effectId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1125328749;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains authentication data for an email address.
     */
    public abstract static class EmailAddressAuthentication extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmailAddressAuthenticationCode.CONSTRUCTOR,
            EmailAddressAuthenticationAppleId.CONSTRUCTOR,
            EmailAddressAuthenticationGoogleId.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmailAddressAuthentication() {
        }
    }

    /**
     * An authentication code delivered to a user's email address.
     */
    public static class EmailAddressAuthenticationCode extends EmailAddressAuthentication {
        /**
         * The code.
         */
        public String code;

        /**
         * An authentication code delivered to a user's email address.
         */
        public EmailAddressAuthenticationCode() {
        }

        /**
         * An authentication code delivered to a user's email address.
         *
         * @param code The code.
         */
        public EmailAddressAuthenticationCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -993257022;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication token received through Apple ID.
     */
    public static class EmailAddressAuthenticationAppleId extends EmailAddressAuthentication {
        /**
         * The token.
         */
        public String token;

        /**
         * An authentication token received through Apple ID.
         */
        public EmailAddressAuthenticationAppleId() {
        }

        /**
         * An authentication token received through Apple ID.
         *
         * @param token The token.
         */
        public EmailAddressAuthenticationAppleId(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 633948265;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication token received through Google ID.
     */
    public static class EmailAddressAuthenticationGoogleId extends EmailAddressAuthentication {
        /**
         * The token.
         */
        public String token;

        /**
         * An authentication token received through Google ID.
         */
        public EmailAddressAuthenticationGoogleId() {
        }

        /**
         * An authentication token received through Google ID.
         *
         * @param token The token.
         */
        public EmailAddressAuthenticationGoogleId(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -19142846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the email address authentication code that was sent.
     */
    public static class EmailAddressAuthenticationCodeInfo extends Object {
        /**
         * Pattern of the email address to which an authentication code was sent.
         */
        public String emailAddressPattern;
        /**
         * Length of the code; 0 if unknown.
         */
        public int length;

        /**
         * Information about the email address authentication code that was sent.
         */
        public EmailAddressAuthenticationCodeInfo() {
        }

        /**
         * Information about the email address authentication code that was sent.
         *
         * @param emailAddressPattern Pattern of the email address to which an authentication code was sent.
         * @param length Length of the code; 0 if unknown.
         */
        public EmailAddressAuthenticationCodeInfo(String emailAddressPattern, int length) {
            this.emailAddressPattern = emailAddressPattern;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1151066659;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes reset state of an email address.
     */
    public abstract static class EmailAddressResetState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmailAddressResetStateAvailable.CONSTRUCTOR,
            EmailAddressResetStatePending.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmailAddressResetState() {
        }
    }

    /**
     * Email address can be reset after the given period. Call resetAuthenticationEmailAddress to reset it and allow the user to authorize with a code sent to the user's phone number.
     */
    public static class EmailAddressResetStateAvailable extends EmailAddressResetState {
        /**
         * Time required to wait before the email address can be reset; 0 if the user is subscribed to Telegram Premium.
         */
        public int waitPeriod;

        /**
         * Email address can be reset after the given period. Call resetAuthenticationEmailAddress to reset it and allow the user to authorize with a code sent to the user's phone number.
         */
        public EmailAddressResetStateAvailable() {
        }

        /**
         * Email address can be reset after the given period. Call resetAuthenticationEmailAddress to reset it and allow the user to authorize with a code sent to the user's phone number.
         *
         * @param waitPeriod Time required to wait before the email address can be reset; 0 if the user is subscribed to Telegram Premium.
         */
        public EmailAddressResetStateAvailable(int waitPeriod) {
            this.waitPeriod = waitPeriod;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1917177600;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Email address reset has already been requested. Call resetAuthenticationEmailAddress to check whether immediate reset is possible.
     */
    public static class EmailAddressResetStatePending extends EmailAddressResetState {
        /**
         * Left time before the email address will be reset, in seconds. updateAuthorizationState is not sent when this field changes.
         */
        public int resetIn;

        /**
         * Email address reset has already been requested. Call resetAuthenticationEmailAddress to check whether immediate reset is possible.
         */
        public EmailAddressResetStatePending() {
        }

        /**
         * Email address reset has already been requested. Call resetAuthenticationEmailAddress to check whether immediate reset is possible.
         *
         * @param resetIn Left time before the email address will be reset, in seconds. updateAuthorizationState is not sent when this field changes.
         */
        public EmailAddressResetStatePending(int resetIn) {
            this.resetIn = resetIn;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1885966805;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of emoji categories.
     */
    public static class EmojiCategories extends Object {
        /**
         * List of categories.
         */
        public EmojiCategory[] categories;

        /**
         * Represents a list of emoji categories.
         */
        public EmojiCategories() {
        }

        /**
         * Represents a list of emoji categories.
         *
         * @param categories List of categories.
         */
        public EmojiCategories(EmojiCategory[] categories) {
            this.categories = categories;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1455387824;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an emoji category.
     */
    public static class EmojiCategory extends Object {
        /**
         * Name of the category.
         */
        public String name;
        /**
         * Custom emoji sticker, which represents icon of the category.
         */
        public Sticker icon;
        /**
         * Source of stickers for the emoji category.
         */
        public EmojiCategorySource source;
        /**
         * True, if the category must be shown first when choosing a sticker for the start page.
         */
        public boolean isGreeting;

        /**
         * Describes an emoji category.
         */
        public EmojiCategory() {
        }

        /**
         * Describes an emoji category.
         *
         * @param name Name of the category.
         * @param icon Custom emoji sticker, which represents icon of the category.
         * @param source Source of stickers for the emoji category.
         * @param isGreeting True, if the category must be shown first when choosing a sticker for the start page.
         */
        public EmojiCategory(String name, Sticker icon, EmojiCategorySource source, boolean isGreeting) {
            this.name = name;
            this.icon = icon;
            this.source = source;
            this.isGreeting = isGreeting;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 571335919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes source of stickers for an emoji category.
     */
    public abstract static class EmojiCategorySource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmojiCategorySourceSearch.CONSTRUCTOR,
            EmojiCategorySourcePremium.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmojiCategorySource() {
        }
    }

    /**
     * The category contains a list of similar emoji to search for in getStickers and searchStickers for stickers, or getInlineQueryResults with the bot getOption(&quot;animation_search_bot_username&quot;) for animations.
     */
    public static class EmojiCategorySourceSearch extends EmojiCategorySource {
        /**
         * List of emojis to search for.
         */
        public String[] emojis;

        /**
         * The category contains a list of similar emoji to search for in getStickers and searchStickers for stickers, or getInlineQueryResults with the bot getOption(&quot;animation_search_bot_username&quot;) for animations.
         */
        public EmojiCategorySourceSearch() {
        }

        /**
         * The category contains a list of similar emoji to search for in getStickers and searchStickers for stickers, or getInlineQueryResults with the bot getOption(&quot;animation_search_bot_username&quot;) for animations.
         *
         * @param emojis List of emojis to search for.
         */
        public EmojiCategorySourceSearch(String[] emojis) {
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -453260262;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The category contains premium stickers that must be found by getPremiumStickers.
     */
    public static class EmojiCategorySourcePremium extends EmojiCategorySource {

        /**
         * The category contains premium stickers that must be found by getPremiumStickers.
         */
        public EmojiCategorySourcePremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1932358388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of emoji category.
     */
    public abstract static class EmojiCategoryType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmojiCategoryTypeDefault.CONSTRUCTOR,
            EmojiCategoryTypeRegularStickers.CONSTRUCTOR,
            EmojiCategoryTypeEmojiStatus.CONSTRUCTOR,
            EmojiCategoryTypeChatPhoto.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmojiCategoryType() {
        }
    }

    /**
     * The category must be used by default (e.g., for custom emoji or animation search).
     */
    public static class EmojiCategoryTypeDefault extends EmojiCategoryType {

        /**
         * The category must be used by default (e.g., for custom emoji or animation search).
         */
        public EmojiCategoryTypeDefault() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1188782699;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The category must be used by default for regular sticker selection. It may contain greeting emoji category and premium stickers.
     */
    public static class EmojiCategoryTypeRegularStickers extends EmojiCategoryType {

        /**
         * The category must be used by default for regular sticker selection. It may contain greeting emoji category and premium stickers.
         */
        public EmojiCategoryTypeRegularStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1337484846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The category must be used for emoji status selection.
     */
    public static class EmojiCategoryTypeEmojiStatus extends EmojiCategoryType {

        /**
         * The category must be used for emoji status selection.
         */
        public EmojiCategoryTypeEmojiStatus() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1381282631;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The category must be used for chat photo emoji selection.
     */
    public static class EmojiCategoryTypeChatPhoto extends EmojiCategoryType {

        /**
         * The category must be used for chat photo emoji selection.
         */
        public EmojiCategoryTypeChatPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1059063081;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an emoji with its keyword.
     */
    public static class EmojiKeyword extends Object {
        /**
         * The emoji.
         */
        public String emoji;
        /**
         * The keyword.
         */
        public String keyword;

        /**
         * Represents an emoji with its keyword.
         */
        public EmojiKeyword() {
        }

        /**
         * Represents an emoji with its keyword.
         *
         * @param emoji The emoji.
         * @param keyword The keyword.
         */
        public EmojiKeyword(String emoji, String keyword) {
            this.emoji = emoji;
            this.keyword = keyword;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2112285985;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of emojis with their keywords.
     */
    public static class EmojiKeywords extends Object {
        /**
         * List of emojis with their keywords.
         */
        public EmojiKeyword[] emojiKeywords;

        /**
         * Represents a list of emojis with their keywords.
         */
        public EmojiKeywords() {
        }

        /**
         * Represents a list of emojis with their keywords.
         *
         * @param emojiKeywords List of emojis with their keywords.
         */
        public EmojiKeywords(EmojiKeyword[] emojiKeywords) {
            this.emojiKeywords = emojiKeywords;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 689723339;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an emoji reaction.
     */
    public static class EmojiReaction extends Object {
        /**
         * Text representation of the reaction.
         */
        public String emoji;
        /**
         * Reaction title.
         */
        public String title;
        /**
         * True, if the reaction can be added to new messages and enabled in chats.
         */
        public boolean isActive;
        /**
         * Static icon for the reaction.
         */
        public Sticker staticIcon;
        /**
         * Appear animation for the reaction.
         */
        public Sticker appearAnimation;
        /**
         * Select animation for the reaction.
         */
        public Sticker selectAnimation;
        /**
         * Activate animation for the reaction.
         */
        public Sticker activateAnimation;
        /**
         * Effect animation for the reaction.
         */
        public Sticker effectAnimation;
        /**
         * Around animation for the reaction; may be null.
         */
        @Nullable public Sticker aroundAnimation;
        /**
         * Center animation for the reaction; may be null.
         */
        @Nullable public Sticker centerAnimation;

        /**
         * Contains information about an emoji reaction.
         */
        public EmojiReaction() {
        }

        /**
         * Contains information about an emoji reaction.
         *
         * @param emoji Text representation of the reaction.
         * @param title Reaction title.
         * @param isActive True, if the reaction can be added to new messages and enabled in chats.
         * @param staticIcon Static icon for the reaction.
         * @param appearAnimation Appear animation for the reaction.
         * @param selectAnimation Select animation for the reaction.
         * @param activateAnimation Activate animation for the reaction.
         * @param effectAnimation Effect animation for the reaction.
         * @param aroundAnimation Around animation for the reaction; may be null.
         * @param centerAnimation Center animation for the reaction; may be null.
         */
        public EmojiReaction(String emoji, String title, boolean isActive, Sticker staticIcon, Sticker appearAnimation, Sticker selectAnimation, Sticker activateAnimation, Sticker effectAnimation, Sticker aroundAnimation, Sticker centerAnimation) {
            this.emoji = emoji;
            this.title = title;
            this.isActive = isActive;
            this.staticIcon = staticIcon;
            this.appearAnimation = appearAnimation;
            this.selectAnimation = selectAnimation;
            this.activateAnimation = activateAnimation;
            this.effectAnimation = effectAnimation;
            this.aroundAnimation = aroundAnimation;
            this.centerAnimation = centerAnimation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1616063583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a custom emoji to be shown instead of the Telegram Premium badge.
     */
    public static class EmojiStatus extends Object {
        /**
         * Identifier of the custom emoji in stickerFormatTgs format.
         */
        public long customEmojiId;
        /**
         * Point in time (Unix timestamp) when the status will expire; 0 if never.
         */
        public int expirationDate;

        /**
         * Describes a custom emoji to be shown instead of the Telegram Premium badge.
         */
        public EmojiStatus() {
        }

        /**
         * Describes a custom emoji to be shown instead of the Telegram Premium badge.
         *
         * @param customEmojiId Identifier of the custom emoji in stickerFormatTgs format.
         * @param expirationDate Point in time (Unix timestamp) when the status will expire; 0 if never.
         */
        public EmojiStatus(long customEmojiId, int expirationDate) {
            this.customEmojiId = customEmojiId;
            this.expirationDate = expirationDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -606529994;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of custom emoji identifiers for emoji statuses.
     */
    public static class EmojiStatuses extends Object {
        /**
         * The list of custom emoji identifiers.
         */
        public long[] customEmojiIds;

        /**
         * Contains a list of custom emoji identifiers for emoji statuses.
         */
        public EmojiStatuses() {
        }

        /**
         * Contains a list of custom emoji identifiers for emoji statuses.
         *
         * @param customEmojiIds The list of custom emoji identifiers.
         */
        public EmojiStatuses(long[] customEmojiIds) {
            this.customEmojiIds = customEmojiIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -377859594;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of emojis.
     */
    public static class Emojis extends Object {
        /**
         * List of emojis.
         */
        public String[] emojis;

        /**
         * Represents a list of emojis.
         */
        public Emojis() {
        }

        /**
         * Represents a list of emojis.
         *
         * @param emojis List of emojis.
         */
        public Emojis(String[] emojis) {
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 950339552;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains encrypted Telegram Passport data credentials.
     */
    public static class EncryptedCredentials extends Object {
        /**
         * The encrypted credentials.
         */
        public byte[] data;
        /**
         * The decrypted data hash.
         */
        public byte[] hash;
        /**
         * Secret for data decryption, encrypted with the service's public key.
         */
        public byte[] secret;

        /**
         * Contains encrypted Telegram Passport data credentials.
         */
        public EncryptedCredentials() {
        }

        /**
         * Contains encrypted Telegram Passport data credentials.
         *
         * @param data The encrypted credentials.
         * @param hash The decrypted data hash.
         * @param secret Secret for data decryption, encrypted with the service's public key.
         */
        public EncryptedCredentials(byte[] data, byte[] hash, byte[] secret) {
            this.data = data;
            this.hash = hash;
            this.secret = secret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1331106766;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an encrypted Telegram Passport element; for bots only.
     */
    public static class EncryptedPassportElement extends Object {
        /**
         * Type of Telegram Passport element.
         */
        public PassportElementType type;
        /**
         * Encrypted JSON-encoded data about the user.
         */
        public byte[] data;
        /**
         * The front side of an identity document.
         */
        public DatedFile frontSide;
        /**
         * The reverse side of an identity document; may be null.
         */
        @Nullable public DatedFile reverseSide;
        /**
         * Selfie with the document; may be null.
         */
        @Nullable public DatedFile selfie;
        /**
         * List of files containing a certified English translation of the document.
         */
        public DatedFile[] translation;
        /**
         * List of attached files.
         */
        public DatedFile[] files;
        /**
         * Unencrypted data, phone number or email address.
         */
        public String value;
        /**
         * Hash of the entire element.
         */
        public String hash;

        /**
         * Contains information about an encrypted Telegram Passport element; for bots only.
         */
        public EncryptedPassportElement() {
        }

        /**
         * Contains information about an encrypted Telegram Passport element; for bots only.
         *
         * @param type Type of Telegram Passport element.
         * @param data Encrypted JSON-encoded data about the user.
         * @param frontSide The front side of an identity document.
         * @param reverseSide The reverse side of an identity document; may be null.
         * @param selfie Selfie with the document; may be null.
         * @param translation List of files containing a certified English translation of the document.
         * @param files List of attached files.
         * @param value Unencrypted data, phone number or email address.
         * @param hash Hash of the entire element.
         */
        public EncryptedPassportElement(PassportElementType type, byte[] data, DatedFile frontSide, DatedFile reverseSide, DatedFile selfie, DatedFile[] translation, DatedFile[] files, String value, String hash) {
            this.type = type;
            this.data = data;
            this.frontSide = frontSide;
            this.reverseSide = reverseSide;
            this.selfie = selfie;
            this.translation = translation;
            this.files = files;
            this.value = value;
            this.hash = hash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2002386193;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An object of this type can be returned on every function call, in case of an error.
     */
    public static class Error extends Object {
        /**
         * Error code; subject to future changes. If the error code is 406, the error message must not be processed in any way and must not be displayed to the user.
         */
        public int code;
        /**
         * Error message; subject to future changes.
         */
        public String message;

        /**
         * An object of this type can be returned on every function call, in case of an error.
         */
        public Error() {
        }

        /**
         * An object of this type can be returned on every function call, in case of an error.
         *
         * @param code Error code; subject to future changes. If the error code is 406, the error message must not be processed in any way and must not be displayed to the user.
         * @param message Error message; subject to future changes.
         */
        public Error(int code, String message) {
            this.code = code;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1679978726;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a fact-check added to the message by an independent checker.
     */
    public static class FactCheck extends Object {
        /**
         * Text of the fact-check.
         */
        public FormattedText text;
        /**
         * A two-letter ISO 3166-1 alpha-2 country code of the country for which the fact-check is shown.
         */
        public String countryCode;

        /**
         * Describes a fact-check added to the message by an independent checker.
         */
        public FactCheck() {
        }

        /**
         * Describes a fact-check added to the message by an independent checker.
         *
         * @param text Text of the fact-check.
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code of the country for which the fact-check is shown.
         */
        public FactCheck(FormattedText text, String countryCode) {
            this.text = text;
            this.countryCode = countryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1048184552;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a user that has failed to be added to a chat.
     */
    public static class FailedToAddMember extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * True, if subscription to Telegram Premium would have allowed to add the user to the chat.
         */
        public boolean premiumWouldAllowInvite;
        /**
         * True, if subscription to Telegram Premium is required to send the user chat invite link.
         */
        public boolean premiumRequiredToSendMessages;

        /**
         * Contains information about a user that has failed to be added to a chat.
         */
        public FailedToAddMember() {
        }

        /**
         * Contains information about a user that has failed to be added to a chat.
         *
         * @param userId User identifier.
         * @param premiumWouldAllowInvite True, if subscription to Telegram Premium would have allowed to add the user to the chat.
         * @param premiumRequiredToSendMessages True, if subscription to Telegram Premium is required to send the user chat invite link.
         */
        public FailedToAddMember(long userId, boolean premiumWouldAllowInvite, boolean premiumRequiredToSendMessages) {
            this.userId = userId;
            this.premiumWouldAllowInvite = premiumWouldAllowInvite;
            this.premiumRequiredToSendMessages = premiumRequiredToSendMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -282891070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of users that has failed to be added to a chat.
     */
    public static class FailedToAddMembers extends Object {
        /**
         * Information about users that weren't added to the chat.
         */
        public FailedToAddMember[] failedToAddMembers;

        /**
         * Represents a list of users that has failed to be added to a chat.
         */
        public FailedToAddMembers() {
        }

        /**
         * Represents a list of users that has failed to be added to a chat.
         *
         * @param failedToAddMembers Information about users that weren't added to the chat.
         */
        public FailedToAddMembers(FailedToAddMember[] failedToAddMembers) {
            this.failedToAddMembers = failedToAddMembers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -272587152;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a file.
     */
    public static class File extends Object {
        /**
         * Unique file identifier.
         */
        public int id;
        /**
         * File size, in bytes; 0 if unknown.
         */
        public long size;
        /**
         * Approximate file size in bytes in case the exact file size is unknown. Can be used to show download/upload progress.
         */
        public long expectedSize;
        /**
         * Information about the local copy of the file.
         */
        public LocalFile local;
        /**
         * Information about the remote copy of the file.
         */
        public RemoteFile remote;

        /**
         * Represents a file.
         */
        public File() {
        }

        /**
         * Represents a file.
         *
         * @param id Unique file identifier.
         * @param size File size, in bytes; 0 if unknown.
         * @param expectedSize Approximate file size in bytes in case the exact file size is unknown. Can be used to show download/upload progress.
         * @param local Information about the local copy of the file.
         * @param remote Information about the remote copy of the file.
         */
        public File(int id, long size, long expectedSize, LocalFile local, RemoteFile remote) {
            this.id = id;
            this.size = size;
            this.expectedSize = expectedSize;
            this.local = local;
            this.remote = remote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1263291956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a file added to file download list.
     */
    public static class FileDownload extends Object {
        /**
         * File identifier.
         */
        public int fileId;
        /**
         * The message with the file.
         */
        public Message message;
        /**
         * Point in time (Unix timestamp) when the file was added to the download list.
         */
        public int addDate;
        /**
         * Point in time (Unix timestamp) when the file downloading was completed; 0 if the file downloading isn't completed.
         */
        public int completeDate;
        /**
         * True, if downloading of the file is paused.
         */
        public boolean isPaused;

        /**
         * Describes a file added to file download list.
         */
        public FileDownload() {
        }

        /**
         * Describes a file added to file download list.
         *
         * @param fileId File identifier.
         * @param message The message with the file.
         * @param addDate Point in time (Unix timestamp) when the file was added to the download list.
         * @param completeDate Point in time (Unix timestamp) when the file downloading was completed; 0 if the file downloading isn't completed.
         * @param isPaused True, if downloading of the file is paused.
         */
        public FileDownload(int fileId, Message message, int addDate, int completeDate, boolean isPaused) {
            this.fileId = fileId;
            this.message = message;
            this.addDate = addDate;
            this.completeDate = completeDate;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2092100780;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains size of downloaded prefix of a file.
     */
    public static class FileDownloadedPrefixSize extends Object {
        /**
         * The prefix size, in bytes.
         */
        public long size;

        /**
         * Contains size of downloaded prefix of a file.
         */
        public FileDownloadedPrefixSize() {
        }

        /**
         * Contains size of downloaded prefix of a file.
         *
         * @param size The prefix size, in bytes.
         */
        public FileDownloadedPrefixSize(long size) {
            this.size = size;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2015205381;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a part of a file.
     */
    public static class FilePart extends Object {
        /**
         * File bytes.
         */
        public byte[] data;

        /**
         * Contains a part of a file.
         */
        public FilePart() {
        }

        /**
         * Contains a part of a file.
         *
         * @param data File bytes.
         */
        public FilePart(byte[] data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 911821878;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the type of file.
     */
    public abstract static class FileType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            FileTypeNone.CONSTRUCTOR,
            FileTypeAnimation.CONSTRUCTOR,
            FileTypeAudio.CONSTRUCTOR,
            FileTypeDocument.CONSTRUCTOR,
            FileTypeNotificationSound.CONSTRUCTOR,
            FileTypePhoto.CONSTRUCTOR,
            FileTypePhotoStory.CONSTRUCTOR,
            FileTypeProfilePhoto.CONSTRUCTOR,
            FileTypeSecret.CONSTRUCTOR,
            FileTypeSecretThumbnail.CONSTRUCTOR,
            FileTypeSecure.CONSTRUCTOR,
            FileTypeSticker.CONSTRUCTOR,
            FileTypeThumbnail.CONSTRUCTOR,
            FileTypeUnknown.CONSTRUCTOR,
            FileTypeVideo.CONSTRUCTOR,
            FileTypeVideoNote.CONSTRUCTOR,
            FileTypeVideoStory.CONSTRUCTOR,
            FileTypeVoiceNote.CONSTRUCTOR,
            FileTypeWallpaper.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public FileType() {
        }
    }

    /**
     * The data is not a file.
     */
    public static class FileTypeNone extends FileType {

        /**
         * The data is not a file.
         */
        public FileTypeNone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2003009189;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is an animation.
     */
    public static class FileTypeAnimation extends FileType {

        /**
         * The file is an animation.
         */
        public FileTypeAnimation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -290816582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is an audio file.
     */
    public static class FileTypeAudio extends FileType {

        /**
         * The file is an audio file.
         */
        public FileTypeAudio() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -709112160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a document.
     */
    public static class FileTypeDocument extends FileType {

        /**
         * The file is a document.
         */
        public FileTypeDocument() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -564722929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a notification sound.
     */
    public static class FileTypeNotificationSound extends FileType {

        /**
         * The file is a notification sound.
         */
        public FileTypeNotificationSound() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1020289271;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a photo.
     */
    public static class FileTypePhoto extends FileType {

        /**
         * The file is a photo.
         */
        public FileTypePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1718914651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a photo published as a story.
     */
    public static class FileTypePhotoStory extends FileType {

        /**
         * The file is a photo published as a story.
         */
        public FileTypePhotoStory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2018995956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a profile photo.
     */
    public static class FileTypeProfilePhoto extends FileType {

        /**
         * The file is a profile photo.
         */
        public FileTypeProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1795089315;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file was sent to a secret chat (the file type is not known to the server).
     */
    public static class FileTypeSecret extends FileType {

        /**
         * The file was sent to a secret chat (the file type is not known to the server).
         */
        public FileTypeSecret() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1871899401;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a thumbnail of a file from a secret chat.
     */
    public static class FileTypeSecretThumbnail extends FileType {

        /**
         * The file is a thumbnail of a file from a secret chat.
         */
        public FileTypeSecretThumbnail() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1401326026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a file from Secure storage used for storing Telegram Passport files.
     */
    public static class FileTypeSecure extends FileType {

        /**
         * The file is a file from Secure storage used for storing Telegram Passport files.
         */
        public FileTypeSecure() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1419133146;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a sticker.
     */
    public static class FileTypeSticker extends FileType {

        /**
         * The file is a sticker.
         */
        public FileTypeSticker() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 475233385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a thumbnail of another file.
     */
    public static class FileTypeThumbnail extends FileType {

        /**
         * The file is a thumbnail of another file.
         */
        public FileTypeThumbnail() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -12443298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file type is not yet known.
     */
    public static class FileTypeUnknown extends FileType {

        /**
         * The file type is not yet known.
         */
        public FileTypeUnknown() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2011566768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a video.
     */
    public static class FileTypeVideo extends FileType {

        /**
         * The file is a video.
         */
        public FileTypeVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1430816539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a video note.
     */
    public static class FileTypeVideoNote extends FileType {

        /**
         * The file is a video note.
         */
        public FileTypeVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -518412385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a video published as a story.
     */
    public static class FileTypeVideoStory extends FileType {

        /**
         * The file is a video published as a story.
         */
        public FileTypeVideoStory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2146754143;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a voice note.
     */
    public static class FileTypeVoiceNote extends FileType {

        /**
         * The file is a voice note.
         */
        public FileTypeVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -588681661;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a wallpaper or a background pattern.
     */
    public static class FileTypeWallpaper extends FileType {

        /**
         * The file is a wallpaper or a background pattern.
         */
        public FileTypeWallpaper() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1854930076;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains settings for Firebase Authentication in the official applications.
     */
    public abstract static class FirebaseAuthenticationSettings extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            FirebaseAuthenticationSettingsAndroid.CONSTRUCTOR,
            FirebaseAuthenticationSettingsIos.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public FirebaseAuthenticationSettings() {
        }
    }

    /**
     * Settings for Firebase Authentication in the official Android application.
     */
    public static class FirebaseAuthenticationSettingsAndroid extends FirebaseAuthenticationSettings {

        /**
         * Settings for Firebase Authentication in the official Android application.
         */
        public FirebaseAuthenticationSettingsAndroid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1771112932;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Settings for Firebase Authentication in the official iOS application.
     */
    public static class FirebaseAuthenticationSettingsIos extends FirebaseAuthenticationSettings {
        /**
         * Device token from Apple Push Notification service.
         */
        public String deviceToken;
        /**
         * True, if App Sandbox is enabled.
         */
        public boolean isAppSandbox;

        /**
         * Settings for Firebase Authentication in the official iOS application.
         */
        public FirebaseAuthenticationSettingsIos() {
        }

        /**
         * Settings for Firebase Authentication in the official iOS application.
         *
         * @param deviceToken Device token from Apple Push Notification service.
         * @param isAppSandbox True, if App Sandbox is enabled.
         */
        public FirebaseAuthenticationSettingsIos(String deviceToken, boolean isAppSandbox) {
            this.deviceToken = deviceToken;
            this.isAppSandbox = isAppSandbox;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 222930116;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes parameters to be used for device verification.
     */
    public abstract static class FirebaseDeviceVerificationParameters extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            FirebaseDeviceVerificationParametersSafetyNet.CONSTRUCTOR,
            FirebaseDeviceVerificationParametersPlayIntegrity.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public FirebaseDeviceVerificationParameters() {
        }
    }

    /**
     * Device verification must be performed with the SafetyNet Attestation API.
     */
    public static class FirebaseDeviceVerificationParametersSafetyNet extends FirebaseDeviceVerificationParameters {
        /**
         * Nonce to pass to the SafetyNet Attestation API.
         */
        public byte[] nonce;

        /**
         * Device verification must be performed with the SafetyNet Attestation API.
         */
        public FirebaseDeviceVerificationParametersSafetyNet() {
        }

        /**
         * Device verification must be performed with the SafetyNet Attestation API.
         *
         * @param nonce Nonce to pass to the SafetyNet Attestation API.
         */
        public FirebaseDeviceVerificationParametersSafetyNet(byte[] nonce) {
            this.nonce = nonce;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 731296497;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Device verification must be performed with the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic).
     */
    public static class FirebaseDeviceVerificationParametersPlayIntegrity extends FirebaseDeviceVerificationParameters {
        /**
         * Base64url-encoded nonce to pass to the Play Integrity API.
         */
        public String nonce;
        /**
         * Cloud project number to pass to the Play Integrity API.
         */
        public long cloudProjectNumber;

        /**
         * Device verification must be performed with the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic).
         */
        public FirebaseDeviceVerificationParametersPlayIntegrity() {
        }

        /**
         * Device verification must be performed with the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic).
         *
         * @param nonce Base64url-encoded nonce to pass to the Play Integrity API.
         * @param cloudProjectNumber Cloud project number to pass to the Play Integrity API.
         */
        public FirebaseDeviceVerificationParametersPlayIntegrity(String nonce, long cloudProjectNumber) {
            this.nonce = nonce;
            this.cloudProjectNumber = cloudProjectNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -889936502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text with some entities.
     */
    public static class FormattedText extends Object {
        /**
         * The text.
         */
        public String text;
        /**
         * Entities contained in the text. Entities can be nested, but must not mutually intersect with each other. Pre, Code and PreCode entities can't contain other entities. BlockQuote entities can't contain other BlockQuote entities. Bold, Italic, Underline, Strikethrough, and Spoiler entities can contain and can be part of any other entities. All other entities can't contain each other.
         */
        public TextEntity[] entities;

        /**
         * A text with some entities.
         */
        public FormattedText() {
        }

        /**
         * A text with some entities.
         *
         * @param text The text.
         * @param entities Entities contained in the text. Entities can be nested, but must not mutually intersect with each other. Pre, Code and PreCode entities can't contain other entities. BlockQuote entities can't contain other BlockQuote entities. Bold, Italic, Underline, Strikethrough, and Spoiler entities can contain and can be part of any other entities. All other entities can't contain each other.
         */
        public FormattedText(String text, TextEntity[] entities) {
            this.text = text;
            this.entities = entities;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -252624564;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a forum topic.
     */
    public static class ForumTopic extends Object {
        /**
         * Basic information about the topic.
         */
        public ForumTopicInfo info;
        /**
         * Last message in the topic; may be null if unknown.
         */
        @Nullable public Message lastMessage;
        /**
         * True, if the topic is pinned in the topic list.
         */
        public boolean isPinned;
        /**
         * Number of unread messages in the topic.
         */
        public int unreadCount;
        /**
         * Identifier of the last read incoming message.
         */
        public long lastReadInboxMessageId;
        /**
         * Identifier of the last read outgoing message.
         */
        public long lastReadOutboxMessageId;
        /**
         * Number of unread messages with a mention/reply in the topic.
         */
        public int unreadMentionCount;
        /**
         * Number of messages with unread reactions in the topic.
         */
        public int unreadReactionCount;
        /**
         * Notification settings for the topic.
         */
        public ChatNotificationSettings notificationSettings;
        /**
         * A draft of a message in the topic; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;

        /**
         * Describes a forum topic.
         */
        public ForumTopic() {
        }

        /**
         * Describes a forum topic.
         *
         * @param info Basic information about the topic.
         * @param lastMessage Last message in the topic; may be null if unknown.
         * @param isPinned True, if the topic is pinned in the topic list.
         * @param unreadCount Number of unread messages in the topic.
         * @param lastReadInboxMessageId Identifier of the last read incoming message.
         * @param lastReadOutboxMessageId Identifier of the last read outgoing message.
         * @param unreadMentionCount Number of unread messages with a mention/reply in the topic.
         * @param unreadReactionCount Number of messages with unread reactions in the topic.
         * @param notificationSettings Notification settings for the topic.
         * @param draftMessage A draft of a message in the topic; may be null if none.
         */
        public ForumTopic(ForumTopicInfo info, Message lastMessage, boolean isPinned, int unreadCount, long lastReadInboxMessageId, long lastReadOutboxMessageId, int unreadMentionCount, int unreadReactionCount, ChatNotificationSettings notificationSettings, DraftMessage draftMessage) {
            this.info = info;
            this.lastMessage = lastMessage;
            this.isPinned = isPinned;
            this.unreadCount = unreadCount;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
            this.unreadMentionCount = unreadMentionCount;
            this.unreadReactionCount = unreadReactionCount;
            this.notificationSettings = notificationSettings;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 303279334;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a forum topic icon.
     */
    public static class ForumTopicIcon extends Object {
        /**
         * Color of the topic icon in RGB format.
         */
        public int color;
        /**
         * Unique identifier of the custom emoji shown on the topic icon; 0 if none.
         */
        public long customEmojiId;

        /**
         * Describes a forum topic icon.
         */
        public ForumTopicIcon() {
        }

        /**
         * Describes a forum topic icon.
         *
         * @param color Color of the topic icon in RGB format.
         * @param customEmojiId Unique identifier of the custom emoji shown on the topic icon; 0 if none.
         */
        public ForumTopicIcon(int color, long customEmojiId) {
            this.color = color;
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -818765421;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about a forum topic.
     */
    public static class ForumTopicInfo extends Object {
        /**
         * Message thread identifier of the topic.
         */
        public long messageThreadId;
        /**
         * Name of the topic.
         */
        public String name;
        /**
         * Icon of the topic.
         */
        public ForumTopicIcon icon;
        /**
         * Point in time (Unix timestamp) when the topic was created.
         */
        public int creationDate;
        /**
         * Identifier of the creator of the topic.
         */
        public MessageSender creatorId;
        /**
         * True, if the topic is the General topic list.
         */
        public boolean isGeneral;
        /**
         * True, if the topic was created by the current user.
         */
        public boolean isOutgoing;
        /**
         * True, if the topic is closed.
         */
        public boolean isClosed;
        /**
         * True, if the topic is hidden above the topic list and closed; for General topic only.
         */
        public boolean isHidden;

        /**
         * Contains basic information about a forum topic.
         */
        public ForumTopicInfo() {
        }

        /**
         * Contains basic information about a forum topic.
         *
         * @param messageThreadId Message thread identifier of the topic.
         * @param name Name of the topic.
         * @param icon Icon of the topic.
         * @param creationDate Point in time (Unix timestamp) when the topic was created.
         * @param creatorId Identifier of the creator of the topic.
         * @param isGeneral True, if the topic is the General topic list.
         * @param isOutgoing True, if the topic was created by the current user.
         * @param isClosed True, if the topic is closed.
         * @param isHidden True, if the topic is hidden above the topic list and closed; for General topic only.
         */
        public ForumTopicInfo(long messageThreadId, String name, ForumTopicIcon icon, int creationDate, MessageSender creatorId, boolean isGeneral, boolean isOutgoing, boolean isClosed, boolean isHidden) {
            this.messageThreadId = messageThreadId;
            this.name = name;
            this.icon = icon;
            this.creationDate = creationDate;
            this.creatorId = creatorId;
            this.isGeneral = isGeneral;
            this.isOutgoing = isOutgoing;
            this.isClosed = isClosed;
            this.isHidden = isHidden;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1879842914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a list of forum topics.
     */
    public static class ForumTopics extends Object {
        /**
         * Approximate total number of forum topics found.
         */
        public int totalCount;
        /**
         * List of forum topics.
         */
        public ForumTopic[] topics;
        /**
         * Offset date for the next getForumTopics request.
         */
        public int nextOffsetDate;
        /**
         * Offset message identifier for the next getForumTopics request.
         */
        public long nextOffsetMessageId;
        /**
         * Offset message thread identifier for the next getForumTopics request.
         */
        public long nextOffsetMessageThreadId;

        /**
         * Describes a list of forum topics.
         */
        public ForumTopics() {
        }

        /**
         * Describes a list of forum topics.
         *
         * @param totalCount Approximate total number of forum topics found.
         * @param topics List of forum topics.
         * @param nextOffsetDate Offset date for the next getForumTopics request.
         * @param nextOffsetMessageId Offset message identifier for the next getForumTopics request.
         * @param nextOffsetMessageThreadId Offset message thread identifier for the next getForumTopics request.
         */
        public ForumTopics(int totalCount, ForumTopic[] topics, int nextOffsetDate, long nextOffsetMessageId, long nextOffsetMessageThreadId) {
            this.totalCount = totalCount;
            this.topics = topics;
            this.nextOffsetDate = nextOffsetDate;
            this.nextOffsetMessageId = nextOffsetMessageId;
            this.nextOffsetMessageThreadId = nextOffsetMessageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 732819537;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the last message from which a new message was forwarded last time.
     */
    public static class ForwardSource extends Object {
        /**
         * Identifier of the chat to which the message that was forwarded belonged; may be 0 if unknown.
         */
        public long chatId;
        /**
         * Identifier of the message; may be 0 if unknown.
         */
        public long messageId;
        /**
         * Identifier of the sender of the message; may be null if unknown or the new message was forwarded not to Saved Messages.
         */
        @Nullable public MessageSender senderId;
        /**
         * Name of the sender of the message if the sender is hidden by their privacy settings.
         */
        public String senderName;
        /**
         * Point in time (Unix timestamp) when the message is sent; 0 if unknown.
         */
        public int date;
        /**
         * True, if the message that was forwarded is outgoing; always false if sender is unknown.
         */
        public boolean isOutgoing;

        /**
         * Contains information about the last message from which a new message was forwarded last time.
         */
        public ForwardSource() {
        }

        /**
         * Contains information about the last message from which a new message was forwarded last time.
         *
         * @param chatId Identifier of the chat to which the message that was forwarded belonged; may be 0 if unknown.
         * @param messageId Identifier of the message; may be 0 if unknown.
         * @param senderId Identifier of the sender of the message; may be null if unknown or the new message was forwarded not to Saved Messages.
         * @param senderName Name of the sender of the message if the sender is hidden by their privacy settings.
         * @param date Point in time (Unix timestamp) when the message is sent; 0 if unknown.
         * @param isOutgoing True, if the message that was forwarded is outgoing; always false if sender is unknown.
         */
        public ForwardSource(long chatId, long messageId, MessageSender senderId, String senderName, int date, boolean isOutgoing) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.senderId = senderId;
            this.senderName = senderName;
            this.date = date;
            this.isOutgoing = isOutgoing;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1795337929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of boosts applied to a chat.
     */
    public static class FoundChatBoosts extends Object {
        /**
         * Total number of boosts applied to the chat.
         */
        public int totalCount;
        /**
         * List of boosts.
         */
        public ChatBoost[] boosts;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of boosts applied to a chat.
         */
        public FoundChatBoosts() {
        }

        /**
         * Contains a list of boosts applied to a chat.
         *
         * @param totalCount Total number of boosts applied to the chat.
         * @param boosts List of boosts.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundChatBoosts(int totalCount, ChatBoost[] boosts, String nextOffset) {
            this.totalCount = totalCount;
            this.boosts = boosts;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 51457680;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages found by a search in a given chat.
     */
    public static class FoundChatMessages extends Object {
        /**
         * Approximate total number of messages found; -1 if unknown.
         */
        public int totalCount;
        /**
         * List of messages.
         */
        public Message[] messages;
        /**
         * The offset for the next request. If 0, there are no more results.
         */
        public long nextFromMessageId;

        /**
         * Contains a list of messages found by a search in a given chat.
         */
        public FoundChatMessages() {
        }

        /**
         * Contains a list of messages found by a search in a given chat.
         *
         * @param totalCount Approximate total number of messages found; -1 if unknown.
         * @param messages List of messages.
         * @param nextFromMessageId The offset for the next request. If 0, there are no more results.
         */
        public FoundChatMessages(int totalCount, Message[] messages, long nextFromMessageId) {
            this.totalCount = totalCount;
            this.messages = messages;
            this.nextFromMessageId = nextFromMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 427484196;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of downloaded files, found by a search.
     */
    public static class FoundFileDownloads extends Object {
        /**
         * Total number of suitable files, ignoring offset.
         */
        public DownloadedFileCounts totalCounts;
        /**
         * The list of files.
         */
        public FileDownload[] files;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of downloaded files, found by a search.
         */
        public FoundFileDownloads() {
        }

        /**
         * Contains a list of downloaded files, found by a search.
         *
         * @param totalCounts Total number of suitable files, ignoring offset.
         * @param files The list of files.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundFileDownloads(DownloadedFileCounts totalCounts, FileDownload[] files, String nextOffset) {
            this.totalCounts = totalCounts;
            this.files = files;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395890392;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages found by a search.
     */
    public static class FoundMessages extends Object {
        /**
         * Approximate total number of messages found; -1 if unknown.
         */
        public int totalCount;
        /**
         * List of messages.
         */
        public Message[] messages;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of messages found by a search.
         */
        public FoundMessages() {
        }

        /**
         * Contains a list of messages found by a search.
         *
         * @param totalCount Approximate total number of messages found; -1 if unknown.
         * @param messages List of messages.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundMessages(int totalCount, Message[] messages, String nextOffset) {
            this.totalCount = totalCount;
            this.messages = messages;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -529809608;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains 0-based match position.
     */
    public static class FoundPosition extends Object {
        /**
         * The position of the match.
         */
        public int position;

        /**
         * Contains 0-based match position.
         */
        public FoundPosition() {
        }

        /**
         * Contains 0-based match position.
         *
         * @param position The position of the match.
         */
        public FoundPosition(int position) {
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1886724216;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains 0-based positions of matched objects.
     */
    public static class FoundPositions extends Object {
        /**
         * Total number of matched objects.
         */
        public int totalCount;
        /**
         * The positions of the matched objects.
         */
        public int[] positions;

        /**
         * Contains 0-based positions of matched objects.
         */
        public FoundPositions() {
        }

        /**
         * Contains 0-based positions of matched objects.
         *
         * @param totalCount Total number of matched objects.
         * @param positions The positions of the matched objects.
         */
        public FoundPositions(int totalCount, int[] positions) {
            this.totalCount = totalCount;
            this.positions = positions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -80518368;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of stories found by a search.
     */
    public static class FoundStories extends Object {
        /**
         * Approximate total number of stories found.
         */
        public int totalCount;
        /**
         * List of stories.
         */
        public Story[] stories;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of stories found by a search.
         */
        public FoundStories() {
        }

        /**
         * Contains a list of stories found by a search.
         *
         * @param totalCount Approximate total number of stories found.
         * @param stories List of stories.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundStories(int totalCount, Story[] stories, String nextOffset) {
            this.totalCount = totalCount;
            this.stories = stories;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1678513512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Web App found by its short name.
     */
    public static class FoundWebApp extends Object {
        /**
         * The Web App.
         */
        public WebApp webApp;
        /**
         * True, if the user must be asked for the permission to the bot to send them messages.
         */
        public boolean requestWriteAccess;
        /**
         * True, if there is no need to show an ordinary open URL confirmation before opening the Web App. The field must be ignored and confirmation must be shown anyway if the Web App link was hidden.
         */
        public boolean skipConfirmation;

        /**
         * Contains information about a Web App found by its short name.
         */
        public FoundWebApp() {
        }

        /**
         * Contains information about a Web App found by its short name.
         *
         * @param webApp The Web App.
         * @param requestWriteAccess True, if the user must be asked for the permission to the bot to send them messages.
         * @param skipConfirmation True, if there is no need to show an ordinary open URL confirmation before opening the Web App. The field must be ignored and confirmation must be shown anyway if the Web App link was hidden.
         */
        public FoundWebApp(WebApp webApp, boolean requestWriteAccess, boolean skipConfirmation) {
            this.webApp = webApp;
            this.requestWriteAccess = requestWriteAccess;
            this.skipConfirmation = skipConfirmation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -290926562;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a game. Use getInternalLink with internalLinkTypeGame to share the game.
     */
    public static class Game extends Object {
        /**
         * Unique game identifier.
         */
        public long id;
        /**
         * Game short name.
         */
        public String shortName;
        /**
         * Game title.
         */
        public String title;
        /**
         * Game text, usually containing scoreboards for a game.
         */
        public FormattedText text;
        /**
         * Game description.
         */
        public String description;
        /**
         * Game photo.
         */
        public Photo photo;
        /**
         * Game animation; may be null.
         */
        @Nullable public Animation animation;

        /**
         * Describes a game. Use getInternalLink with internalLinkTypeGame to share the game.
         */
        public Game() {
        }

        /**
         * Describes a game. Use getInternalLink with internalLinkTypeGame to share the game.
         *
         * @param id Unique game identifier.
         * @param shortName Game short name.
         * @param title Game title.
         * @param text Game text, usually containing scoreboards for a game.
         * @param description Game description.
         * @param photo Game photo.
         * @param animation Game animation; may be null.
         */
        public Game(long id, String shortName, String title, FormattedText text, String description, Photo photo, Animation animation) {
            this.id = id;
            this.shortName = shortName;
            this.title = title;
            this.text = text;
            this.description = description;
            this.photo = photo;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1565597752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains one row of the game high score table.
     */
    public static class GameHighScore extends Object {
        /**
         * Position in the high score table.
         */
        public int position;
        /**
         * User identifier.
         */
        public long userId;
        /**
         * User score.
         */
        public int score;

        /**
         * Contains one row of the game high score table.
         */
        public GameHighScore() {
        }

        /**
         * Contains one row of the game high score table.
         *
         * @param position Position in the high score table.
         * @param userId User identifier.
         * @param score User score.
         */
        public GameHighScore(int position, long userId, int score) {
            this.position = position;
            this.userId = userId;
            this.score = score;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 342871838;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of game high scores.
     */
    public static class GameHighScores extends Object {
        /**
         * A list of game high scores.
         */
        public GameHighScore[] scores;

        /**
         * Contains a list of game high scores.
         */
        public GameHighScores() {
        }

        /**
         * Contains a list of game high scores.
         *
         * @param scores A list of game high scores.
         */
        public GameHighScores(GameHighScore[] scores) {
            this.scores = scores;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -725770727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a group call.
     */
    public static class GroupCall extends Object {
        /**
         * Group call identifier.
         */
        public int id;
        /**
         * Group call title.
         */
        public String title;
        /**
         * Point in time (Unix timestamp) when the group call is supposed to be started by an administrator; 0 if it is already active or was ended.
         */
        public int scheduledStartDate;
        /**
         * True, if the group call is scheduled and the current user will receive a notification when the group call starts.
         */
        public boolean enabledStartNotification;
        /**
         * True, if the call is active.
         */
        public boolean isActive;
        /**
         * True, if the chat is an RTMP stream instead of an ordinary video chat.
         */
        public boolean isRtmpStream;
        /**
         * True, if the call is joined.
         */
        public boolean isJoined;
        /**
         * True, if user was kicked from the call because of network loss and the call needs to be rejoined.
         */
        public boolean needRejoin;
        /**
         * True, if the current user can manage the group call.
         */
        public boolean canBeManaged;
        /**
         * Number of participants in the group call.
         */
        public int participantCount;
        /**
         * True, if group call participants, which are muted, aren't returned in participant list.
         */
        public boolean hasHiddenListeners;
        /**
         * True, if all group call participants are loaded.
         */
        public boolean loadedAllParticipants;
        /**
         * At most 3 recently speaking users in the group call.
         */
        public GroupCallRecentSpeaker[] recentSpeakers;
        /**
         * True, if the current user's video is enabled.
         */
        public boolean isMyVideoEnabled;
        /**
         * True, if the current user's video is paused.
         */
        public boolean isMyVideoPaused;
        /**
         * True, if the current user can broadcast video or share screen.
         */
        public boolean canEnableVideo;
        /**
         * True, if only group call administrators can unmute new participants.
         */
        public boolean muteNewParticipants;
        /**
         * True, if the current user can enable or disable muteNewParticipants setting.
         */
        public boolean canToggleMuteNewParticipants;
        /**
         * Duration of the ongoing group call recording, in seconds; 0 if none. An updateGroupCall update is not triggered when value of this field changes, but the same recording goes on.
         */
        public int recordDuration;
        /**
         * True, if a video file is being recorded for the call.
         */
        public boolean isVideoRecorded;
        /**
         * Call duration, in seconds; for ended calls only.
         */
        public int duration;

        /**
         * Describes a group call.
         */
        public GroupCall() {
        }

        /**
         * Describes a group call.
         *
         * @param id Group call identifier.
         * @param title Group call title.
         * @param scheduledStartDate Point in time (Unix timestamp) when the group call is supposed to be started by an administrator; 0 if it is already active or was ended.
         * @param enabledStartNotification True, if the group call is scheduled and the current user will receive a notification when the group call starts.
         * @param isActive True, if the call is active.
         * @param isRtmpStream True, if the chat is an RTMP stream instead of an ordinary video chat.
         * @param isJoined True, if the call is joined.
         * @param needRejoin True, if user was kicked from the call because of network loss and the call needs to be rejoined.
         * @param canBeManaged True, if the current user can manage the group call.
         * @param participantCount Number of participants in the group call.
         * @param hasHiddenListeners True, if group call participants, which are muted, aren't returned in participant list.
         * @param loadedAllParticipants True, if all group call participants are loaded.
         * @param recentSpeakers At most 3 recently speaking users in the group call.
         * @param isMyVideoEnabled True, if the current user's video is enabled.
         * @param isMyVideoPaused True, if the current user's video is paused.
         * @param canEnableVideo True, if the current user can broadcast video or share screen.
         * @param muteNewParticipants True, if only group call administrators can unmute new participants.
         * @param canToggleMuteNewParticipants True, if the current user can enable or disable muteNewParticipants setting.
         * @param recordDuration Duration of the ongoing group call recording, in seconds; 0 if none. An updateGroupCall update is not triggered when value of this field changes, but the same recording goes on.
         * @param isVideoRecorded True, if a video file is being recorded for the call.
         * @param duration Call duration, in seconds; for ended calls only.
         */
        public GroupCall(int id, String title, int scheduledStartDate, boolean enabledStartNotification, boolean isActive, boolean isRtmpStream, boolean isJoined, boolean needRejoin, boolean canBeManaged, int participantCount, boolean hasHiddenListeners, boolean loadedAllParticipants, GroupCallRecentSpeaker[] recentSpeakers, boolean isMyVideoEnabled, boolean isMyVideoPaused, boolean canEnableVideo, boolean muteNewParticipants, boolean canToggleMuteNewParticipants, int recordDuration, boolean isVideoRecorded, int duration) {
            this.id = id;
            this.title = title;
            this.scheduledStartDate = scheduledStartDate;
            this.enabledStartNotification = enabledStartNotification;
            this.isActive = isActive;
            this.isRtmpStream = isRtmpStream;
            this.isJoined = isJoined;
            this.needRejoin = needRejoin;
            this.canBeManaged = canBeManaged;
            this.participantCount = participantCount;
            this.hasHiddenListeners = hasHiddenListeners;
            this.loadedAllParticipants = loadedAllParticipants;
            this.recentSpeakers = recentSpeakers;
            this.isMyVideoEnabled = isMyVideoEnabled;
            this.isMyVideoPaused = isMyVideoPaused;
            this.canEnableVideo = canEnableVideo;
            this.muteNewParticipants = muteNewParticipants;
            this.canToggleMuteNewParticipants = canToggleMuteNewParticipants;
            this.recordDuration = recordDuration;
            this.isVideoRecorded = isVideoRecorded;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -123443355;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the group call identifier.
     */
    public static class GroupCallId extends Object {
        /**
         * Group call identifier.
         */
        public int id;

        /**
         * Contains the group call identifier.
         */
        public GroupCallId() {
        }

        /**
         * Contains the group call identifier.
         *
         * @param id Group call identifier.
         */
        public GroupCallId(int id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 350534469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a group call participant.
     */
    public static class GroupCallParticipant extends Object {
        /**
         * Identifier of the group call participant.
         */
        public MessageSender participantId;
        /**
         * User's audio channel synchronization source identifier.
         */
        public int audioSourceId;
        /**
         * User's screen sharing audio channel synchronization source identifier.
         */
        public int screenSharingAudioSourceId;
        /**
         * Information about user's video channel; may be null if there is no active video.
         */
        @Nullable public GroupCallParticipantVideoInfo videoInfo;
        /**
         * Information about user's screen sharing video channel; may be null if there is no active screen sharing video.
         */
        @Nullable public GroupCallParticipantVideoInfo screenSharingVideoInfo;
        /**
         * The participant user's bio or the participant chat's description.
         */
        public String bio;
        /**
         * True, if the participant is the current user.
         */
        public boolean isCurrentUser;
        /**
         * True, if the participant is speaking as set by setGroupCallParticipantIsSpeaking.
         */
        public boolean isSpeaking;
        /**
         * True, if the participant hand is raised.
         */
        public boolean isHandRaised;
        /**
         * True, if the current user can mute the participant for all other group call participants.
         */
        public boolean canBeMutedForAllUsers;
        /**
         * True, if the current user can allow the participant to unmute themselves or unmute the participant (if the participant is the current user).
         */
        public boolean canBeUnmutedForAllUsers;
        /**
         * True, if the current user can mute the participant only for self.
         */
        public boolean canBeMutedForCurrentUser;
        /**
         * True, if the current user can unmute the participant for self.
         */
        public boolean canBeUnmutedForCurrentUser;
        /**
         * True, if the participant is muted for all users.
         */
        public boolean isMutedForAllUsers;
        /**
         * True, if the participant is muted for the current user.
         */
        public boolean isMutedForCurrentUser;
        /**
         * True, if the participant is muted for all users, but can unmute themselves.
         */
        public boolean canUnmuteSelf;
        /**
         * Participant's volume level; 1-20000 in hundreds of percents.
         */
        public int volumeLevel;
        /**
         * User's order in the group call participant list. Orders must be compared lexicographically. The bigger is order, the higher is user in the list. If order is empty, the user must be removed from the participant list.
         */
        public String order;

        /**
         * Represents a group call participant.
         */
        public GroupCallParticipant() {
        }

        /**
         * Represents a group call participant.
         *
         * @param participantId Identifier of the group call participant.
         * @param audioSourceId User's audio channel synchronization source identifier.
         * @param screenSharingAudioSourceId User's screen sharing audio channel synchronization source identifier.
         * @param videoInfo Information about user's video channel; may be null if there is no active video.
         * @param screenSharingVideoInfo Information about user's screen sharing video channel; may be null if there is no active screen sharing video.
         * @param bio The participant user's bio or the participant chat's description.
         * @param isCurrentUser True, if the participant is the current user.
         * @param isSpeaking True, if the participant is speaking as set by setGroupCallParticipantIsSpeaking.
         * @param isHandRaised True, if the participant hand is raised.
         * @param canBeMutedForAllUsers True, if the current user can mute the participant for all other group call participants.
         * @param canBeUnmutedForAllUsers True, if the current user can allow the participant to unmute themselves or unmute the participant (if the participant is the current user).
         * @param canBeMutedForCurrentUser True, if the current user can mute the participant only for self.
         * @param canBeUnmutedForCurrentUser True, if the current user can unmute the participant for self.
         * @param isMutedForAllUsers True, if the participant is muted for all users.
         * @param isMutedForCurrentUser True, if the participant is muted for the current user.
         * @param canUnmuteSelf True, if the participant is muted for all users, but can unmute themselves.
         * @param volumeLevel Participant's volume level; 1-20000 in hundreds of percents.
         * @param order User's order in the group call participant list. Orders must be compared lexicographically. The bigger is order, the higher is user in the list. If order is empty, the user must be removed from the participant list.
         */
        public GroupCallParticipant(MessageSender participantId, int audioSourceId, int screenSharingAudioSourceId, GroupCallParticipantVideoInfo videoInfo, GroupCallParticipantVideoInfo screenSharingVideoInfo, String bio, boolean isCurrentUser, boolean isSpeaking, boolean isHandRaised, boolean canBeMutedForAllUsers, boolean canBeUnmutedForAllUsers, boolean canBeMutedForCurrentUser, boolean canBeUnmutedForCurrentUser, boolean isMutedForAllUsers, boolean isMutedForCurrentUser, boolean canUnmuteSelf, int volumeLevel, String order) {
            this.participantId = participantId;
            this.audioSourceId = audioSourceId;
            this.screenSharingAudioSourceId = screenSharingAudioSourceId;
            this.videoInfo = videoInfo;
            this.screenSharingVideoInfo = screenSharingVideoInfo;
            this.bio = bio;
            this.isCurrentUser = isCurrentUser;
            this.isSpeaking = isSpeaking;
            this.isHandRaised = isHandRaised;
            this.canBeMutedForAllUsers = canBeMutedForAllUsers;
            this.canBeUnmutedForAllUsers = canBeUnmutedForAllUsers;
            this.canBeMutedForCurrentUser = canBeMutedForCurrentUser;
            this.canBeUnmutedForCurrentUser = canBeUnmutedForCurrentUser;
            this.isMutedForAllUsers = isMutedForAllUsers;
            this.isMutedForCurrentUser = isMutedForCurrentUser;
            this.canUnmuteSelf = canUnmuteSelf;
            this.volumeLevel = volumeLevel;
            this.order = order;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2059182571;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a group call participant's video channel.
     */
    public static class GroupCallParticipantVideoInfo extends Object {
        /**
         * List of synchronization source groups of the video.
         */
        public GroupCallVideoSourceGroup[] sourceGroups;
        /**
         * Video channel endpoint identifier.
         */
        public String endpointId;
        /**
         * True, if the video is paused. This flag needs to be ignored, if new video frames are received.
         */
        public boolean isPaused;

        /**
         * Contains information about a group call participant's video channel.
         */
        public GroupCallParticipantVideoInfo() {
        }

        /**
         * Contains information about a group call participant's video channel.
         *
         * @param sourceGroups List of synchronization source groups of the video.
         * @param endpointId Video channel endpoint identifier.
         * @param isPaused True, if the video is paused. This flag needs to be ignored, if new video frames are received.
         */
        public GroupCallParticipantVideoInfo(GroupCallVideoSourceGroup[] sourceGroups, String endpointId, boolean isPaused) {
            this.sourceGroups = sourceGroups;
            this.endpointId = endpointId;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -14294645;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a recently speaking participant in a group call.
     */
    public static class GroupCallRecentSpeaker extends Object {
        /**
         * Group call participant identifier.
         */
        public MessageSender participantId;
        /**
         * True, is the user has spoken recently.
         */
        public boolean isSpeaking;

        /**
         * Describes a recently speaking participant in a group call.
         */
        public GroupCallRecentSpeaker() {
        }

        /**
         * Describes a recently speaking participant in a group call.
         *
         * @param participantId Group call participant identifier.
         * @param isSpeaking True, is the user has spoken recently.
         */
        public GroupCallRecentSpeaker(MessageSender participantId, boolean isSpeaking) {
            this.participantId = participantId;
            this.isSpeaking = isSpeaking;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1819519436;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an available stream in a group call.
     */
    public static class GroupCallStream extends Object {
        /**
         * Identifier of an audio/video channel.
         */
        public int channelId;
        /**
         * Scale of segment durations in the stream. The duration is 1000/(2**scale) milliseconds.
         */
        public int scale;
        /**
         * Point in time when the stream currently ends; Unix timestamp in milliseconds.
         */
        public long timeOffset;

        /**
         * Describes an available stream in a group call.
         */
        public GroupCallStream() {
        }

        /**
         * Describes an available stream in a group call.
         *
         * @param channelId Identifier of an audio/video channel.
         * @param scale Scale of segment durations in the stream. The duration is 1000/(2**scale) milliseconds.
         * @param timeOffset Point in time when the stream currently ends; Unix timestamp in milliseconds.
         */
        public GroupCallStream(int channelId, int scale, long timeOffset) {
            this.channelId = channelId;
            this.scale = scale;
            this.timeOffset = timeOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -264564795;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of group call streams.
     */
    public static class GroupCallStreams extends Object {
        /**
         * A list of group call streams.
         */
        public GroupCallStream[] streams;

        /**
         * Represents a list of group call streams.
         */
        public GroupCallStreams() {
        }

        /**
         * Represents a list of group call streams.
         *
         * @param streams A list of group call streams.
         */
        public GroupCallStreams(GroupCallStream[] streams) {
            this.streams = streams;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1032959578;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the quality of a group call video.
     */
    public abstract static class GroupCallVideoQuality extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GroupCallVideoQualityThumbnail.CONSTRUCTOR,
            GroupCallVideoQualityMedium.CONSTRUCTOR,
            GroupCallVideoQualityFull.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GroupCallVideoQuality() {
        }
    }

    /**
     * The worst available video quality.
     */
    public static class GroupCallVideoQualityThumbnail extends GroupCallVideoQuality {

        /**
         * The worst available video quality.
         */
        public GroupCallVideoQualityThumbnail() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -379186304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The medium video quality.
     */
    public static class GroupCallVideoQualityMedium extends GroupCallVideoQuality {

        /**
         * The medium video quality.
         */
        public GroupCallVideoQualityMedium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 394968234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The best available video quality.
     */
    public static class GroupCallVideoQualityFull extends GroupCallVideoQuality {

        /**
         * The best available video quality.
         */
        public GroupCallVideoQualityFull() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2125916617;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a group of video synchronization source identifiers.
     */
    public static class GroupCallVideoSourceGroup extends Object {
        /**
         * The semantics of sources, one of &quot;SIM&quot; or &quot;FID&quot;.
         */
        public String semantics;
        /**
         * The list of synchronization source identifiers.
         */
        public int[] sourceIds;

        /**
         * Describes a group of video synchronization source identifiers.
         */
        public GroupCallVideoSourceGroup() {
        }

        /**
         * Describes a group of video synchronization source identifiers.
         *
         * @param semantics The semantics of sources, one of &quot;SIM&quot; or &quot;FID&quot;.
         * @param sourceIds The list of synchronization source identifiers.
         */
        public GroupCallVideoSourceGroup(String semantics, int[] sourceIds) {
            this.semantics = semantics;
            this.sourceIds = sourceIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1190900785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of hashtags.
     */
    public static class Hashtags extends Object {
        /**
         * A list of hashtags.
         */
        public String[] hashtags;

        /**
         * Contains a list of hashtags.
         */
        public Hashtags() {
        }

        /**
         * Contains a list of hashtags.
         *
         * @param hashtags A list of hashtags.
         */
        public Hashtags(String[] hashtags) {
            this.hashtags = hashtags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 676798885;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an HTTP URL.
     */
    public static class HttpUrl extends Object {
        /**
         * The URL.
         */
        public String url;

        /**
         * Contains an HTTP URL.
         */
        public HttpUrl() {
        }

        /**
         * Contains an HTTP URL.
         *
         * @param url The URL.
         */
        public HttpUrl(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2018019930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An identity document.
     */
    public static class IdentityDocument extends Object {
        /**
         * Document number; 1-24 characters.
         */
        public String number;
        /**
         * Document expiration date; may be null if not applicable.
         */
        @Nullable public Date expirationDate;
        /**
         * Front side of the document.
         */
        public DatedFile frontSide;
        /**
         * Reverse side of the document; only for driver license and identity card; may be null.
         */
        @Nullable public DatedFile reverseSide;
        /**
         * Selfie with the document; may be null.
         */
        @Nullable public DatedFile selfie;
        /**
         * List of files containing a certified English translation of the document.
         */
        public DatedFile[] translation;

        /**
         * An identity document.
         */
        public IdentityDocument() {
        }

        /**
         * An identity document.
         *
         * @param number Document number; 1-24 characters.
         * @param expirationDate Document expiration date; may be null if not applicable.
         * @param frontSide Front side of the document.
         * @param reverseSide Reverse side of the document; only for driver license and identity card; may be null.
         * @param selfie Selfie with the document; may be null.
         * @param translation List of files containing a certified English translation of the document.
         */
        public IdentityDocument(String number, Date expirationDate, DatedFile frontSide, DatedFile reverseSide, DatedFile selfie, DatedFile[] translation) {
            this.number = number;
            this.expirationDate = expirationDate;
            this.frontSide = frontSide;
            this.reverseSide = reverseSide;
            this.selfie = selfie;
            this.translation = translation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1001703606;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents the result of an importContacts request.
     */
    public static class ImportedContacts extends Object {
        /**
         * User identifiers of the imported contacts in the same order as they were specified in the request; 0 if the contact is not yet a registered user.
         */
        public long[] userIds;
        /**
         * The number of users that imported the corresponding contact; 0 for already registered users or if unavailable.
         */
        public int[] importerCount;

        /**
         * Represents the result of an importContacts request.
         */
        public ImportedContacts() {
        }

        /**
         * Represents the result of an importContacts request.
         *
         * @param userIds User identifiers of the imported contacts in the same order as they were specified in the request; 0 if the contact is not yet a registered user.
         * @param importerCount The number of users that imported the corresponding contact; 0 for already registered users or if unavailable.
         */
        public ImportedContacts(long[] userIds, int[] importerCount) {
            this.userIds = userIds;
            this.importerCount = importerCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2068432290;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a single button in an inline keyboard.
     */
    public static class InlineKeyboardButton extends Object {
        /**
         * Text of the button.
         */
        public String text;
        /**
         * Type of the button.
         */
        public InlineKeyboardButtonType type;

        /**
         * Represents a single button in an inline keyboard.
         */
        public InlineKeyboardButton() {
        }

        /**
         * Represents a single button in an inline keyboard.
         *
         * @param text Text of the button.
         * @param type Type of the button.
         */
        public InlineKeyboardButton(String text, InlineKeyboardButtonType type) {
            this.text = text;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -372105704;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of inline keyboard button.
     */
    public abstract static class InlineKeyboardButtonType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InlineKeyboardButtonTypeUrl.CONSTRUCTOR,
            InlineKeyboardButtonTypeLoginUrl.CONSTRUCTOR,
            InlineKeyboardButtonTypeWebApp.CONSTRUCTOR,
            InlineKeyboardButtonTypeCallback.CONSTRUCTOR,
            InlineKeyboardButtonTypeCallbackWithPassword.CONSTRUCTOR,
            InlineKeyboardButtonTypeCallbackGame.CONSTRUCTOR,
            InlineKeyboardButtonTypeSwitchInline.CONSTRUCTOR,
            InlineKeyboardButtonTypeBuy.CONSTRUCTOR,
            InlineKeyboardButtonTypeUser.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InlineKeyboardButtonType() {
        }
    }

    /**
     * A button that opens a specified URL.
     */
    public static class InlineKeyboardButtonTypeUrl extends InlineKeyboardButtonType {
        /**
         * HTTP or tg:// URL to open. If the link is of the type internalLinkTypeWebApp, then the button must be marked as a Web App button.
         */
        public String url;

        /**
         * A button that opens a specified URL.
         */
        public InlineKeyboardButtonTypeUrl() {
        }

        /**
         * A button that opens a specified URL.
         *
         * @param url HTTP or tg:// URL to open. If the link is of the type internalLinkTypeWebApp, then the button must be marked as a Web App button.
         */
        public InlineKeyboardButtonTypeUrl(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1130741420;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that opens a specified URL and automatically authorize the current user by calling getLoginUrlInfo.
     */
    public static class InlineKeyboardButtonTypeLoginUrl extends InlineKeyboardButtonType {
        /**
         * An HTTP URL to pass to getLoginUrlInfo.
         */
        public String url;
        /**
         * Unique button identifier.
         */
        public long id;
        /**
         * If non-empty, new text of the button in forwarded messages.
         */
        public String forwardText;

        /**
         * A button that opens a specified URL and automatically authorize the current user by calling getLoginUrlInfo.
         */
        public InlineKeyboardButtonTypeLoginUrl() {
        }

        /**
         * A button that opens a specified URL and automatically authorize the current user by calling getLoginUrlInfo.
         *
         * @param url An HTTP URL to pass to getLoginUrlInfo.
         * @param id Unique button identifier.
         * @param forwardText If non-empty, new text of the button in forwarded messages.
         */
        public InlineKeyboardButtonTypeLoginUrl(String url, long id, String forwardText) {
            this.url = url;
            this.id = id;
            this.forwardText = forwardText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1203413081;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that opens a Web App by calling openWebApp.
     */
    public static class InlineKeyboardButtonTypeWebApp extends InlineKeyboardButtonType {
        /**
         * An HTTP URL to pass to openWebApp.
         */
        public String url;

        /**
         * A button that opens a Web App by calling openWebApp.
         */
        public InlineKeyboardButtonTypeWebApp() {
        }

        /**
         * A button that opens a Web App by calling openWebApp.
         *
         * @param url An HTTP URL to pass to openWebApp.
         */
        public InlineKeyboardButtonTypeWebApp(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1767471672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that sends a callback query to a bot.
     */
    public static class InlineKeyboardButtonTypeCallback extends InlineKeyboardButtonType {
        /**
         * Data to be sent to the bot via a callback query.
         */
        public byte[] data;

        /**
         * A button that sends a callback query to a bot.
         */
        public InlineKeyboardButtonTypeCallback() {
        }

        /**
         * A button that sends a callback query to a bot.
         *
         * @param data Data to be sent to the bot via a callback query.
         */
        public InlineKeyboardButtonTypeCallback(byte[] data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1127515139;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that asks for the 2-step verification password of the current user and then sends a callback query to a bot.
     */
    public static class InlineKeyboardButtonTypeCallbackWithPassword extends InlineKeyboardButtonType {
        /**
         * Data to be sent to the bot via a callback query.
         */
        public byte[] data;

        /**
         * A button that asks for the 2-step verification password of the current user and then sends a callback query to a bot.
         */
        public InlineKeyboardButtonTypeCallbackWithPassword() {
        }

        /**
         * A button that asks for the 2-step verification password of the current user and then sends a callback query to a bot.
         *
         * @param data Data to be sent to the bot via a callback query.
         */
        public InlineKeyboardButtonTypeCallbackWithPassword(byte[] data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 908018248;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button with a game that sends a callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame.
     */
    public static class InlineKeyboardButtonTypeCallbackGame extends InlineKeyboardButtonType {

        /**
         * A button with a game that sends a callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame.
         */
        public InlineKeyboardButtonTypeCallbackGame() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -383429528;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that forces an inline query to the bot to be inserted in the input field.
     */
    public static class InlineKeyboardButtonTypeSwitchInline extends InlineKeyboardButtonType {
        /**
         * Inline query to be sent to the bot.
         */
        public String query;
        /**
         * Target chat from which to send the inline query.
         */
        public TargetChat targetChat;

        /**
         * A button that forces an inline query to the bot to be inserted in the input field.
         */
        public InlineKeyboardButtonTypeSwitchInline() {
        }

        /**
         * A button that forces an inline query to the bot to be inserted in the input field.
         *
         * @param query Inline query to be sent to the bot.
         * @param targetChat Target chat from which to send the inline query.
         */
        public InlineKeyboardButtonTypeSwitchInline(String query, TargetChat targetChat) {
            this.query = query;
            this.targetChat = targetChat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 544906485;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice.
     */
    public static class InlineKeyboardButtonTypeBuy extends InlineKeyboardButtonType {

        /**
         * A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice.
         */
        public InlineKeyboardButtonTypeBuy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1360739440;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button with a user reference to be handled in the same way as textEntityTypeMentionName entities.
     */
    public static class InlineKeyboardButtonTypeUser extends InlineKeyboardButtonType {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * A button with a user reference to be handled in the same way as textEntityTypeMentionName entities.
         */
        public InlineKeyboardButtonTypeUser() {
        }

        /**
         * A button with a user reference to be handled in the same way as textEntityTypeMentionName entities.
         *
         * @param userId User identifier.
         */
        public InlineKeyboardButtonTypeUser(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1836574114;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a single result of an inline query.
     */
    public abstract static class InlineQueryResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InlineQueryResultArticle.CONSTRUCTOR,
            InlineQueryResultContact.CONSTRUCTOR,
            InlineQueryResultLocation.CONSTRUCTOR,
            InlineQueryResultVenue.CONSTRUCTOR,
            InlineQueryResultGame.CONSTRUCTOR,
            InlineQueryResultAnimation.CONSTRUCTOR,
            InlineQueryResultAudio.CONSTRUCTOR,
            InlineQueryResultDocument.CONSTRUCTOR,
            InlineQueryResultPhoto.CONSTRUCTOR,
            InlineQueryResultSticker.CONSTRUCTOR,
            InlineQueryResultVideo.CONSTRUCTOR,
            InlineQueryResultVoiceNote.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InlineQueryResult() {
        }
    }

    /**
     * Represents a link to an article or web page.
     */
    public static class InlineQueryResultArticle extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * URL of the result, if it exists.
         */
        public String url;
        /**
         * True, if the URL must be not shown.
         */
        public boolean hideUrl;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * A short description of the result.
         */
        public String description;
        /**
         * Result thumbnail in JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;

        /**
         * Represents a link to an article or web page.
         */
        public InlineQueryResultArticle() {
        }

        /**
         * Represents a link to an article or web page.
         *
         * @param id Unique identifier of the query result.
         * @param url URL of the result, if it exists.
         * @param hideUrl True, if the URL must be not shown.
         * @param title Title of the result.
         * @param description A short description of the result.
         * @param thumbnail Result thumbnail in JPEG format; may be null.
         */
        public InlineQueryResultArticle(String id, String url, boolean hideUrl, String title, String description, Thumbnail thumbnail) {
            this.id = id;
            this.url = url;
            this.hideUrl = hideUrl;
            this.title = title;
            this.description = description;
            this.thumbnail = thumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 206340825;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a user contact.
     */
    public static class InlineQueryResultContact extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * A user contact.
         */
        public Contact contact;
        /**
         * Result thumbnail in JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;

        /**
         * Represents a user contact.
         */
        public InlineQueryResultContact() {
        }

        /**
         * Represents a user contact.
         *
         * @param id Unique identifier of the query result.
         * @param contact A user contact.
         * @param thumbnail Result thumbnail in JPEG format; may be null.
         */
        public InlineQueryResultContact(String id, Contact contact, Thumbnail thumbnail) {
            this.id = id;
            this.contact = contact;
            this.thumbnail = thumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -181960174;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a point on the map.
     */
    public static class InlineQueryResultLocation extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Location result.
         */
        public Location location;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * Result thumbnail in JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;

        /**
         * Represents a point on the map.
         */
        public InlineQueryResultLocation() {
        }

        /**
         * Represents a point on the map.
         *
         * @param id Unique identifier of the query result.
         * @param location Location result.
         * @param title Title of the result.
         * @param thumbnail Result thumbnail in JPEG format; may be null.
         */
        public InlineQueryResultLocation(String id, Location location, String title, Thumbnail thumbnail) {
            this.id = id;
            this.location = location;
            this.title = title;
            this.thumbnail = thumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 466004752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents information about a venue.
     */
    public static class InlineQueryResultVenue extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Venue result.
         */
        public Venue venue;
        /**
         * Result thumbnail in JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;

        /**
         * Represents information about a venue.
         */
        public InlineQueryResultVenue() {
        }

        /**
         * Represents information about a venue.
         *
         * @param id Unique identifier of the query result.
         * @param venue Venue result.
         * @param thumbnail Result thumbnail in JPEG format; may be null.
         */
        public InlineQueryResultVenue(String id, Venue venue, Thumbnail thumbnail) {
            this.id = id;
            this.venue = venue;
            this.thumbnail = thumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1281036382;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents information about a game.
     */
    public static class InlineQueryResultGame extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Game result.
         */
        public Game game;

        /**
         * Represents information about a game.
         */
        public InlineQueryResultGame() {
        }

        /**
         * Represents information about a game.
         *
         * @param id Unique identifier of the query result.
         * @param game Game result.
         */
        public InlineQueryResultGame(String id, Game game) {
            this.id = id;
            this.game = game;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1706916987;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an animation file.
     */
    public static class InlineQueryResultAnimation extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Animation file.
         */
        public Animation animation;
        /**
         * Animation title.
         */
        public String title;

        /**
         * Represents an animation file.
         */
        public InlineQueryResultAnimation() {
        }

        /**
         * Represents an animation file.
         *
         * @param id Unique identifier of the query result.
         * @param animation Animation file.
         * @param title Animation title.
         */
        public InlineQueryResultAnimation(String id, Animation animation, String title) {
            this.id = id;
            this.animation = animation;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2009984267;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an audio file.
     */
    public static class InlineQueryResultAudio extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Audio file.
         */
        public Audio audio;

        /**
         * Represents an audio file.
         */
        public InlineQueryResultAudio() {
        }

        /**
         * Represents an audio file.
         *
         * @param id Unique identifier of the query result.
         * @param audio Audio file.
         */
        public InlineQueryResultAudio(String id, Audio audio) {
            this.id = id;
            this.audio = audio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 842650360;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a document.
     */
    public static class InlineQueryResultDocument extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Document.
         */
        public Document document;
        /**
         * Document title.
         */
        public String title;
        /**
         * Document description.
         */
        public String description;

        /**
         * Represents a document.
         */
        public InlineQueryResultDocument() {
        }

        /**
         * Represents a document.
         *
         * @param id Unique identifier of the query result.
         * @param document Document.
         * @param title Document title.
         * @param description Document description.
         */
        public InlineQueryResultDocument(String id, Document document, String title, String description) {
            this.id = id;
            this.document = document;
            this.title = title;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1491268539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a photo.
     */
    public static class InlineQueryResultPhoto extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Photo.
         */
        public Photo photo;
        /**
         * Title of the result, if known.
         */
        public String title;
        /**
         * A short description of the result, if known.
         */
        public String description;

        /**
         * Represents a photo.
         */
        public InlineQueryResultPhoto() {
        }

        /**
         * Represents a photo.
         *
         * @param id Unique identifier of the query result.
         * @param photo Photo.
         * @param title Title of the result, if known.
         * @param description A short description of the result, if known.
         */
        public InlineQueryResultPhoto(String id, Photo photo, String title, String description) {
            this.id = id;
            this.photo = photo;
            this.title = title;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1848319440;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a sticker.
     */
    public static class InlineQueryResultSticker extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Sticker.
         */
        public Sticker sticker;

        /**
         * Represents a sticker.
         */
        public InlineQueryResultSticker() {
        }

        /**
         * Represents a sticker.
         *
         * @param id Unique identifier of the query result.
         * @param sticker Sticker.
         */
        public InlineQueryResultSticker(String id, Sticker sticker) {
            this.id = id;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1848224245;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a video.
     */
    public static class InlineQueryResultVideo extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Video.
         */
        public Video video;
        /**
         * Title of the video.
         */
        public String title;
        /**
         * Description of the video.
         */
        public String description;

        /**
         * Represents a video.
         */
        public InlineQueryResultVideo() {
        }

        /**
         * Represents a video.
         *
         * @param id Unique identifier of the query result.
         * @param video Video.
         * @param title Title of the video.
         * @param description Description of the video.
         */
        public InlineQueryResultVideo(String id, Video video, String title, String description) {
            this.id = id;
            this.video = video;
            this.title = title;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1373158683;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a voice note.
     */
    public static class InlineQueryResultVoiceNote extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Voice note.
         */
        public VoiceNote voiceNote;
        /**
         * Title of the voice note.
         */
        public String title;

        /**
         * Represents a voice note.
         */
        public InlineQueryResultVoiceNote() {
        }

        /**
         * Represents a voice note.
         *
         * @param id Unique identifier of the query result.
         * @param voiceNote Voice note.
         * @param title Title of the voice note.
         */
        public InlineQueryResultVoiceNote(String id, VoiceNote voiceNote, String title) {
            this.id = id;
            this.voiceNote = voiceNote;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1897393105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query.
     */
    public static class InlineQueryResults extends Object {
        /**
         * Unique identifier of the inline query.
         */
        public long inlineQueryId;
        /**
         * Button to be shown above inline query results; may be null.
         */
        @Nullable public InlineQueryResultsButton button;
        /**
         * Results of the query.
         */
        public InlineQueryResult[] results;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query.
         */
        public InlineQueryResults() {
        }

        /**
         * Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query.
         *
         * @param inlineQueryId Unique identifier of the inline query.
         * @param button Button to be shown above inline query results; may be null.
         * @param results Results of the query.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public InlineQueryResults(long inlineQueryId, InlineQueryResultsButton button, InlineQueryResult[] results, String nextOffset) {
            this.inlineQueryId = inlineQueryId;
            this.button = button;
            this.results = results;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1830685615;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a button to be shown above inline query results.
     */
    public static class InlineQueryResultsButton extends Object {
        /**
         * The text of the button.
         */
        public String text;
        /**
         * Type of the button.
         */
        public InlineQueryResultsButtonType type;

        /**
         * Represents a button to be shown above inline query results.
         */
        public InlineQueryResultsButton() {
        }

        /**
         * Represents a button to be shown above inline query results.
         *
         * @param text The text of the button.
         * @param type Type of the button.
         */
        public InlineQueryResultsButton(String text, InlineQueryResultsButtonType type) {
            this.text = text;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -790689618;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents type of button in results of inline query.
     */
    public abstract static class InlineQueryResultsButtonType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InlineQueryResultsButtonTypeStartBot.CONSTRUCTOR,
            InlineQueryResultsButtonTypeWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InlineQueryResultsButtonType() {
        }
    }

    /**
     * Describes the button that opens a private chat with the bot and sends a start message to the bot with the given parameter.
     */
    public static class InlineQueryResultsButtonTypeStartBot extends InlineQueryResultsButtonType {
        /**
         * The parameter for the bot start message.
         */
        public String parameter;

        /**
         * Describes the button that opens a private chat with the bot and sends a start message to the bot with the given parameter.
         */
        public InlineQueryResultsButtonTypeStartBot() {
        }

        /**
         * Describes the button that opens a private chat with the bot and sends a start message to the bot with the given parameter.
         *
         * @param parameter The parameter for the bot start message.
         */
        public InlineQueryResultsButtonTypeStartBot(String parameter) {
            this.parameter = parameter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -23400235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes the button that opens a Web App by calling getWebAppUrl.
     */
    public static class InlineQueryResultsButtonTypeWebApp extends InlineQueryResultsButtonType {
        /**
         * An HTTP URL to pass to getWebAppUrl.
         */
        public String url;

        /**
         * Describes the button that opens a Web App by calling getWebAppUrl.
         */
        public InlineQueryResultsButtonTypeWebApp() {
        }

        /**
         * Describes the button that opens a Web App by calling getWebAppUrl.
         *
         * @param url An HTTP URL to pass to getWebAppUrl.
         */
        public InlineQueryResultsButtonTypeWebApp(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1197382814;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about background to set.
     */
    public abstract static class InputBackground extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputBackgroundLocal.CONSTRUCTOR,
            InputBackgroundRemote.CONSTRUCTOR,
            InputBackgroundPrevious.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputBackground() {
        }
    }

    /**
     * A background from a local file.
     */
    public static class InputBackgroundLocal extends InputBackground {
        /**
         * Background file to use. Only inputFileLocal and inputFileGenerated are supported. The file must be in JPEG format for wallpapers and in PNG format for patterns.
         */
        public InputFile background;

        /**
         * A background from a local file.
         */
        public InputBackgroundLocal() {
        }

        /**
         * A background from a local file.
         *
         * @param background Background file to use. Only inputFileLocal and inputFileGenerated are supported. The file must be in JPEG format for wallpapers and in PNG format for patterns.
         */
        public InputBackgroundLocal(InputFile background) {
            this.background = background;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1747094364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A background from the server.
     */
    public static class InputBackgroundRemote extends InputBackground {
        /**
         * The background identifier.
         */
        public long backgroundId;

        /**
         * A background from the server.
         */
        public InputBackgroundRemote() {
        }

        /**
         * A background from the server.
         *
         * @param backgroundId The background identifier.
         */
        public InputBackgroundRemote(long backgroundId) {
            this.backgroundId = backgroundId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -274976231;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A background previously set in the chat; for chat backgrounds only.
     */
    public static class InputBackgroundPrevious extends InputBackground {
        /**
         * Identifier of the message with the background.
         */
        public long messageId;

        /**
         * A background previously set in the chat; for chat backgrounds only.
         */
        public InputBackgroundPrevious() {
        }

        /**
         * A background previously set in the chat; for chat backgrounds only.
         *
         * @param messageId Identifier of the message with the background.
         */
        public InputBackgroundPrevious(long messageId) {
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -351905954;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a business chat link to create or edit.
     */
    public static class InputBusinessChatLink extends Object {
        /**
         * Message draft text that will be added to the input field.
         */
        public FormattedText text;
        /**
         * Link title.
         */
        public String title;

        /**
         * Describes a business chat link to create or edit.
         */
        public InputBusinessChatLink() {
        }

        /**
         * Describes a business chat link to create or edit.
         *
         * @param text Message draft text that will be added to the input field.
         * @param title Link title.
         */
        public InputBusinessChatLink(FormattedText text, String title) {
            this.text = text;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 237858296;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes settings for a business account start page to set.
     */
    public static class InputBusinessStartPage extends Object {
        /**
         * Title text of the start page; 0-getOption(&quot;business_start_page_title_length_max&quot;) characters.
         */
        public String title;
        /**
         * Message text of the start page; 0-getOption(&quot;business_start_page_message_length_max&quot;) characters.
         */
        public String message;
        /**
         * Greeting sticker of the start page; pass null if none. The sticker must belong to a sticker set and must not be a custom emoji.
         */
        public InputFile sticker;

        /**
         * Describes settings for a business account start page to set.
         */
        public InputBusinessStartPage() {
        }

        /**
         * Describes settings for a business account start page to set.
         *
         * @param title Title text of the start page; 0-getOption(&quot;business_start_page_title_length_max&quot;) characters.
         * @param message Message text of the start page; 0-getOption(&quot;business_start_page_message_length_max&quot;) characters.
         * @param sticker Greeting sticker of the start page; pass null if none. The sticker must belong to a sticker set and must not be a custom emoji.
         */
        public InputBusinessStartPage(String title, String message, InputFile sticker) {
            this.title = title;
            this.message = message;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -327383072;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a photo to be set as a user profile or chat photo.
     */
    public abstract static class InputChatPhoto extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputChatPhotoPrevious.CONSTRUCTOR,
            InputChatPhotoStatic.CONSTRUCTOR,
            InputChatPhotoAnimation.CONSTRUCTOR,
            InputChatPhotoSticker.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputChatPhoto() {
        }
    }

    /**
     * A previously used profile photo of the current user.
     */
    public static class InputChatPhotoPrevious extends InputChatPhoto {
        /**
         * Identifier of the current user's profile photo to reuse.
         */
        public long chatPhotoId;

        /**
         * A previously used profile photo of the current user.
         */
        public InputChatPhotoPrevious() {
        }

        /**
         * A previously used profile photo of the current user.
         *
         * @param chatPhotoId Identifier of the current user's profile photo to reuse.
         */
        public InputChatPhotoPrevious(long chatPhotoId) {
            this.chatPhotoId = chatPhotoId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 23128529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A static photo in JPEG format.
     */
    public static class InputChatPhotoStatic extends InputChatPhoto {
        /**
         * Photo to be set as profile photo. Only inputFileLocal and inputFileGenerated are allowed.
         */
        public InputFile photo;

        /**
         * A static photo in JPEG format.
         */
        public InputChatPhotoStatic() {
        }

        /**
         * A static photo in JPEG format.
         *
         * @param photo Photo to be set as profile photo. Only inputFileLocal and inputFileGenerated are allowed.
         */
        public InputChatPhotoStatic(InputFile photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1979179699;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation in MPEG4 format; must be square, at most 10 seconds long, have width between 160 and 1280 and be at most 2MB in size.
     */
    public static class InputChatPhotoAnimation extends InputChatPhoto {
        /**
         * Animation to be set as profile photo. Only inputFileLocal and inputFileGenerated are allowed.
         */
        public InputFile animation;
        /**
         * Timestamp of the frame, which will be used as static chat photo.
         */
        public double mainFrameTimestamp;

        /**
         * An animation in MPEG4 format; must be square, at most 10 seconds long, have width between 160 and 1280 and be at most 2MB in size.
         */
        public InputChatPhotoAnimation() {
        }

        /**
         * An animation in MPEG4 format; must be square, at most 10 seconds long, have width between 160 and 1280 and be at most 2MB in size.
         *
         * @param animation Animation to be set as profile photo. Only inputFileLocal and inputFileGenerated are allowed.
         * @param mainFrameTimestamp Timestamp of the frame, which will be used as static chat photo.
         */
        public InputChatPhotoAnimation(InputFile animation, double mainFrameTimestamp) {
            this.animation = animation;
            this.mainFrameTimestamp = mainFrameTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 90846242;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker on a custom background.
     */
    public static class InputChatPhotoSticker extends InputChatPhoto {
        /**
         * Information about the sticker.
         */
        public ChatPhotoSticker sticker;

        /**
         * A sticker on a custom background.
         */
        public InputChatPhotoSticker() {
        }

        /**
         * A sticker on a custom background.
         *
         * @param sticker Information about the sticker.
         */
        public InputChatPhotoSticker(ChatPhotoSticker sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1315861341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the payment method chosen by the user.
     */
    public abstract static class InputCredentials extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputCredentialsSaved.CONSTRUCTOR,
            InputCredentialsNew.CONSTRUCTOR,
            InputCredentialsApplePay.CONSTRUCTOR,
            InputCredentialsGooglePay.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputCredentials() {
        }
    }

    /**
     * Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password.
     */
    public static class InputCredentialsSaved extends InputCredentials {
        /**
         * Identifier of the saved credentials.
         */
        public String savedCredentialsId;

        /**
         * Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password.
         */
        public InputCredentialsSaved() {
        }

        /**
         * Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password.
         *
         * @param savedCredentialsId Identifier of the saved credentials.
         */
        public InputCredentialsSaved(String savedCredentialsId) {
            this.savedCredentialsId = savedCredentialsId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2034385364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies if a user enters new credentials on a payment provider website.
     */
    public static class InputCredentialsNew extends InputCredentials {
        /**
         * JSON-encoded data with the credential identifier from the payment provider.
         */
        public String data;
        /**
         * True, if the credential identifier can be saved on the server side.
         */
        public boolean allowSave;

        /**
         * Applies if a user enters new credentials on a payment provider website.
         */
        public InputCredentialsNew() {
        }

        /**
         * Applies if a user enters new credentials on a payment provider website.
         *
         * @param data JSON-encoded data with the credential identifier from the payment provider.
         * @param allowSave True, if the credential identifier can be saved on the server side.
         */
        public InputCredentialsNew(String data, boolean allowSave) {
            this.data = data;
            this.allowSave = allowSave;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -829689558;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies if a user enters new credentials using Apple Pay.
     */
    public static class InputCredentialsApplePay extends InputCredentials {
        /**
         * JSON-encoded data with the credential identifier.
         */
        public String data;

        /**
         * Applies if a user enters new credentials using Apple Pay.
         */
        public InputCredentialsApplePay() {
        }

        /**
         * Applies if a user enters new credentials using Apple Pay.
         *
         * @param data JSON-encoded data with the credential identifier.
         */
        public InputCredentialsApplePay(String data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1246570799;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies if a user enters new credentials using Google Pay.
     */
    public static class InputCredentialsGooglePay extends InputCredentials {
        /**
         * JSON-encoded data with the credential identifier.
         */
        public String data;

        /**
         * Applies if a user enters new credentials using Google Pay.
         */
        public InputCredentialsGooglePay() {
        }

        /**
         * Applies if a user enters new credentials using Google Pay.
         *
         * @param data JSON-encoded data with the credential identifier.
         */
        public InputCredentialsGooglePay(String data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 844384100;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Points to a file.
     */
    public abstract static class InputFile extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputFileId.CONSTRUCTOR,
            InputFileRemote.CONSTRUCTOR,
            InputFileLocal.CONSTRUCTOR,
            InputFileGenerated.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputFile() {
        }
    }

    /**
     * A file defined by its unique identifier.
     */
    public static class InputFileId extends InputFile {
        /**
         * Unique file identifier.
         */
        public int id;

        /**
         * A file defined by its unique identifier.
         */
        public InputFileId() {
        }

        /**
         * A file defined by its unique identifier.
         *
         * @param id Unique file identifier.
         */
        public InputFileId(int id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1788906253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file defined by its remote identifier. The remote identifier is guaranteed to be usable only if the corresponding file is still accessible to the user and known to TDLib. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
     */
    public static class InputFileRemote extends InputFile {
        /**
         * Remote file identifier.
         */
        public String id;

        /**
         * A file defined by its remote identifier. The remote identifier is guaranteed to be usable only if the corresponding file is still accessible to the user and known to TDLib. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
         */
        public InputFileRemote() {
        }

        /**
         * A file defined by its remote identifier. The remote identifier is guaranteed to be usable only if the corresponding file is still accessible to the user and known to TDLib. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
         *
         * @param id Remote file identifier.
         */
        public InputFileRemote(String id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -107574466;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file defined by a local path.
     */
    public static class InputFileLocal extends InputFile {
        /**
         * Local path to the file.
         */
        public String path;

        /**
         * A file defined by a local path.
         */
        public InputFileLocal() {
        }

        /**
         * A file defined by a local path.
         *
         * @param path Local path to the file.
         */
        public InputFileLocal(String path) {
            this.path = path;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2056030919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file generated by the application.
     */
    public static class InputFileGenerated extends InputFile {
        /**
         * Local path to a file from which the file is generated; may be empty if there is no such file.
         */
        public String originalPath;
        /**
         * String specifying the conversion applied to the original file; must be persistent across application restarts. Conversions beginning with '#' are reserved for internal TDLib usage.
         */
        public String conversion;
        /**
         * Expected size of the generated file, in bytes; 0 if unknown.
         */
        public long expectedSize;

        /**
         * A file generated by the application.
         */
        public InputFileGenerated() {
        }

        /**
         * A file generated by the application.
         *
         * @param originalPath Local path to a file from which the file is generated; may be empty if there is no such file.
         * @param conversion String specifying the conversion applied to the original file; must be persistent across application restarts. Conversions beginning with '#' are reserved for internal TDLib usage.
         * @param expectedSize Expected size of the generated file, in bytes; 0 if unknown.
         */
        public InputFileGenerated(String originalPath, String conversion, long expectedSize) {
            this.originalPath = originalPath;
            this.conversion = conversion;
            this.expectedSize = expectedSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1333385216;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An identity document to be saved to Telegram Passport.
     */
    public static class InputIdentityDocument extends Object {
        /**
         * Document number; 1-24 characters.
         */
        public String number;
        /**
         * Document expiration date; pass null if not applicable.
         */
        public Date expirationDate;
        /**
         * Front side of the document.
         */
        public InputFile frontSide;
        /**
         * Reverse side of the document; only for driver license and identity card; pass null otherwise.
         */
        public InputFile reverseSide;
        /**
         * Selfie with the document; pass null if unavailable.
         */
        public InputFile selfie;
        /**
         * List of files containing a certified English translation of the document.
         */
        public InputFile[] translation;

        /**
         * An identity document to be saved to Telegram Passport.
         */
        public InputIdentityDocument() {
        }

        /**
         * An identity document to be saved to Telegram Passport.
         *
         * @param number Document number; 1-24 characters.
         * @param expirationDate Document expiration date; pass null if not applicable.
         * @param frontSide Front side of the document.
         * @param reverseSide Reverse side of the document; only for driver license and identity card; pass null otherwise.
         * @param selfie Selfie with the document; pass null if unavailable.
         * @param translation List of files containing a certified English translation of the document.
         */
        public InputIdentityDocument(String number, Date expirationDate, InputFile frontSide, InputFile reverseSide, InputFile selfie, InputFile[] translation) {
            this.number = number;
            this.expirationDate = expirationDate;
            this.frontSide = frontSide;
            this.reverseSide = reverseSide;
            this.selfie = selfie;
            this.translation = translation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 767353688;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a single result of an inline query; for bots only.
     */
    public abstract static class InputInlineQueryResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputInlineQueryResultAnimation.CONSTRUCTOR,
            InputInlineQueryResultArticle.CONSTRUCTOR,
            InputInlineQueryResultAudio.CONSTRUCTOR,
            InputInlineQueryResultContact.CONSTRUCTOR,
            InputInlineQueryResultDocument.CONSTRUCTOR,
            InputInlineQueryResultGame.CONSTRUCTOR,
            InputInlineQueryResultLocation.CONSTRUCTOR,
            InputInlineQueryResultPhoto.CONSTRUCTOR,
            InputInlineQueryResultSticker.CONSTRUCTOR,
            InputInlineQueryResultVenue.CONSTRUCTOR,
            InputInlineQueryResultVideo.CONSTRUCTOR,
            InputInlineQueryResultVoiceNote.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputInlineQueryResult() {
        }
    }

    /**
     * Represents a link to an animated GIF or an animated (i.e., without sound) H.264/MPEG-4 AVC video.
     */
    public static class InputInlineQueryResultAnimation extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the query result.
         */
        public String title;
        /**
         * URL of the result thumbnail (JPEG, GIF, or MPEG4), if it exists.
         */
        public String thumbnailUrl;
        /**
         * MIME type of the video thumbnail. If non-empty, must be one of &quot;image/jpeg&quot;, &quot;image/gif&quot; and &quot;video/mp4&quot;.
         */
        public String thumbnailMimeType;
        /**
         * The URL of the video file (file size must not exceed 1MB).
         */
        public String videoUrl;
        /**
         * MIME type of the video file. Must be one of &quot;image/gif&quot; and &quot;video/mp4&quot;.
         */
        public String videoMimeType;
        /**
         * Duration of the video, in seconds.
         */
        public int videoDuration;
        /**
         * Width of the video.
         */
        public int videoWidth;
        /**
         * Height of the video.
         */
        public int videoHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAnimation, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to an animated GIF or an animated (i.e., without sound) H.264/MPEG-4 AVC video.
         */
        public InputInlineQueryResultAnimation() {
        }

        /**
         * Represents a link to an animated GIF or an animated (i.e., without sound) H.264/MPEG-4 AVC video.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the query result.
         * @param thumbnailUrl URL of the result thumbnail (JPEG, GIF, or MPEG4), if it exists.
         * @param thumbnailMimeType MIME type of the video thumbnail. If non-empty, must be one of &quot;image/jpeg&quot;, &quot;image/gif&quot; and &quot;video/mp4&quot;.
         * @param videoUrl The URL of the video file (file size must not exceed 1MB).
         * @param videoMimeType MIME type of the video file. Must be one of &quot;image/gif&quot; and &quot;video/mp4&quot;.
         * @param videoDuration Duration of the video, in seconds.
         * @param videoWidth Width of the video.
         * @param videoHeight Height of the video.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAnimation, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultAnimation(String id, String title, String thumbnailUrl, String thumbnailMimeType, String videoUrl, String videoMimeType, int videoDuration, int videoWidth, int videoHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailMimeType = thumbnailMimeType;
            this.videoUrl = videoUrl;
            this.videoMimeType = videoMimeType;
            this.videoDuration = videoDuration;
            this.videoWidth = videoWidth;
            this.videoHeight = videoHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1489808874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to an article or web page.
     */
    public static class InputInlineQueryResultArticle extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * URL of the result, if it exists.
         */
        public String url;
        /**
         * True, if the URL must be not shown.
         */
        public boolean hideUrl;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * A short description of the result.
         */
        public String description;
        /**
         * URL of the result thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Thumbnail width, if known.
         */
        public int thumbnailWidth;
        /**
         * Thumbnail height, if known.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to an article or web page.
         */
        public InputInlineQueryResultArticle() {
        }

        /**
         * Represents a link to an article or web page.
         *
         * @param id Unique identifier of the query result.
         * @param url URL of the result, if it exists.
         * @param hideUrl True, if the URL must be not shown.
         * @param title Title of the result.
         * @param description A short description of the result.
         * @param thumbnailUrl URL of the result thumbnail, if it exists.
         * @param thumbnailWidth Thumbnail width, if known.
         * @param thumbnailHeight Thumbnail height, if known.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultArticle(String id, String url, boolean hideUrl, String title, String description, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.url = url;
            this.hideUrl = hideUrl;
            this.title = title;
            this.description = description;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1973670156;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to an MP3 audio file.
     */
    public static class InputInlineQueryResultAudio extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the audio file.
         */
        public String title;
        /**
         * Performer of the audio file.
         */
        public String performer;
        /**
         * The URL of the audio file.
         */
        public String audioUrl;
        /**
         * Audio file duration, in seconds.
         */
        public int audioDuration;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAudio, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to an MP3 audio file.
         */
        public InputInlineQueryResultAudio() {
        }

        /**
         * Represents a link to an MP3 audio file.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the audio file.
         * @param performer Performer of the audio file.
         * @param audioUrl The URL of the audio file.
         * @param audioDuration Audio file duration, in seconds.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAudio, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultAudio(String id, String title, String performer, String audioUrl, int audioDuration, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.performer = performer;
            this.audioUrl = audioUrl;
            this.audioDuration = audioDuration;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1260139988;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a user contact.
     */
    public static class InputInlineQueryResultContact extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * User contact.
         */
        public Contact contact;
        /**
         * URL of the result thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Thumbnail width, if known.
         */
        public int thumbnailWidth;
        /**
         * Thumbnail height, if known.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a user contact.
         */
        public InputInlineQueryResultContact() {
        }

        /**
         * Represents a user contact.
         *
         * @param id Unique identifier of the query result.
         * @param contact User contact.
         * @param thumbnailUrl URL of the result thumbnail, if it exists.
         * @param thumbnailWidth Thumbnail width, if known.
         * @param thumbnailHeight Thumbnail height, if known.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultContact(String id, Contact contact, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.contact = contact;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1846064594;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to a file.
     */
    public static class InputInlineQueryResultDocument extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the resulting file.
         */
        public String title;
        /**
         * Short description of the result, if known.
         */
        public String description;
        /**
         * URL of the file.
         */
        public String documentUrl;
        /**
         * MIME type of the file content; only &quot;application/pdf&quot; and &quot;application/zip&quot; are currently allowed.
         */
        public String mimeType;
        /**
         * The URL of the file thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Width of the thumbnail.
         */
        public int thumbnailWidth;
        /**
         * Height of the thumbnail.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageDocument, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to a file.
         */
        public InputInlineQueryResultDocument() {
        }

        /**
         * Represents a link to a file.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the resulting file.
         * @param description Short description of the result, if known.
         * @param documentUrl URL of the file.
         * @param mimeType MIME type of the file content; only &quot;application/pdf&quot; and &quot;application/zip&quot; are currently allowed.
         * @param thumbnailUrl The URL of the file thumbnail, if it exists.
         * @param thumbnailWidth Width of the thumbnail.
         * @param thumbnailHeight Height of the thumbnail.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageDocument, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultDocument(String id, String title, String description, String documentUrl, String mimeType, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.description = description;
            this.documentUrl = documentUrl;
            this.mimeType = mimeType;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 578801869;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a game.
     */
    public static class InputInlineQueryResultGame extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Short name of the game.
         */
        public String gameShortName;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Represents a game.
         */
        public InputInlineQueryResultGame() {
        }

        /**
         * Represents a game.
         *
         * @param id Unique identifier of the query result.
         * @param gameShortName Short name of the game.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public InputInlineQueryResultGame(String id, String gameShortName, ReplyMarkup replyMarkup) {
            this.id = id;
            this.gameShortName = gameShortName;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 966074327;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a point on the map.
     */
    public static class InputInlineQueryResultLocation extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Location result.
         */
        public Location location;
        /**
         * Amount of time relative to the message sent time until the location can be updated, in seconds.
         */
        public int livePeriod;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * URL of the result thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Thumbnail width, if known.
         */
        public int thumbnailWidth;
        /**
         * Thumbnail height, if known.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a point on the map.
         */
        public InputInlineQueryResultLocation() {
        }

        /**
         * Represents a point on the map.
         *
         * @param id Unique identifier of the query result.
         * @param location Location result.
         * @param livePeriod Amount of time relative to the message sent time until the location can be updated, in seconds.
         * @param title Title of the result.
         * @param thumbnailUrl URL of the result thumbnail, if it exists.
         * @param thumbnailWidth Thumbnail width, if known.
         * @param thumbnailHeight Thumbnail height, if known.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultLocation(String id, Location location, int livePeriod, String title, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.location = location;
            this.livePeriod = livePeriod;
            this.title = title;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1887650218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents link to a JPEG image.
     */
    public static class InputInlineQueryResultPhoto extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the result, if known.
         */
        public String title;
        /**
         * A short description of the result, if known.
         */
        public String description;
        /**
         * URL of the photo thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * The URL of the JPEG photo (photo size must not exceed 5MB).
         */
        public String photoUrl;
        /**
         * Width of the photo.
         */
        public int photoWidth;
        /**
         * Height of the photo.
         */
        public int photoHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessagePhoto, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents link to a JPEG image.
         */
        public InputInlineQueryResultPhoto() {
        }

        /**
         * Represents link to a JPEG image.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the result, if known.
         * @param description A short description of the result, if known.
         * @param thumbnailUrl URL of the photo thumbnail, if it exists.
         * @param photoUrl The URL of the JPEG photo (photo size must not exceed 5MB).
         * @param photoWidth Width of the photo.
         * @param photoHeight Height of the photo.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessagePhoto, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultPhoto(String id, String title, String description, String thumbnailUrl, String photoUrl, int photoWidth, int photoHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.description = description;
            this.thumbnailUrl = thumbnailUrl;
            this.photoUrl = photoUrl;
            this.photoWidth = photoWidth;
            this.photoHeight = photoHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1123338721;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to a WEBP, TGS, or WEBM sticker.
     */
    public static class InputInlineQueryResultSticker extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * URL of the sticker thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * The URL of the WEBP, TGS, or WEBM sticker (sticker file size must not exceed 5MB).
         */
        public String stickerUrl;
        /**
         * Width of the sticker.
         */
        public int stickerWidth;
        /**
         * Height of the sticker.
         */
        public int stickerHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageSticker, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to a WEBP, TGS, or WEBM sticker.
         */
        public InputInlineQueryResultSticker() {
        }

        /**
         * Represents a link to a WEBP, TGS, or WEBM sticker.
         *
         * @param id Unique identifier of the query result.
         * @param thumbnailUrl URL of the sticker thumbnail, if it exists.
         * @param stickerUrl The URL of the WEBP, TGS, or WEBM sticker (sticker file size must not exceed 5MB).
         * @param stickerWidth Width of the sticker.
         * @param stickerHeight Height of the sticker.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageSticker, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultSticker(String id, String thumbnailUrl, String stickerUrl, int stickerWidth, int stickerHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.thumbnailUrl = thumbnailUrl;
            this.stickerUrl = stickerUrl;
            this.stickerWidth = stickerWidth;
            this.stickerHeight = stickerHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 274007129;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents information about a venue.
     */
    public static class InputInlineQueryResultVenue extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Venue result.
         */
        public Venue venue;
        /**
         * URL of the result thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Thumbnail width, if known.
         */
        public int thumbnailWidth;
        /**
         * Thumbnail height, if known.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents information about a venue.
         */
        public InputInlineQueryResultVenue() {
        }

        /**
         * Represents information about a venue.
         *
         * @param id Unique identifier of the query result.
         * @param venue Venue result.
         * @param thumbnailUrl URL of the result thumbnail, if it exists.
         * @param thumbnailWidth Thumbnail width, if known.
         * @param thumbnailHeight Thumbnail height, if known.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultVenue(String id, Venue venue, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.venue = venue;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 541704509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to a page containing an embedded video player or a video file.
     */
    public static class InputInlineQueryResultVideo extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * A short description of the result, if known.
         */
        public String description;
        /**
         * The URL of the video thumbnail (JPEG), if it exists.
         */
        public String thumbnailUrl;
        /**
         * URL of the embedded video player or video file.
         */
        public String videoUrl;
        /**
         * MIME type of the content of the video URL, only &quot;text/html&quot; or &quot;video/mp4&quot; are currently supported.
         */
        public String mimeType;
        /**
         * Width of the video.
         */
        public int videoWidth;
        /**
         * Height of the video.
         */
        public int videoHeight;
        /**
         * Video duration, in seconds.
         */
        public int videoDuration;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageVideo, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to a page containing an embedded video player or a video file.
         */
        public InputInlineQueryResultVideo() {
        }

        /**
         * Represents a link to a page containing an embedded video player or a video file.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the result.
         * @param description A short description of the result, if known.
         * @param thumbnailUrl The URL of the video thumbnail (JPEG), if it exists.
         * @param videoUrl URL of the embedded video player or video file.
         * @param mimeType MIME type of the content of the video URL, only &quot;text/html&quot; or &quot;video/mp4&quot; are currently supported.
         * @param videoWidth Width of the video.
         * @param videoHeight Height of the video.
         * @param videoDuration Video duration, in seconds.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageVideo, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultVideo(String id, String title, String description, String thumbnailUrl, String videoUrl, String mimeType, int videoWidth, int videoHeight, int videoDuration, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.description = description;
            this.thumbnailUrl = thumbnailUrl;
            this.videoUrl = videoUrl;
            this.mimeType = mimeType;
            this.videoWidth = videoWidth;
            this.videoHeight = videoHeight;
            this.videoDuration = videoDuration;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1724073191;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to an opus-encoded audio file within an OGG container, single channel audio.
     */
    public static class InputInlineQueryResultVoiceNote extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the voice note.
         */
        public String title;
        /**
         * The URL of the voice note file.
         */
        public String voiceNoteUrl;
        /**
         * Duration of the voice note, in seconds.
         */
        public int voiceNoteDuration;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageVoiceNote, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to an opus-encoded audio file within an OGG container, single channel audio.
         */
        public InputInlineQueryResultVoiceNote() {
        }

        /**
         * Represents a link to an opus-encoded audio file within an OGG container, single channel audio.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the voice note.
         * @param voiceNoteUrl The URL of the voice note file.
         * @param voiceNoteDuration Duration of the voice note, in seconds.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageVoiceNote, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultVoiceNote(String id, String title, String voiceNoteUrl, int voiceNoteDuration, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.voiceNoteUrl = voiceNoteUrl;
            this.voiceNoteDuration = voiceNoteDuration;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1790072503;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes an invoice to process.
     */
    public abstract static class InputInvoice extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputInvoiceMessage.CONSTRUCTOR,
            InputInvoiceName.CONSTRUCTOR,
            InputInvoiceTelegram.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputInvoice() {
        }
    }

    /**
     * An invoice from a message of the type messageInvoice or paid media purchase from messagePaidMedia.
     */
    public static class InputInvoiceMessage extends InputInvoice {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * An invoice from a message of the type messageInvoice or paid media purchase from messagePaidMedia.
         */
        public InputInvoiceMessage() {
        }

        /**
         * An invoice from a message of the type messageInvoice or paid media purchase from messagePaidMedia.
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Message identifier.
         */
        public InputInvoiceMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1490872848;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An invoice from a link of the type internalLinkTypeInvoice.
     */
    public static class InputInvoiceName extends InputInvoice {
        /**
         * Name of the invoice.
         */
        public String name;

        /**
         * An invoice from a link of the type internalLinkTypeInvoice.
         */
        public InputInvoiceName() {
        }

        /**
         * An invoice from a link of the type internalLinkTypeInvoice.
         *
         * @param name Name of the invoice.
         */
        public InputInvoiceName(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1312155917;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An invoice for a payment toward Telegram; must not be used in the in-store apps.
     */
    public static class InputInvoiceTelegram extends InputInvoice {
        /**
         * Transaction purpose.
         */
        public TelegramPaymentPurpose purpose;

        /**
         * An invoice for a payment toward Telegram; must not be used in the in-store apps.
         */
        public InputInvoiceTelegram() {
        }

        /**
         * An invoice for a payment toward Telegram; must not be used in the in-store apps.
         *
         * @param purpose Transaction purpose.
         */
        public InputInvoiceTelegram(TelegramPaymentPurpose purpose) {
            this.purpose = purpose;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1762853139;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * The content of a message to send.
     */
    public abstract static class InputMessageContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputMessageText.CONSTRUCTOR,
            InputMessageAnimation.CONSTRUCTOR,
            InputMessageAudio.CONSTRUCTOR,
            InputMessageDocument.CONSTRUCTOR,
            InputMessagePaidMedia.CONSTRUCTOR,
            InputMessagePhoto.CONSTRUCTOR,
            InputMessageSticker.CONSTRUCTOR,
            InputMessageVideo.CONSTRUCTOR,
            InputMessageVideoNote.CONSTRUCTOR,
            InputMessageVoiceNote.CONSTRUCTOR,
            InputMessageLocation.CONSTRUCTOR,
            InputMessageVenue.CONSTRUCTOR,
            InputMessageContact.CONSTRUCTOR,
            InputMessageDice.CONSTRUCTOR,
            InputMessageGame.CONSTRUCTOR,
            InputMessageInvoice.CONSTRUCTOR,
            InputMessagePoll.CONSTRUCTOR,
            InputMessageStory.CONSTRUCTOR,
            InputMessageForwarded.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputMessageContent() {
        }
    }

    /**
     * A text message.
     */
    public static class InputMessageText extends InputMessageContent {
        /**
         * Formatted text to be sent; 0-getOption(&quot;message_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl and MentionName entities are allowed to be specified manually.
         */
        public FormattedText text;
        /**
         * Options to be used for generation of a link preview; may be null if none; pass null to use default link preview options.
         */
        @Nullable public LinkPreviewOptions linkPreviewOptions;
        /**
         * True, if a chat message draft must be deleted.
         */
        public boolean clearDraft;

        /**
         * A text message.
         */
        public InputMessageText() {
        }

        /**
         * A text message.
         *
         * @param text Formatted text to be sent; 0-getOption(&quot;message_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl and MentionName entities are allowed to be specified manually.
         * @param linkPreviewOptions Options to be used for generation of a link preview; may be null if none; pass null to use default link preview options.
         * @param clearDraft True, if a chat message draft must be deleted.
         */
        public InputMessageText(FormattedText text, LinkPreviewOptions linkPreviewOptions, boolean clearDraft) {
            this.text = text;
            this.linkPreviewOptions = linkPreviewOptions;
            this.clearDraft = clearDraft;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -212805484;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation message (GIF-style).
     */
    public static class InputMessageAnimation extends InputMessageContent {
        /**
         * Animation file to be sent.
         */
        public InputFile animation;
        /**
         * Animation thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * File identifiers of the stickers added to the animation, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Duration of the animation, in seconds.
         */
        public int duration;
        /**
         * Width of the animation; may be replaced by the server.
         */
        public int width;
        /**
         * Height of the animation; may be replaced by the server.
         */
        public int height;
        /**
         * Animation caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the animation; otherwise, the caption must be shown below the animation; not supported in secret chats.
         */
        public boolean showCaptionAboveMedia;
        /**
         * True, if the animation preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public boolean hasSpoiler;

        /**
         * An animation message (GIF-style).
         */
        public InputMessageAnimation() {
        }

        /**
         * An animation message (GIF-style).
         *
         * @param animation Animation file to be sent.
         * @param thumbnail Animation thumbnail; pass null to skip thumbnail uploading.
         * @param addedStickerFileIds File identifiers of the stickers added to the animation, if applicable.
         * @param duration Duration of the animation, in seconds.
         * @param width Width of the animation; may be replaced by the server.
         * @param height Height of the animation; may be replaced by the server.
         * @param caption Animation caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia True, if the caption must be shown above the animation; otherwise, the caption must be shown below the animation; not supported in secret chats.
         * @param hasSpoiler True, if the animation preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public InputMessageAnimation(InputFile animation, InputThumbnail thumbnail, int[] addedStickerFileIds, int duration, int width, int height, FormattedText caption, boolean showCaptionAboveMedia, boolean hasSpoiler) {
            this.animation = animation;
            this.thumbnail = thumbnail;
            this.addedStickerFileIds = addedStickerFileIds;
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.hasSpoiler = hasSpoiler;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -210404059;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An audio message.
     */
    public static class InputMessageAudio extends InputMessageContent {
        /**
         * Audio file to be sent.
         */
        public InputFile audio;
        /**
         * Thumbnail of the cover for the album; pass null to skip thumbnail uploading.
         */
        public InputThumbnail albumCoverThumbnail;
        /**
         * Duration of the audio, in seconds; may be replaced by the server.
         */
        public int duration;
        /**
         * Title of the audio; 0-64 characters; may be replaced by the server.
         */
        public String title;
        /**
         * Performer of the audio; 0-64 characters, may be replaced by the server.
         */
        public String performer;
        /**
         * Audio caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;

        /**
         * An audio message.
         */
        public InputMessageAudio() {
        }

        /**
         * An audio message.
         *
         * @param audio Audio file to be sent.
         * @param albumCoverThumbnail Thumbnail of the cover for the album; pass null to skip thumbnail uploading.
         * @param duration Duration of the audio, in seconds; may be replaced by the server.
         * @param title Title of the audio; 0-64 characters; may be replaced by the server.
         * @param performer Performer of the audio; 0-64 characters, may be replaced by the server.
         * @param caption Audio caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public InputMessageAudio(InputFile audio, InputThumbnail albumCoverThumbnail, int duration, String title, String performer, FormattedText caption) {
            this.audio = audio;
            this.albumCoverThumbnail = albumCoverThumbnail;
            this.duration = duration;
            this.title = title;
            this.performer = performer;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -626786126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A document message (general file).
     */
    public static class InputMessageDocument extends InputMessageContent {
        /**
         * Document to be sent.
         */
        public InputFile document;
        /**
         * Document thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * Pass true to disable automatic file type detection and send the document as a file. Always true for files sent to secret chats.
         */
        public boolean disableContentTypeDetection;
        /**
         * Document caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;

        /**
         * A document message (general file).
         */
        public InputMessageDocument() {
        }

        /**
         * A document message (general file).
         *
         * @param document Document to be sent.
         * @param thumbnail Document thumbnail; pass null to skip thumbnail uploading.
         * @param disableContentTypeDetection Pass true to disable automatic file type detection and send the document as a file. Always true for files sent to secret chats.
         * @param caption Document caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public InputMessageDocument(InputFile document, InputThumbnail thumbnail, boolean disableContentTypeDetection, FormattedText caption) {
            this.document = document;
            this.thumbnail = thumbnail;
            this.disableContentTypeDetection = disableContentTypeDetection;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1633383097;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with paid media; can be used only in channel chats with supergroupFullInfo.hasPaidMediaAllowed.
     */
    public static class InputMessagePaidMedia extends InputMessageContent {
        /**
         * The number of stars that must be paid to see the media; 1-getOption(&quot;paid_media_message_star_count_max&quot;).
         */
        public long starCount;
        /**
         * The content of the paid media.
         */
        public InputPaidMedia[] paidMedia;
        /**
         * Message caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the video; otherwise, the caption must be shown below the video; not supported in secret chats.
         */
        public boolean showCaptionAboveMedia;

        /**
         * A message with paid media; can be used only in channel chats with supergroupFullInfo.hasPaidMediaAllowed.
         */
        public InputMessagePaidMedia() {
        }

        /**
         * A message with paid media; can be used only in channel chats with supergroupFullInfo.hasPaidMediaAllowed.
         *
         * @param starCount The number of stars that must be paid to see the media; 1-getOption(&quot;paid_media_message_star_count_max&quot;).
         * @param paidMedia The content of the paid media.
         * @param caption Message caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia True, if the caption must be shown above the video; otherwise, the caption must be shown below the video; not supported in secret chats.
         */
        public InputMessagePaidMedia(long starCount, InputPaidMedia[] paidMedia, FormattedText caption, boolean showCaptionAboveMedia) {
            this.starCount = starCount;
            this.paidMedia = paidMedia;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2067332077;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A photo message.
     */
    public static class InputMessagePhoto extends InputMessageContent {
        /**
         * Photo to send. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
         */
        public InputFile photo;
        /**
         * Photo thumbnail to be sent; pass null to skip thumbnail uploading. The thumbnail is sent to the other party only in secret chats.
         */
        public InputThumbnail thumbnail;
        /**
         * File identifiers of the stickers added to the photo, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Photo width.
         */
        public int width;
        /**
         * Photo height.
         */
        public int height;
        /**
         * Photo caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the photo; otherwise, the caption must be shown below the photo; not supported in secret chats.
         */
        public boolean showCaptionAboveMedia;
        /**
         * Photo self-destruct type; pass null if none; private chats only.
         */
        public MessageSelfDestructType selfDestructType;
        /**
         * True, if the photo preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public boolean hasSpoiler;

        /**
         * A photo message.
         */
        public InputMessagePhoto() {
        }

        /**
         * A photo message.
         *
         * @param photo Photo to send. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
         * @param thumbnail Photo thumbnail to be sent; pass null to skip thumbnail uploading. The thumbnail is sent to the other party only in secret chats.
         * @param addedStickerFileIds File identifiers of the stickers added to the photo, if applicable.
         * @param width Photo width.
         * @param height Photo height.
         * @param caption Photo caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia True, if the caption must be shown above the photo; otherwise, the caption must be shown below the photo; not supported in secret chats.
         * @param selfDestructType Photo self-destruct type; pass null if none; private chats only.
         * @param hasSpoiler True, if the photo preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public InputMessagePhoto(InputFile photo, InputThumbnail thumbnail, int[] addedStickerFileIds, int width, int height, FormattedText caption, boolean showCaptionAboveMedia, MessageSelfDestructType selfDestructType, boolean hasSpoiler) {
            this.photo = photo;
            this.thumbnail = thumbnail;
            this.addedStickerFileIds = addedStickerFileIds;
            this.width = width;
            this.height = height;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.selfDestructType = selfDestructType;
            this.hasSpoiler = hasSpoiler;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -810129442;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker message.
     */
    public static class InputMessageSticker extends InputMessageContent {
        /**
         * Sticker to be sent.
         */
        public InputFile sticker;
        /**
         * Sticker thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * Sticker width.
         */
        public int width;
        /**
         * Sticker height.
         */
        public int height;
        /**
         * Emoji used to choose the sticker.
         */
        public String emoji;

        /**
         * A sticker message.
         */
        public InputMessageSticker() {
        }

        /**
         * A sticker message.
         *
         * @param sticker Sticker to be sent.
         * @param thumbnail Sticker thumbnail; pass null to skip thumbnail uploading.
         * @param width Sticker width.
         * @param height Sticker height.
         * @param emoji Emoji used to choose the sticker.
         */
        public InputMessageSticker(InputFile sticker, InputThumbnail thumbnail, int width, int height, String emoji) {
            this.sticker = sticker;
            this.thumbnail = thumbnail;
            this.width = width;
            this.height = height;
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1072805625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video message.
     */
    public static class InputMessageVideo extends InputMessageContent {
        /**
         * Video to be sent.
         */
        public InputFile video;
        /**
         * Video thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * File identifiers of the stickers added to the video, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Duration of the video, in seconds.
         */
        public int duration;
        /**
         * Video width.
         */
        public int width;
        /**
         * Video height.
         */
        public int height;
        /**
         * True, if the video is supposed to be streamed.
         */
        public boolean supportsStreaming;
        /**
         * Video caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the video; otherwise, the caption must be shown below the video; not supported in secret chats.
         */
        public boolean showCaptionAboveMedia;
        /**
         * Video self-destruct type; pass null if none; private chats only.
         */
        public MessageSelfDestructType selfDestructType;
        /**
         * True, if the video preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public boolean hasSpoiler;

        /**
         * A video message.
         */
        public InputMessageVideo() {
        }

        /**
         * A video message.
         *
         * @param video Video to be sent.
         * @param thumbnail Video thumbnail; pass null to skip thumbnail uploading.
         * @param addedStickerFileIds File identifiers of the stickers added to the video, if applicable.
         * @param duration Duration of the video, in seconds.
         * @param width Video width.
         * @param height Video height.
         * @param supportsStreaming True, if the video is supposed to be streamed.
         * @param caption Video caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia True, if the caption must be shown above the video; otherwise, the caption must be shown below the video; not supported in secret chats.
         * @param selfDestructType Video self-destruct type; pass null if none; private chats only.
         * @param hasSpoiler True, if the video preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public InputMessageVideo(InputFile video, InputThumbnail thumbnail, int[] addedStickerFileIds, int duration, int width, int height, boolean supportsStreaming, FormattedText caption, boolean showCaptionAboveMedia, MessageSelfDestructType selfDestructType, boolean hasSpoiler) {
            this.video = video;
            this.thumbnail = thumbnail;
            this.addedStickerFileIds = addedStickerFileIds;
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.supportsStreaming = supportsStreaming;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.selfDestructType = selfDestructType;
            this.hasSpoiler = hasSpoiler;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 615537686;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video note message.
     */
    public static class InputMessageVideoNote extends InputMessageContent {
        /**
         * Video note to be sent.
         */
        public InputFile videoNote;
        /**
         * Video thumbnail; may be null if empty; pass null to skip thumbnail uploading.
         */
        @Nullable public InputThumbnail thumbnail;
        /**
         * Duration of the video, in seconds; 0-60.
         */
        public int duration;
        /**
         * Video width and height; must be positive and not greater than 640.
         */
        public int length;
        /**
         * Video note self-destruct type; may be null if none; pass null if none; private chats only.
         */
        @Nullable public MessageSelfDestructType selfDestructType;

        /**
         * A video note message.
         */
        public InputMessageVideoNote() {
        }

        /**
         * A video note message.
         *
         * @param videoNote Video note to be sent.
         * @param thumbnail Video thumbnail; may be null if empty; pass null to skip thumbnail uploading.
         * @param duration Duration of the video, in seconds; 0-60.
         * @param length Video width and height; must be positive and not greater than 640.
         * @param selfDestructType Video note self-destruct type; may be null if none; pass null if none; private chats only.
         */
        public InputMessageVideoNote(InputFile videoNote, InputThumbnail thumbnail, int duration, int length, MessageSelfDestructType selfDestructType) {
            this.videoNote = videoNote;
            this.thumbnail = thumbnail;
            this.duration = duration;
            this.length = length;
            this.selfDestructType = selfDestructType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -714598691;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A voice note message.
     */
    public static class InputMessageVoiceNote extends InputMessageContent {
        /**
         * Voice note to be sent. The voice note must be encoded with the Opus codec and stored inside an OGG container with a single audio channel, or be in MP3 or M4A format as regular audio.
         */
        public InputFile voiceNote;
        /**
         * Duration of the voice note, in seconds.
         */
        public int duration;
        /**
         * Waveform representation of the voice note in 5-bit format.
         */
        public byte[] waveform;
        /**
         * Voice note caption; may be null if empty; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        @Nullable public FormattedText caption;
        /**
         * Voice note self-destruct type; may be null if none; pass null if none; private chats only.
         */
        @Nullable public MessageSelfDestructType selfDestructType;

        /**
         * A voice note message.
         */
        public InputMessageVoiceNote() {
        }

        /**
         * A voice note message.
         *
         * @param voiceNote Voice note to be sent. The voice note must be encoded with the Opus codec and stored inside an OGG container with a single audio channel, or be in MP3 or M4A format as regular audio.
         * @param duration Duration of the voice note, in seconds.
         * @param waveform Waveform representation of the voice note in 5-bit format.
         * @param caption Voice note caption; may be null if empty; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param selfDestructType Voice note self-destruct type; may be null if none; pass null if none; private chats only.
         */
        public InputMessageVoiceNote(InputFile voiceNote, int duration, byte[] waveform, FormattedText caption, MessageSelfDestructType selfDestructType) {
            this.voiceNote = voiceNote;
            this.duration = duration;
            this.waveform = waveform;
            this.caption = caption;
            this.selfDestructType = selfDestructType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1461977004;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a location.
     */
    public static class InputMessageLocation extends InputMessageContent {
        /**
         * Location to be sent.
         */
        public Location location;
        /**
         * Period for which the location can be updated, in seconds; must be between 60 and 86400 for a temporary live location, 0x7FFFFFFF for permanent live location, and 0 otherwise.
         */
        public int livePeriod;
        /**
         * For live locations, a direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         */
        public int heading;
        /**
         * For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled. Can't be enabled in channels and Saved Messages.
         */
        public int proximityAlertRadius;

        /**
         * A message with a location.
         */
        public InputMessageLocation() {
        }

        /**
         * A message with a location.
         *
         * @param location Location to be sent.
         * @param livePeriod Period for which the location can be updated, in seconds; must be between 60 and 86400 for a temporary live location, 0x7FFFFFFF for permanent live location, and 0 otherwise.
         * @param heading For live locations, a direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         * @param proximityAlertRadius For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled. Can't be enabled in channels and Saved Messages.
         */
        public InputMessageLocation(Location location, int livePeriod, int heading, int proximityAlertRadius) {
            this.location = location;
            this.livePeriod = livePeriod;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 648735088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about a venue.
     */
    public static class InputMessageVenue extends InputMessageContent {
        /**
         * Venue to send.
         */
        public Venue venue;

        /**
         * A message with information about a venue.
         */
        public InputMessageVenue() {
        }

        /**
         * A message with information about a venue.
         *
         * @param venue Venue to send.
         */
        public InputMessageVenue(Venue venue) {
            this.venue = venue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1447926269;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message containing a user contact.
     */
    public static class InputMessageContact extends InputMessageContent {
        /**
         * Contact to send.
         */
        public Contact contact;

        /**
         * A message containing a user contact.
         */
        public InputMessageContact() {
        }

        /**
         * A message containing a user contact.
         *
         * @param contact Contact to send.
         */
        public InputMessageContact(Contact contact) {
            this.contact = contact;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -982446849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A dice message.
     */
    public static class InputMessageDice extends InputMessageContent {
        /**
         * Emoji on which the dice throw animation is based.
         */
        public String emoji;
        /**
         * True, if the chat message draft must be deleted.
         */
        public boolean clearDraft;

        /**
         * A dice message.
         */
        public InputMessageDice() {
        }

        /**
         * A dice message.
         *
         * @param emoji Emoji on which the dice throw animation is based.
         * @param clearDraft True, if the chat message draft must be deleted.
         */
        public InputMessageDice(String emoji, boolean clearDraft) {
            this.emoji = emoji;
            this.clearDraft = clearDraft;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 841574313;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a game; not supported for channels or secret chats.
     */
    public static class InputMessageGame extends InputMessageContent {
        /**
         * User identifier of the bot that owns the game.
         */
        public long botUserId;
        /**
         * Short name of the game.
         */
        public String gameShortName;

        /**
         * A message with a game; not supported for channels or secret chats.
         */
        public InputMessageGame() {
        }

        /**
         * A message with a game; not supported for channels or secret chats.
         *
         * @param botUserId User identifier of the bot that owns the game.
         * @param gameShortName Short name of the game.
         */
        public InputMessageGame(long botUserId, String gameShortName) {
            this.botUserId = botUserId;
            this.gameShortName = gameShortName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1252944610;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an invoice; can be used only by bots.
     */
    public static class InputMessageInvoice extends InputMessageContent {
        /**
         * Invoice.
         */
        public Invoice invoice;
        /**
         * Product title; 1-32 characters.
         */
        public String title;
        /**
         * Product description; 0-255 characters.
         */
        public String description;
        /**
         * Product photo URL; optional.
         */
        public String photoUrl;
        /**
         * Product photo size.
         */
        public int photoSize;
        /**
         * Product photo width.
         */
        public int photoWidth;
        /**
         * Product photo height.
         */
        public int photoHeight;
        /**
         * The invoice payload.
         */
        public byte[] payload;
        /**
         * Payment provider token; may be empty for payments in Telegram Stars.
         */
        public String providerToken;
        /**
         * JSON-encoded data about the invoice, which will be shared with the payment provider.
         */
        public String providerData;
        /**
         * Unique invoice bot deep link parameter for the generation of this invoice. If empty, it would be possible to pay directly from forwards of the invoice message.
         */
        public String startParameter;
        /**
         * The content of paid media attached to the invoice; pass null if none.
         */
        public InputPaidMedia paidMedia;
        /**
         * Paid media caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText paidMediaCaption;

        /**
         * A message with an invoice; can be used only by bots.
         */
        public InputMessageInvoice() {
        }

        /**
         * A message with an invoice; can be used only by bots.
         *
         * @param invoice Invoice.
         * @param title Product title; 1-32 characters.
         * @param description Product description; 0-255 characters.
         * @param photoUrl Product photo URL; optional.
         * @param photoSize Product photo size.
         * @param photoWidth Product photo width.
         * @param photoHeight Product photo height.
         * @param payload The invoice payload.
         * @param providerToken Payment provider token; may be empty for payments in Telegram Stars.
         * @param providerData JSON-encoded data about the invoice, which will be shared with the payment provider.
         * @param startParameter Unique invoice bot deep link parameter for the generation of this invoice. If empty, it would be possible to pay directly from forwards of the invoice message.
         * @param paidMedia The content of paid media attached to the invoice; pass null if none.
         * @param paidMediaCaption Paid media caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public InputMessageInvoice(Invoice invoice, String title, String description, String photoUrl, int photoSize, int photoWidth, int photoHeight, byte[] payload, String providerToken, String providerData, String startParameter, InputPaidMedia paidMedia, FormattedText paidMediaCaption) {
            this.invoice = invoice;
            this.title = title;
            this.description = description;
            this.photoUrl = photoUrl;
            this.photoSize = photoSize;
            this.photoWidth = photoWidth;
            this.photoHeight = photoHeight;
            this.payload = payload;
            this.providerToken = providerToken;
            this.providerData = providerData;
            this.startParameter = startParameter;
            this.paidMedia = paidMedia;
            this.paidMediaCaption = paidMediaCaption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1162047631;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a poll. Polls can't be sent to secret chats. Polls can be sent only to a private chat with a bot.
     */
    public static class InputMessagePoll extends InputMessageContent {
        /**
         * Poll question; 1-255 characters (up to 300 characters for bots). Only custom emoji entities are allowed to be added and only by Premium users.
         */
        public FormattedText question;
        /**
         * List of poll answer options, 2-10 strings 1-100 characters each. Only custom emoji entities are allowed to be added and only by Premium users.
         */
        public FormattedText[] options;
        /**
         * True, if the poll voters are anonymous. Non-anonymous polls can't be sent or forwarded to channels.
         */
        public boolean isAnonymous;
        /**
         * Type of the poll.
         */
        public PollType type;
        /**
         * Amount of time the poll will be active after creation, in seconds; for bots only.
         */
        public int openPeriod;
        /**
         * Point in time (Unix timestamp) when the poll will automatically be closed; for bots only.
         */
        public int closeDate;
        /**
         * True, if the poll needs to be sent already closed; for bots only.
         */
        public boolean isClosed;

        /**
         * A message with a poll. Polls can't be sent to secret chats. Polls can be sent only to a private chat with a bot.
         */
        public InputMessagePoll() {
        }

        /**
         * A message with a poll. Polls can't be sent to secret chats. Polls can be sent only to a private chat with a bot.
         *
         * @param question Poll question; 1-255 characters (up to 300 characters for bots). Only custom emoji entities are allowed to be added and only by Premium users.
         * @param options List of poll answer options, 2-10 strings 1-100 characters each. Only custom emoji entities are allowed to be added and only by Premium users.
         * @param isAnonymous True, if the poll voters are anonymous. Non-anonymous polls can't be sent or forwarded to channels.
         * @param type Type of the poll.
         * @param openPeriod Amount of time the poll will be active after creation, in seconds; for bots only.
         * @param closeDate Point in time (Unix timestamp) when the poll will automatically be closed; for bots only.
         * @param isClosed True, if the poll needs to be sent already closed; for bots only.
         */
        public InputMessagePoll(FormattedText question, FormattedText[] options, boolean isAnonymous, PollType type, int openPeriod, int closeDate, boolean isClosed) {
            this.question = question;
            this.options = options;
            this.isAnonymous = isAnonymous;
            this.type = type;
            this.openPeriod = openPeriod;
            this.closeDate = closeDate;
            this.isClosed = isClosed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -263337164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a forwarded story. Stories can't be sent to secret chats. A story can be forwarded only if story.canBeForwarded.
     */
    public static class InputMessageStory extends InputMessageContent {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storySenderChatId;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * A message with a forwarded story. Stories can't be sent to secret chats. A story can be forwarded only if story.canBeForwarded.
         */
        public InputMessageStory() {
        }

        /**
         * A message with a forwarded story. Stories can't be sent to secret chats. A story can be forwarded only if story.canBeForwarded.
         *
         * @param storySenderChatId Identifier of the chat that posted the story.
         * @param storyId Story identifier.
         */
        public InputMessageStory(long storySenderChatId, int storyId) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 554278243;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forwarded message.
     */
    public static class InputMessageForwarded extends InputMessageContent {
        /**
         * Identifier for the chat this forwarded message came from.
         */
        public long fromChatId;
        /**
         * Identifier of the message to forward. A message can be forwarded only if message.canBeForwarded.
         */
        public long messageId;
        /**
         * True, if a game message is being shared from a launched game; applies only to game messages.
         */
        public boolean inGameShare;
        /**
         * Options to be used to copy content of the message without reference to the original sender; pass null to forward the message as usual.
         */
        public MessageCopyOptions copyOptions;

        /**
         * A forwarded message.
         */
        public InputMessageForwarded() {
        }

        /**
         * A forwarded message.
         *
         * @param fromChatId Identifier for the chat this forwarded message came from.
         * @param messageId Identifier of the message to forward. A message can be forwarded only if message.canBeForwarded.
         * @param inGameShare True, if a game message is being shared from a launched game; applies only to game messages.
         * @param copyOptions Options to be used to copy content of the message without reference to the original sender; pass null to forward the message as usual.
         */
        public InputMessageForwarded(long fromChatId, long messageId, boolean inGameShare, MessageCopyOptions copyOptions) {
            this.fromChatId = fromChatId;
            this.messageId = messageId;
            this.inGameShare = inGameShare;
            this.copyOptions = copyOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1696232440;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the message or the story to be replied.
     */
    public abstract static class InputMessageReplyTo extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputMessageReplyToMessage.CONSTRUCTOR,
            InputMessageReplyToExternalMessage.CONSTRUCTOR,
            InputMessageReplyToStory.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputMessageReplyTo() {
        }
    }

    /**
     * Describes a message to be replied in the same chat and forum topic.
     */
    public static class InputMessageReplyToMessage extends InputMessageReplyTo {
        /**
         * The identifier of the message to be replied in the same chat and forum topic.
         */
        public long messageId;
        /**
         * Quote from the message to be replied; pass null if none. Must always be null for replies in secret chats.
         */
        public InputTextQuote quote;

        /**
         * Describes a message to be replied in the same chat and forum topic.
         */
        public InputMessageReplyToMessage() {
        }

        /**
         * Describes a message to be replied in the same chat and forum topic.
         *
         * @param messageId The identifier of the message to be replied in the same chat and forum topic.
         * @param quote Quote from the message to be replied; pass null if none. Must always be null for replies in secret chats.
         */
        public InputMessageReplyToMessage(long messageId, InputTextQuote quote) {
            this.messageId = messageId;
            this.quote = quote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1033987837;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a message to be replied that is from a different chat or a forum topic; not supported in secret chats.
     */
    public static class InputMessageReplyToExternalMessage extends InputMessageReplyTo {
        /**
         * The identifier of the chat to which the message to be replied belongs.
         */
        public long chatId;
        /**
         * The identifier of the message to be replied in the specified chat. A message can be replied in another chat or topic only if message.canBeRepliedInAnotherChat.
         */
        public long messageId;
        /**
         * Quote from the message to be replied; pass null if none.
         */
        public InputTextQuote quote;

        /**
         * Describes a message to be replied that is from a different chat or a forum topic; not supported in secret chats.
         */
        public InputMessageReplyToExternalMessage() {
        }

        /**
         * Describes a message to be replied that is from a different chat or a forum topic; not supported in secret chats.
         *
         * @param chatId The identifier of the chat to which the message to be replied belongs.
         * @param messageId The identifier of the message to be replied in the specified chat. A message can be replied in another chat or topic only if message.canBeRepliedInAnotherChat.
         * @param quote Quote from the message to be replied; pass null if none.
         */
        public InputMessageReplyToExternalMessage(long chatId, long messageId, InputTextQuote quote) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.quote = quote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1993530582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a story to be replied.
     */
    public static class InputMessageReplyToStory extends InputMessageReplyTo {
        /**
         * The identifier of the sender of the story. Currently, stories can be replied only in the sender's chat and channel stories can't be replied.
         */
        public long storySenderChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;

        /**
         * Describes a story to be replied.
         */
        public InputMessageReplyToStory() {
        }

        /**
         * Describes a story to be replied.
         *
         * @param storySenderChatId The identifier of the sender of the story. Currently, stories can be replied only in the sender's chat and channel stories can't be replied.
         * @param storyId The identifier of the story.
         */
        public InputMessageReplyToStory(long storySenderChatId, int storyId) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1370410616;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a paid media to be sent.
     */
    public static class InputPaidMedia extends Object {
        /**
         * Type of the media.
         */
        public InputPaidMediaType type;
        /**
         * Photo or video to be sent.
         */
        public InputFile media;
        /**
         * Media thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * File identifiers of the stickers added to the media, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Media width.
         */
        public int width;
        /**
         * Media height.
         */
        public int height;

        /**
         * Describes a paid media to be sent.
         */
        public InputPaidMedia() {
        }

        /**
         * Describes a paid media to be sent.
         *
         * @param type Type of the media.
         * @param media Photo or video to be sent.
         * @param thumbnail Media thumbnail; pass null to skip thumbnail uploading.
         * @param addedStickerFileIds File identifiers of the stickers added to the media, if applicable.
         * @param width Media width.
         * @param height Media height.
         */
        public InputPaidMedia(InputPaidMediaType type, InputFile media, InputThumbnail thumbnail, int[] addedStickerFileIds, int width, int height) {
            this.type = type;
            this.media = media;
            this.thumbnail = thumbnail;
            this.addedStickerFileIds = addedStickerFileIds;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 475844035;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of paid media to sent.
     */
    public abstract static class InputPaidMediaType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputPaidMediaTypePhoto.CONSTRUCTOR,
            InputPaidMediaTypeVideo.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputPaidMediaType() {
        }
    }

    /**
     * The media is a photo. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
     */
    public static class InputPaidMediaTypePhoto extends InputPaidMediaType {

        /**
         * The media is a photo. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
         */
        public InputPaidMediaTypePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -761660134;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is a video.
     */
    public static class InputPaidMediaTypeVideo extends InputPaidMediaType {
        /**
         * Duration of the video, in seconds.
         */
        public int duration;
        /**
         * True, if the video is supposed to be streamed.
         */
        public boolean supportsStreaming;

        /**
         * The media is a video.
         */
        public InputPaidMediaTypeVideo() {
        }

        /**
         * The media is a video.
         *
         * @param duration Duration of the video, in seconds.
         * @param supportsStreaming True, if the video is supposed to be streamed.
         */
        public InputPaidMediaTypeVideo(int duration, boolean supportsStreaming) {
            this.duration = duration;
            this.supportsStreaming = supportsStreaming;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1336673796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a Telegram Passport element to be saved.
     */
    public abstract static class InputPassportElement extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputPassportElementPersonalDetails.CONSTRUCTOR,
            InputPassportElementPassport.CONSTRUCTOR,
            InputPassportElementDriverLicense.CONSTRUCTOR,
            InputPassportElementIdentityCard.CONSTRUCTOR,
            InputPassportElementInternalPassport.CONSTRUCTOR,
            InputPassportElementAddress.CONSTRUCTOR,
            InputPassportElementUtilityBill.CONSTRUCTOR,
            InputPassportElementBankStatement.CONSTRUCTOR,
            InputPassportElementRentalAgreement.CONSTRUCTOR,
            InputPassportElementPassportRegistration.CONSTRUCTOR,
            InputPassportElementTemporaryRegistration.CONSTRUCTOR,
            InputPassportElementPhoneNumber.CONSTRUCTOR,
            InputPassportElementEmailAddress.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputPassportElement() {
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's personal details.
     */
    public static class InputPassportElementPersonalDetails extends InputPassportElement {
        /**
         * Personal details of the user.
         */
        public PersonalDetails personalDetails;

        /**
         * A Telegram Passport element to be saved containing the user's personal details.
         */
        public InputPassportElementPersonalDetails() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's personal details.
         *
         * @param personalDetails Personal details of the user.
         */
        public InputPassportElementPersonalDetails(PersonalDetails personalDetails) {
            this.personalDetails = personalDetails;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164791359;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's passport.
     */
    public static class InputPassportElementPassport extends InputPassportElement {
        /**
         * The passport to be saved.
         */
        public InputIdentityDocument passport;

        /**
         * A Telegram Passport element to be saved containing the user's passport.
         */
        public InputPassportElementPassport() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's passport.
         *
         * @param passport The passport to be saved.
         */
        public InputPassportElementPassport(InputIdentityDocument passport) {
            this.passport = passport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -497011356;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's driver license.
     */
    public static class InputPassportElementDriverLicense extends InputPassportElement {
        /**
         * The driver license to be saved.
         */
        public InputIdentityDocument driverLicense;

        /**
         * A Telegram Passport element to be saved containing the user's driver license.
         */
        public InputPassportElementDriverLicense() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's driver license.
         *
         * @param driverLicense The driver license to be saved.
         */
        public InputPassportElementDriverLicense(InputIdentityDocument driverLicense) {
            this.driverLicense = driverLicense;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 304813264;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's identity card.
     */
    public static class InputPassportElementIdentityCard extends InputPassportElement {
        /**
         * The identity card to be saved.
         */
        public InputIdentityDocument identityCard;

        /**
         * A Telegram Passport element to be saved containing the user's identity card.
         */
        public InputPassportElementIdentityCard() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's identity card.
         *
         * @param identityCard The identity card to be saved.
         */
        public InputPassportElementIdentityCard(InputIdentityDocument identityCard) {
            this.identityCard = identityCard;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -9963390;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's internal passport.
     */
    public static class InputPassportElementInternalPassport extends InputPassportElement {
        /**
         * The internal passport to be saved.
         */
        public InputIdentityDocument internalPassport;

        /**
         * A Telegram Passport element to be saved containing the user's internal passport.
         */
        public InputPassportElementInternalPassport() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's internal passport.
         *
         * @param internalPassport The internal passport to be saved.
         */
        public InputPassportElementInternalPassport(InputIdentityDocument internalPassport) {
            this.internalPassport = internalPassport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 715360043;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's address.
     */
    public static class InputPassportElementAddress extends InputPassportElement {
        /**
         * The address to be saved.
         */
        public Address address;

        /**
         * A Telegram Passport element to be saved containing the user's address.
         */
        public InputPassportElementAddress() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's address.
         *
         * @param address The address to be saved.
         */
        public InputPassportElementAddress(Address address) {
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 461630480;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's utility bill.
     */
    public static class InputPassportElementUtilityBill extends InputPassportElement {
        /**
         * The utility bill to be saved.
         */
        public InputPersonalDocument utilityBill;

        /**
         * A Telegram Passport element to be saved containing the user's utility bill.
         */
        public InputPassportElementUtilityBill() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's utility bill.
         *
         * @param utilityBill The utility bill to be saved.
         */
        public InputPassportElementUtilityBill(InputPersonalDocument utilityBill) {
            this.utilityBill = utilityBill;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1389203841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's bank statement.
     */
    public static class InputPassportElementBankStatement extends InputPassportElement {
        /**
         * The bank statement to be saved.
         */
        public InputPersonalDocument bankStatement;

        /**
         * A Telegram Passport element to be saved containing the user's bank statement.
         */
        public InputPassportElementBankStatement() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's bank statement.
         *
         * @param bankStatement The bank statement to be saved.
         */
        public InputPassportElementBankStatement(InputPersonalDocument bankStatement) {
            this.bankStatement = bankStatement;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -26585208;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's rental agreement.
     */
    public static class InputPassportElementRentalAgreement extends InputPassportElement {
        /**
         * The rental agreement to be saved.
         */
        public InputPersonalDocument rentalAgreement;

        /**
         * A Telegram Passport element to be saved containing the user's rental agreement.
         */
        public InputPassportElementRentalAgreement() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's rental agreement.
         *
         * @param rentalAgreement The rental agreement to be saved.
         */
        public InputPassportElementRentalAgreement(InputPersonalDocument rentalAgreement) {
            this.rentalAgreement = rentalAgreement;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1736154155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's passport registration.
     */
    public static class InputPassportElementPassportRegistration extends InputPassportElement {
        /**
         * The passport registration page to be saved.
         */
        public InputPersonalDocument passportRegistration;

        /**
         * A Telegram Passport element to be saved containing the user's passport registration.
         */
        public InputPassportElementPassportRegistration() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's passport registration.
         *
         * @param passportRegistration The passport registration page to be saved.
         */
        public InputPassportElementPassportRegistration(InputPersonalDocument passportRegistration) {
            this.passportRegistration = passportRegistration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1314562128;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's temporary registration.
     */
    public static class InputPassportElementTemporaryRegistration extends InputPassportElement {
        /**
         * The temporary registration document to be saved.
         */
        public InputPersonalDocument temporaryRegistration;

        /**
         * A Telegram Passport element to be saved containing the user's temporary registration.
         */
        public InputPassportElementTemporaryRegistration() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's temporary registration.
         *
         * @param temporaryRegistration The temporary registration document to be saved.
         */
        public InputPassportElementTemporaryRegistration(InputPersonalDocument temporaryRegistration) {
            this.temporaryRegistration = temporaryRegistration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1913238047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's phone number.
     */
    public static class InputPassportElementPhoneNumber extends InputPassportElement {
        /**
         * The phone number to be saved.
         */
        public String phoneNumber;

        /**
         * A Telegram Passport element to be saved containing the user's phone number.
         */
        public InputPassportElementPhoneNumber() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's phone number.
         *
         * @param phoneNumber The phone number to be saved.
         */
        public InputPassportElementPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1319357497;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's email address.
     */
    public static class InputPassportElementEmailAddress extends InputPassportElement {
        /**
         * The email address to be saved.
         */
        public String emailAddress;

        /**
         * A Telegram Passport element to be saved containing the user's email address.
         */
        public InputPassportElementEmailAddress() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's email address.
         *
         * @param emailAddress The email address to be saved.
         */
        public InputPassportElementEmailAddress(String emailAddress) {
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -248605659;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the description of an error in a Telegram Passport element; for bots only.
     */
    public static class InputPassportElementError extends Object {
        /**
         * Type of Telegram Passport element that has the error.
         */
        public PassportElementType type;
        /**
         * Error message.
         */
        public String message;
        /**
         * Error source.
         */
        public InputPassportElementErrorSource source;

        /**
         * Contains the description of an error in a Telegram Passport element; for bots only.
         */
        public InputPassportElementError() {
        }

        /**
         * Contains the description of an error in a Telegram Passport element; for bots only.
         *
         * @param type Type of Telegram Passport element that has the error.
         * @param message Error message.
         * @param source Error source.
         */
        public InputPassportElementError(PassportElementType type, String message, InputPassportElementErrorSource source) {
            this.type = type;
            this.message = message;
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 285756898;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the description of an error in a Telegram Passport element; for bots only.
     */
    public abstract static class InputPassportElementErrorSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputPassportElementErrorSourceUnspecified.CONSTRUCTOR,
            InputPassportElementErrorSourceDataField.CONSTRUCTOR,
            InputPassportElementErrorSourceFrontSide.CONSTRUCTOR,
            InputPassportElementErrorSourceReverseSide.CONSTRUCTOR,
            InputPassportElementErrorSourceSelfie.CONSTRUCTOR,
            InputPassportElementErrorSourceTranslationFile.CONSTRUCTOR,
            InputPassportElementErrorSourceTranslationFiles.CONSTRUCTOR,
            InputPassportElementErrorSourceFile.CONSTRUCTOR,
            InputPassportElementErrorSourceFiles.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputPassportElementErrorSource() {
        }
    }

    /**
     * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
     */
    public static class InputPassportElementErrorSourceUnspecified extends InputPassportElementErrorSource {
        /**
         * Current hash of the entire element.
         */
        public byte[] elementHash;

        /**
         * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
         */
        public InputPassportElementErrorSourceUnspecified() {
        }

        /**
         * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
         *
         * @param elementHash Current hash of the entire element.
         */
        public InputPassportElementErrorSourceUnspecified(byte[] elementHash) {
            this.elementHash = elementHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 267230319;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A data field contains an error. The error is considered resolved when the field's value changes.
     */
    public static class InputPassportElementErrorSourceDataField extends InputPassportElementErrorSource {
        /**
         * Field name.
         */
        public String fieldName;
        /**
         * Current data hash.
         */
        public byte[] dataHash;

        /**
         * A data field contains an error. The error is considered resolved when the field's value changes.
         */
        public InputPassportElementErrorSourceDataField() {
        }

        /**
         * A data field contains an error. The error is considered resolved when the field's value changes.
         *
         * @param fieldName Field name.
         * @param dataHash Current data hash.
         */
        public InputPassportElementErrorSourceDataField(String fieldName, byte[] dataHash) {
            this.fieldName = fieldName;
            this.dataHash = dataHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -426795002;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The front side of the document contains an error. The error is considered resolved when the file with the front side of the document changes.
     */
    public static class InputPassportElementErrorSourceFrontSide extends InputPassportElementErrorSource {
        /**
         * Current hash of the file containing the front side.
         */
        public byte[] fileHash;

        /**
         * The front side of the document contains an error. The error is considered resolved when the file with the front side of the document changes.
         */
        public InputPassportElementErrorSourceFrontSide() {
        }

        /**
         * The front side of the document contains an error. The error is considered resolved when the file with the front side of the document changes.
         *
         * @param fileHash Current hash of the file containing the front side.
         */
        public InputPassportElementErrorSourceFrontSide(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 588023741;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The reverse side of the document contains an error. The error is considered resolved when the file with the reverse side of the document changes.
     */
    public static class InputPassportElementErrorSourceReverseSide extends InputPassportElementErrorSource {
        /**
         * Current hash of the file containing the reverse side.
         */
        public byte[] fileHash;

        /**
         * The reverse side of the document contains an error. The error is considered resolved when the file with the reverse side of the document changes.
         */
        public InputPassportElementErrorSourceReverseSide() {
        }

        /**
         * The reverse side of the document contains an error. The error is considered resolved when the file with the reverse side of the document changes.
         *
         * @param fileHash Current hash of the file containing the reverse side.
         */
        public InputPassportElementErrorSourceReverseSide(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 413072891;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The selfie contains an error. The error is considered resolved when the file with the selfie changes.
     */
    public static class InputPassportElementErrorSourceSelfie extends InputPassportElementErrorSource {
        /**
         * Current hash of the file containing the selfie.
         */
        public byte[] fileHash;

        /**
         * The selfie contains an error. The error is considered resolved when the file with the selfie changes.
         */
        public InputPassportElementErrorSourceSelfie() {
        }

        /**
         * The selfie contains an error. The error is considered resolved when the file with the selfie changes.
         *
         * @param fileHash Current hash of the file containing the selfie.
         */
        public InputPassportElementErrorSourceSelfie(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -773575528;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * One of the files containing the translation of the document contains an error. The error is considered resolved when the file with the translation changes.
     */
    public static class InputPassportElementErrorSourceTranslationFile extends InputPassportElementErrorSource {
        /**
         * Current hash of the file containing the translation.
         */
        public byte[] fileHash;

        /**
         * One of the files containing the translation of the document contains an error. The error is considered resolved when the file with the translation changes.
         */
        public InputPassportElementErrorSourceTranslationFile() {
        }

        /**
         * One of the files containing the translation of the document contains an error. The error is considered resolved when the file with the translation changes.
         *
         * @param fileHash Current hash of the file containing the translation.
         */
        public InputPassportElementErrorSourceTranslationFile(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 505842299;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The translation of the document contains an error. The error is considered resolved when the list of files changes.
     */
    public static class InputPassportElementErrorSourceTranslationFiles extends InputPassportElementErrorSource {
        /**
         * Current hashes of all files with the translation.
         */
        public byte[][] fileHashes;

        /**
         * The translation of the document contains an error. The error is considered resolved when the list of files changes.
         */
        public InputPassportElementErrorSourceTranslationFiles() {
        }

        /**
         * The translation of the document contains an error. The error is considered resolved when the list of files changes.
         *
         * @param fileHashes Current hashes of all files with the translation.
         */
        public InputPassportElementErrorSourceTranslationFiles(byte[][] fileHashes) {
            this.fileHashes = fileHashes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -527254048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file contains an error. The error is considered resolved when the file changes.
     */
    public static class InputPassportElementErrorSourceFile extends InputPassportElementErrorSource {
        /**
         * Current hash of the file which has the error.
         */
        public byte[] fileHash;

        /**
         * The file contains an error. The error is considered resolved when the file changes.
         */
        public InputPassportElementErrorSourceFile() {
        }

        /**
         * The file contains an error. The error is considered resolved when the file changes.
         *
         * @param fileHash Current hash of the file which has the error.
         */
        public InputPassportElementErrorSourceFile(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -298492469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of attached files contains an error. The error is considered resolved when the file list changes.
     */
    public static class InputPassportElementErrorSourceFiles extends InputPassportElementErrorSource {
        /**
         * Current hashes of all attached files.
         */
        public byte[][] fileHashes;

        /**
         * The list of attached files contains an error. The error is considered resolved when the file list changes.
         */
        public InputPassportElementErrorSourceFiles() {
        }

        /**
         * The list of attached files contains an error. The error is considered resolved when the file list changes.
         *
         * @param fileHashes Current hashes of all attached files.
         */
        public InputPassportElementErrorSourceFiles(byte[][] fileHashes) {
            this.fileHashes = fileHashes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2008541640;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A personal document to be saved to Telegram Passport.
     */
    public static class InputPersonalDocument extends Object {
        /**
         * List of files containing the pages of the document.
         */
        public InputFile[] files;
        /**
         * List of files containing a certified English translation of the document.
         */
        public InputFile[] translation;

        /**
         * A personal document to be saved to Telegram Passport.
         */
        public InputPersonalDocument() {
        }

        /**
         * A personal document to be saved to Telegram Passport.
         *
         * @param files List of files containing the pages of the document.
         * @param translation List of files containing a certified English translation of the document.
         */
        public InputPersonalDocument(InputFile[] files, InputFile[] translation) {
            this.files = files;
            this.translation = translation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1676966826;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker to be added to a sticker set.
     */
    public static class InputSticker extends Object {
        /**
         * File with the sticker; must fit in a 512x512 square. For WEBP stickers the file must be in WEBP or PNG format, which will be converted to WEBP server-side. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements.
         */
        public InputFile sticker;
        /**
         * Format of the sticker.
         */
        public StickerFormat format;
        /**
         * String with 1-20 emoji corresponding to the sticker.
         */
        public String emojis;
        /**
         * Position where the mask is placed; pass null if not specified.
         */
        public MaskPosition maskPosition;
        /**
         * List of up to 20 keywords with total length up to 64 characters, which can be used to find the sticker.
         */
        public String[] keywords;

        /**
         * A sticker to be added to a sticker set.
         */
        public InputSticker() {
        }

        /**
         * A sticker to be added to a sticker set.
         *
         * @param sticker File with the sticker; must fit in a 512x512 square. For WEBP stickers the file must be in WEBP or PNG format, which will be converted to WEBP server-side. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements.
         * @param format Format of the sticker.
         * @param emojis String with 1-20 emoji corresponding to the sticker.
         * @param maskPosition Position where the mask is placed; pass null if not specified.
         * @param keywords List of up to 20 keywords with total length up to 64 characters, which can be used to find the sticker.
         */
        public InputSticker(InputFile sticker, StickerFormat format, String emojis, MaskPosition maskPosition, String[] keywords) {
            this.sticker = sticker;
            this.format = format;
            this.emojis = emojis;
            this.maskPosition = maskPosition;
            this.keywords = keywords;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1589392402;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a clickable rectangle area on a story media to be added.
     */
    public static class InputStoryArea extends Object {
        /**
         * Position of the area.
         */
        public StoryAreaPosition position;
        /**
         * Type of the area.
         */
        public InputStoryAreaType type;

        /**
         * Describes a clickable rectangle area on a story media to be added.
         */
        public InputStoryArea() {
        }

        /**
         * Describes a clickable rectangle area on a story media to be added.
         *
         * @param position Position of the area.
         * @param type Type of the area.
         */
        public InputStoryArea(StoryAreaPosition position, InputStoryAreaType type) {
            this.position = position;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 122859135;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of clickable rectangle area on a story media to be added.
     */
    public abstract static class InputStoryAreaType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputStoryAreaTypeLocation.CONSTRUCTOR,
            InputStoryAreaTypeFoundVenue.CONSTRUCTOR,
            InputStoryAreaTypePreviousVenue.CONSTRUCTOR,
            InputStoryAreaTypeSuggestedReaction.CONSTRUCTOR,
            InputStoryAreaTypeMessage.CONSTRUCTOR,
            InputStoryAreaTypeLink.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputStoryAreaType() {
        }
    }

    /**
     * An area pointing to a location.
     */
    public static class InputStoryAreaTypeLocation extends InputStoryAreaType {
        /**
         * The location.
         */
        public Location location;
        /**
         * Address of the location; pass null if unknown.
         */
        public LocationAddress address;

        /**
         * An area pointing to a location.
         */
        public InputStoryAreaTypeLocation() {
        }

        /**
         * An area pointing to a location.
         *
         * @param location The location.
         * @param address Address of the location; pass null if unknown.
         */
        public InputStoryAreaTypeLocation(Location location, LocationAddress address) {
            this.location = location;
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1433714887;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a venue found by the bot getOption(&quot;venue_search_bot_username&quot;).
     */
    public static class InputStoryAreaTypeFoundVenue extends InputStoryAreaType {
        /**
         * Identifier of the inline query, used to found the venue.
         */
        public long queryId;
        /**
         * Identifier of the inline query result.
         */
        public String resultId;

        /**
         * An area pointing to a venue found by the bot getOption(&quot;venue_search_bot_username&quot;).
         */
        public InputStoryAreaTypeFoundVenue() {
        }

        /**
         * An area pointing to a venue found by the bot getOption(&quot;venue_search_bot_username&quot;).
         *
         * @param queryId Identifier of the inline query, used to found the venue.
         * @param resultId Identifier of the inline query result.
         */
        public InputStoryAreaTypeFoundVenue(long queryId, String resultId) {
            this.queryId = queryId;
            this.resultId = resultId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1395809130;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a venue already added to the story.
     */
    public static class InputStoryAreaTypePreviousVenue extends InputStoryAreaType {
        /**
         * Provider of the venue.
         */
        public String venueProvider;
        /**
         * Identifier of the venue in the provider database.
         */
        public String venueId;

        /**
         * An area pointing to a venue already added to the story.
         */
        public InputStoryAreaTypePreviousVenue() {
        }

        /**
         * An area pointing to a venue already added to the story.
         *
         * @param venueProvider Provider of the venue.
         * @param venueId Identifier of the venue in the provider database.
         */
        public InputStoryAreaTypePreviousVenue(String venueProvider, String venueId) {
            this.venueProvider = venueProvider;
            this.venueId = venueId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1846693388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a suggested reaction.
     */
    public static class InputStoryAreaTypeSuggestedReaction extends InputStoryAreaType {
        /**
         * Type of the reaction.
         */
        public ReactionType reactionType;
        /**
         * True, if reaction has a dark background.
         */
        public boolean isDark;
        /**
         * True, if reaction corner is flipped.
         */
        public boolean isFlipped;

        /**
         * An area pointing to a suggested reaction.
         */
        public InputStoryAreaTypeSuggestedReaction() {
        }

        /**
         * An area pointing to a suggested reaction.
         *
         * @param reactionType Type of the reaction.
         * @param isDark True, if reaction has a dark background.
         * @param isFlipped True, if reaction corner is flipped.
         */
        public InputStoryAreaTypeSuggestedReaction(ReactionType reactionType, boolean isDark, boolean isFlipped) {
            this.reactionType = reactionType;
            this.isDark = isDark;
            this.isFlipped = isFlipped;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2101826003;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a message.
     */
    public static class InputStoryAreaTypeMessage extends InputStoryAreaType {
        /**
         * Identifier of the chat with the message. Currently, the chat must be a supergroup or a channel chat.
         */
        public long chatId;
        /**
         * Identifier of the message. Only successfully sent non-scheduled messages can be specified.
         */
        public long messageId;

        /**
         * An area pointing to a message.
         */
        public InputStoryAreaTypeMessage() {
        }

        /**
         * An area pointing to a message.
         *
         * @param chatId Identifier of the chat with the message. Currently, the chat must be a supergroup or a channel chat.
         * @param messageId Identifier of the message. Only successfully sent non-scheduled messages can be specified.
         */
        public InputStoryAreaTypeMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -266607529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a HTTP or tg:// link.
     */
    public static class InputStoryAreaTypeLink extends InputStoryAreaType {
        /**
         * HTTP or tg:// URL to be opened when the area is clicked.
         */
        public String url;

        /**
         * An area pointing to a HTTP or tg:// link.
         */
        public InputStoryAreaTypeLink() {
        }

        /**
         * An area pointing to a HTTP or tg:// link.
         *
         * @param url HTTP or tg:// URL to be opened when the area is clicked.
         */
        public InputStoryAreaTypeLink(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1408441160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of story areas to be added.
     */
    public static class InputStoryAreas extends Object {
        /**
         * List of input story areas. Currently, a story can have up to 10 inputStoryAreaTypeLocation, inputStoryAreaTypeFoundVenue, and inputStoryAreaTypePreviousVenue areas, up to getOption(&quot;story_suggested_reaction_area_count_max&quot;) inputStoryAreaTypeSuggestedReaction areas, up to 1 inputStoryAreaTypeMessage area, and up to getOption(&quot;story_link_area_count_max&quot;) inputStoryAreaTypeLink areas if the current user is a Telegram Premium user.
         */
        public InputStoryArea[] areas;

        /**
         * Contains a list of story areas to be added.
         */
        public InputStoryAreas() {
        }

        /**
         * Contains a list of story areas to be added.
         *
         * @param areas List of input story areas. Currently, a story can have up to 10 inputStoryAreaTypeLocation, inputStoryAreaTypeFoundVenue, and inputStoryAreaTypePreviousVenue areas, up to getOption(&quot;story_suggested_reaction_area_count_max&quot;) inputStoryAreaTypeSuggestedReaction areas, up to 1 inputStoryAreaTypeMessage area, and up to getOption(&quot;story_link_area_count_max&quot;) inputStoryAreaTypeLink areas if the current user is a Telegram Premium user.
         */
        public InputStoryAreas(InputStoryArea[] areas) {
            this.areas = areas;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -883247088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * The content of a story to send.
     */
    public abstract static class InputStoryContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputStoryContentPhoto.CONSTRUCTOR,
            InputStoryContentVideo.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputStoryContent() {
        }
    }

    /**
     * A photo story.
     */
    public static class InputStoryContentPhoto extends InputStoryContent {
        /**
         * Photo to send. The photo must be at most 10 MB in size. The photo size must be 1080x1920.
         */
        public InputFile photo;
        /**
         * File identifiers of the stickers added to the photo, if applicable.
         */
        public int[] addedStickerFileIds;

        /**
         * A photo story.
         */
        public InputStoryContentPhoto() {
        }

        /**
         * A photo story.
         *
         * @param photo Photo to send. The photo must be at most 10 MB in size. The photo size must be 1080x1920.
         * @param addedStickerFileIds File identifiers of the stickers added to the photo, if applicable.
         */
        public InputStoryContentPhoto(InputFile photo, int[] addedStickerFileIds) {
            this.photo = photo;
            this.addedStickerFileIds = addedStickerFileIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -309196727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video story.
     */
    public static class InputStoryContentVideo extends InputStoryContent {
        /**
         * Video to be sent. The video size must be 720x1280. The video must be streamable and stored in MPEG4 format, after encoding with x265 codec and key frames added each second.
         */
        public InputFile video;
        /**
         * File identifiers of the stickers added to the video, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Precise duration of the video, in seconds; 0-60.
         */
        public double duration;
        /**
         * True, if the video has no sound.
         */
        public boolean isAnimation;

        /**
         * A video story.
         */
        public InputStoryContentVideo() {
        }

        /**
         * A video story.
         *
         * @param video Video to be sent. The video size must be 720x1280. The video must be streamable and stored in MPEG4 format, after encoding with x265 codec and key frames added each second.
         * @param addedStickerFileIds File identifiers of the stickers added to the video, if applicable.
         * @param duration Precise duration of the video, in seconds; 0-60.
         * @param isAnimation True, if the video has no sound.
         */
        public InputStoryContentVideo(InputFile video, int[] addedStickerFileIds, double duration, boolean isAnimation) {
            this.video = video;
            this.addedStickerFileIds = addedStickerFileIds;
            this.duration = duration;
            this.isAnimation = isAnimation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -738542773;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes manually chosen quote from another message.
     */
    public static class InputTextQuote extends Object {
        /**
         * Text of the quote; 0-getOption(&quot;message_reply_quote_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, and CustomEmoji entities are allowed to be kept and must be kept in the quote.
         */
        public FormattedText text;
        /**
         * Quote position in the original message in UTF-16 code units.
         */
        public int position;

        /**
         * Describes manually chosen quote from another message.
         */
        public InputTextQuote() {
        }

        /**
         * Describes manually chosen quote from another message.
         *
         * @param text Text of the quote; 0-getOption(&quot;message_reply_quote_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, and CustomEmoji entities are allowed to be kept and must be kept in the quote.
         * @param position Quote position in the original message in UTF-16 code units.
         */
        public InputTextQuote(FormattedText text, int position) {
            this.text = text;
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1219859172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A thumbnail to be sent along with a file; must be in JPEG or WEBP format for stickers, and less than 200 KB in size.
     */
    public static class InputThumbnail extends Object {
        /**
         * Thumbnail file to send. Sending thumbnails by fileId is currently not supported.
         */
        public InputFile thumbnail;
        /**
         * Thumbnail width, usually shouldn't exceed 320. Use 0 if unknown.
         */
        public int width;
        /**
         * Thumbnail height, usually shouldn't exceed 320. Use 0 if unknown.
         */
        public int height;

        /**
         * A thumbnail to be sent along with a file; must be in JPEG or WEBP format for stickers, and less than 200 KB in size.
         */
        public InputThumbnail() {
        }

        /**
         * A thumbnail to be sent along with a file; must be in JPEG or WEBP format for stickers, and less than 200 KB in size.
         *
         * @param thumbnail Thumbnail file to send. Sending thumbnails by fileId is currently not supported.
         * @param width Thumbnail width, usually shouldn't exceed 320. Use 0 if unknown.
         * @param height Thumbnail height, usually shouldn't exceed 320. Use 0 if unknown.
         */
        public InputThumbnail(InputFile thumbnail, int width, int height) {
            this.thumbnail = thumbnail;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1582387236;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes an internal https://t.me or tg: link, which must be processed by the application in a special way.
     */
    public abstract static class InternalLinkType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InternalLinkTypeActiveSessions.CONSTRUCTOR,
            InternalLinkTypeAttachmentMenuBot.CONSTRUCTOR,
            InternalLinkTypeAuthenticationCode.CONSTRUCTOR,
            InternalLinkTypeBackground.CONSTRUCTOR,
            InternalLinkTypeBotAddToChannel.CONSTRUCTOR,
            InternalLinkTypeBotStart.CONSTRUCTOR,
            InternalLinkTypeBotStartInGroup.CONSTRUCTOR,
            InternalLinkTypeBusinessChat.CONSTRUCTOR,
            InternalLinkTypeChangePhoneNumber.CONSTRUCTOR,
            InternalLinkTypeChatBoost.CONSTRUCTOR,
            InternalLinkTypeChatFolderInvite.CONSTRUCTOR,
            InternalLinkTypeChatFolderSettings.CONSTRUCTOR,
            InternalLinkTypeChatInvite.CONSTRUCTOR,
            InternalLinkTypeDefaultMessageAutoDeleteTimerSettings.CONSTRUCTOR,
            InternalLinkTypeEditProfileSettings.CONSTRUCTOR,
            InternalLinkTypeGame.CONSTRUCTOR,
            InternalLinkTypeInstantView.CONSTRUCTOR,
            InternalLinkTypeInvoice.CONSTRUCTOR,
            InternalLinkTypeLanguagePack.CONSTRUCTOR,
            InternalLinkTypeLanguageSettings.CONSTRUCTOR,
            InternalLinkTypeMessage.CONSTRUCTOR,
            InternalLinkTypeMessageDraft.CONSTRUCTOR,
            InternalLinkTypePassportDataRequest.CONSTRUCTOR,
            InternalLinkTypePhoneNumberConfirmation.CONSTRUCTOR,
            InternalLinkTypePremiumFeatures.CONSTRUCTOR,
            InternalLinkTypePremiumGift.CONSTRUCTOR,
            InternalLinkTypePremiumGiftCode.CONSTRUCTOR,
            InternalLinkTypePrivacyAndSecuritySettings.CONSTRUCTOR,
            InternalLinkTypeProxy.CONSTRUCTOR,
            InternalLinkTypePublicChat.CONSTRUCTOR,
            InternalLinkTypeQrCodeAuthentication.CONSTRUCTOR,
            InternalLinkTypeRestorePurchases.CONSTRUCTOR,
            InternalLinkTypeSettings.CONSTRUCTOR,
            InternalLinkTypeSideMenuBot.CONSTRUCTOR,
            InternalLinkTypeStickerSet.CONSTRUCTOR,
            InternalLinkTypeStory.CONSTRUCTOR,
            InternalLinkTypeTheme.CONSTRUCTOR,
            InternalLinkTypeThemeSettings.CONSTRUCTOR,
            InternalLinkTypeUnknownDeepLink.CONSTRUCTOR,
            InternalLinkTypeUnsupportedProxy.CONSTRUCTOR,
            InternalLinkTypeUserPhoneNumber.CONSTRUCTOR,
            InternalLinkTypeUserToken.CONSTRUCTOR,
            InternalLinkTypeVideoChat.CONSTRUCTOR,
            InternalLinkTypeWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InternalLinkType() {
        }
    }

    /**
     * The link is a link to the Devices section of the application. Use getActiveSessions to get the list of active sessions and show them to the user.
     */
    public static class InternalLinkTypeActiveSessions extends InternalLinkType {

        /**
         * The link is a link to the Devices section of the application. Use getActiveSessions to get the list of active sessions and show them to the user.
         */
        public InternalLinkTypeActiveSessions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1886108589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an attachment menu bot to be opened in the specified or a chosen chat. Process given targetChat to open the chat. Then, call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to attachment menu, then show a disclaimer about Mini Apps being a third-party apps, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the attachment menu bot can't be used in the opened chat, show an error to the user. If the bot is added to attachment menu and can be used in the chat, then use openWebApp with the given URL.
     */
    public static class InternalLinkTypeAttachmentMenuBot extends InternalLinkType {
        /**
         * Target chat to be opened.
         */
        public TargetChat targetChat;
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * URL to be passed to openWebApp.
         */
        public String url;

        /**
         * The link is a link to an attachment menu bot to be opened in the specified or a chosen chat. Process given targetChat to open the chat. Then, call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to attachment menu, then show a disclaimer about Mini Apps being a third-party apps, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the attachment menu bot can't be used in the opened chat, show an error to the user. If the bot is added to attachment menu and can be used in the chat, then use openWebApp with the given URL.
         */
        public InternalLinkTypeAttachmentMenuBot() {
        }

        /**
         * The link is a link to an attachment menu bot to be opened in the specified or a chosen chat. Process given targetChat to open the chat. Then, call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to attachment menu, then show a disclaimer about Mini Apps being a third-party apps, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the attachment menu bot can't be used in the opened chat, show an error to the user. If the bot is added to attachment menu and can be used in the chat, then use openWebApp with the given URL.
         *
         * @param targetChat Target chat to be opened.
         * @param botUsername Username of the bot.
         * @param url URL to be passed to openWebApp.
         */
        public InternalLinkTypeAttachmentMenuBot(TargetChat targetChat, String botUsername, String url) {
            this.targetChat = targetChat;
            this.botUsername = botUsername;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1682719269;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link contains an authentication code. Call checkAuthenticationCode with the code if the current authorization state is authorizationStateWaitCode.
     */
    public static class InternalLinkTypeAuthenticationCode extends InternalLinkType {
        /**
         * The authentication code.
         */
        public String code;

        /**
         * The link contains an authentication code. Call checkAuthenticationCode with the code if the current authorization state is authorizationStateWaitCode.
         */
        public InternalLinkTypeAuthenticationCode() {
        }

        /**
         * The link contains an authentication code. Call checkAuthenticationCode with the code if the current authorization state is authorizationStateWaitCode.
         *
         * @param code The authentication code.
         */
        public InternalLinkTypeAuthenticationCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -209235982;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a background. Call searchBackground with the given background name to process the link If background is found and the user wants to apply it, then call setDefaultBackground.
     */
    public static class InternalLinkTypeBackground extends InternalLinkType {
        /**
         * Name of the background.
         */
        public String backgroundName;

        /**
         * The link is a link to a background. Call searchBackground with the given background name to process the link If background is found and the user wants to apply it, then call setDefaultBackground.
         */
        public InternalLinkTypeBackground() {
        }

        /**
         * The link is a link to a background. Call searchBackground with the given background name to process the link If background is found and the user wants to apply it, then call setDefaultBackground.
         *
         * @param backgroundName Name of the background.
         */
        public InternalLinkTypeBackground(String backgroundName) {
            this.backgroundName = backgroundName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 185411848;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Telegram bot, which is supposed to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot, ask the current user to select a channel chat to add the bot to as an administrator. Then, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights and combine received rights with the requested administrator rights. Then, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed rights.
     */
    public static class InternalLinkTypeBotAddToChannel extends InternalLinkType {
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * Expected administrator rights for the bot.
         */
        public ChatAdministratorRights administratorRights;

        /**
         * The link is a link to a Telegram bot, which is supposed to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot, ask the current user to select a channel chat to add the bot to as an administrator. Then, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights and combine received rights with the requested administrator rights. Then, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed rights.
         */
        public InternalLinkTypeBotAddToChannel() {
        }

        /**
         * The link is a link to a Telegram bot, which is supposed to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot, ask the current user to select a channel chat to add the bot to as an administrator. Then, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights and combine received rights with the requested administrator rights. Then, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed rights.
         *
         * @param botUsername Username of the bot.
         * @param administratorRights Expected administrator rights for the bot.
         */
        public InternalLinkTypeBotAddToChannel(String botUsername, ChatAdministratorRights administratorRights) {
            this.botUsername = botUsername;
            this.administratorRights = administratorRights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1401602752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a chat with a Telegram bot. Call searchPublicChat with the given bot username, check that the user is a bot, show START button in the chat with the bot, and then call sendBotStartMessage with the given start parameter after the button is pressed.
     */
    public static class InternalLinkTypeBotStart extends InternalLinkType {
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * The parameter to be passed to sendBotStartMessage.
         */
        public String startParameter;
        /**
         * True, if sendBotStartMessage must be called automatically without showing the START button.
         */
        public boolean autostart;

        /**
         * The link is a link to a chat with a Telegram bot. Call searchPublicChat with the given bot username, check that the user is a bot, show START button in the chat with the bot, and then call sendBotStartMessage with the given start parameter after the button is pressed.
         */
        public InternalLinkTypeBotStart() {
        }

        /**
         * The link is a link to a chat with a Telegram bot. Call searchPublicChat with the given bot username, check that the user is a bot, show START button in the chat with the bot, and then call sendBotStartMessage with the given start parameter after the button is pressed.
         *
         * @param botUsername Username of the bot.
         * @param startParameter The parameter to be passed to sendBotStartMessage.
         * @param autostart True, if sendBotStartMessage must be called automatically without showing the START button.
         */
        public InternalLinkTypeBotStart(String botUsername, String startParameter, boolean autostart) {
            this.botUsername = botUsername;
            this.startParameter = startParameter;
            this.autostart = autostart;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1066950637;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Telegram bot, which is supposed to be added to a group chat. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to groups, ask the current user to select a basic group or a supergroup chat to add the bot to, taking into account that bots can be added to a public supergroup only by administrators of the supergroup. If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat. Then, if startParameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat; otherwise, just send /start message with bot's username added to the chat.
     */
    public static class InternalLinkTypeBotStartInGroup extends InternalLinkType {
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * The parameter to be passed to sendBotStartMessage.
         */
        public String startParameter;
        /**
         * Expected administrator rights for the bot; may be null.
         */
        @Nullable public ChatAdministratorRights administratorRights;

        /**
         * The link is a link to a Telegram bot, which is supposed to be added to a group chat. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to groups, ask the current user to select a basic group or a supergroup chat to add the bot to, taking into account that bots can be added to a public supergroup only by administrators of the supergroup. If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat. Then, if startParameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat; otherwise, just send /start message with bot's username added to the chat.
         */
        public InternalLinkTypeBotStartInGroup() {
        }

        /**
         * The link is a link to a Telegram bot, which is supposed to be added to a group chat. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to groups, ask the current user to select a basic group or a supergroup chat to add the bot to, taking into account that bots can be added to a public supergroup only by administrators of the supergroup. If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat. Then, if startParameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat; otherwise, just send /start message with bot's username added to the chat.
         *
         * @param botUsername Username of the bot.
         * @param startParameter The parameter to be passed to sendBotStartMessage.
         * @param administratorRights Expected administrator rights for the bot; may be null.
         */
        public InternalLinkTypeBotStartInGroup(String botUsername, String startParameter, ChatAdministratorRights administratorRights) {
            this.botUsername = botUsername;
            this.startParameter = startParameter;
            this.administratorRights = administratorRights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -905081650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a business chat. Use getBusinessChatLinkInfo with the provided link name to get information about the link, then open received private chat and replace chat draft with the provided text.
     */
    public static class InternalLinkTypeBusinessChat extends InternalLinkType {
        /**
         * Name of the link.
         */
        public String linkName;

        /**
         * The link is a link to a business chat. Use getBusinessChatLinkInfo with the provided link name to get information about the link, then open received private chat and replace chat draft with the provided text.
         */
        public InternalLinkTypeBusinessChat() {
        }

        /**
         * The link is a link to a business chat. Use getBusinessChatLinkInfo with the provided link name to get information about the link, then open received private chat and replace chat draft with the provided text.
         *
         * @param linkName Name of the link.
         */
        public InternalLinkTypeBusinessChat(String linkName) {
            this.linkName = linkName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1606751785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the change phone number section of the app.
     */
    public static class InternalLinkTypeChangePhoneNumber extends InternalLinkType {

        /**
         * The link is a link to the change phone number section of the app.
         */
        public InternalLinkTypeChangePhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -265856255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to boost a Telegram chat. Call getChatBoostLinkInfo with the given URL to process the link. If the chat is found, then call getChatBoostStatus and getAvailableChatBoostSlots to get the current boost status and check whether the chat can be boosted. If the user wants to boost the chat and the chat can be boosted, then call boostChat.
     */
    public static class InternalLinkTypeChatBoost extends InternalLinkType {
        /**
         * URL to be passed to getChatBoostLinkInfo.
         */
        public String url;

        /**
         * The link is a link to boost a Telegram chat. Call getChatBoostLinkInfo with the given URL to process the link. If the chat is found, then call getChatBoostStatus and getAvailableChatBoostSlots to get the current boost status and check whether the chat can be boosted. If the user wants to boost the chat and the chat can be boosted, then call boostChat.
         */
        public InternalLinkTypeChatBoost() {
        }

        /**
         * The link is a link to boost a Telegram chat. Call getChatBoostLinkInfo with the given URL to process the link. If the chat is found, then call getChatBoostStatus and getAvailableChatBoostSlots to get the current boost status and check whether the chat can be boosted. If the user wants to boost the chat and the chat can be boosted, then call boostChat.
         *
         * @param url URL to be passed to getChatBoostLinkInfo.
         */
        public InternalLinkTypeChatBoost(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -716571328;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an invite link to a chat folder. Call checkChatFolderInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat folder, then call addChatFolderByInviteLink.
     */
    public static class InternalLinkTypeChatFolderInvite extends InternalLinkType {
        /**
         * Internal representation of the invite link.
         */
        public String inviteLink;

        /**
         * The link is an invite link to a chat folder. Call checkChatFolderInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat folder, then call addChatFolderByInviteLink.
         */
        public InternalLinkTypeChatFolderInvite() {
        }

        /**
         * The link is an invite link to a chat folder. Call checkChatFolderInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat folder, then call addChatFolderByInviteLink.
         *
         * @param inviteLink Internal representation of the invite link.
         */
        public InternalLinkTypeChatFolderInvite(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1984804546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the folder section of the app settings.
     */
    public static class InternalLinkTypeChatFolderSettings extends InternalLinkType {

        /**
         * The link is a link to the folder section of the app settings.
         */
        public InternalLinkTypeChatFolderSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1073805988;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a chat invite link. Call checkChatInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat, then call joinChatByInviteLink.
     */
    public static class InternalLinkTypeChatInvite extends InternalLinkType {
        /**
         * Internal representation of the invite link.
         */
        public String inviteLink;

        /**
         * The link is a chat invite link. Call checkChatInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat, then call joinChatByInviteLink.
         */
        public InternalLinkTypeChatInvite() {
        }

        /**
         * The link is a chat invite link. Call checkChatInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat, then call joinChatByInviteLink.
         *
         * @param inviteLink Internal representation of the invite link.
         */
        public InternalLinkTypeChatInvite(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 428621017;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the default message auto-delete timer settings section of the app settings.
     */
    public static class InternalLinkTypeDefaultMessageAutoDeleteTimerSettings extends InternalLinkType {

        /**
         * The link is a link to the default message auto-delete timer settings section of the app settings.
         */
        public InternalLinkTypeDefaultMessageAutoDeleteTimerSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 732625201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the edit profile section of the app settings.
     */
    public static class InternalLinkTypeEditProfileSettings extends InternalLinkType {

        /**
         * The link is a link to the edit profile section of the app settings.
         */
        public InternalLinkTypeEditProfileSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1022472090;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a game. Call searchPublicChat with the given bot username, check that the user is a bot, ask the current user to select a chat to send the game, and then call sendMessage with inputMessageGame.
     */
    public static class InternalLinkTypeGame extends InternalLinkType {
        /**
         * Username of the bot that owns the game.
         */
        public String botUsername;
        /**
         * Short name of the game.
         */
        public String gameShortName;

        /**
         * The link is a link to a game. Call searchPublicChat with the given bot username, check that the user is a bot, ask the current user to select a chat to send the game, and then call sendMessage with inputMessageGame.
         */
        public InternalLinkTypeGame() {
        }

        /**
         * The link is a link to a game. Call searchPublicChat with the given bot username, check that the user is a bot, ask the current user to select a chat to send the game, and then call sendMessage with inputMessageGame.
         *
         * @param botUsername Username of the bot that owns the game.
         * @param gameShortName Short name of the game.
         */
        public InternalLinkTypeGame(String botUsername, String gameShortName) {
            this.botUsername = botUsername;
            this.gameShortName = gameShortName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -260788787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link must be opened in an Instant View. Call getWebPageInstantView with the given URL to process the link. If Instant View is found, then show it, otherwise, open the fallback URL in an external browser.
     */
    public static class InternalLinkTypeInstantView extends InternalLinkType {
        /**
         * URL to be passed to getWebPageInstantView.
         */
        public String url;
        /**
         * An URL to open if getWebPageInstantView fails.
         */
        public String fallbackUrl;

        /**
         * The link must be opened in an Instant View. Call getWebPageInstantView with the given URL to process the link. If Instant View is found, then show it, otherwise, open the fallback URL in an external browser.
         */
        public InternalLinkTypeInstantView() {
        }

        /**
         * The link must be opened in an Instant View. Call getWebPageInstantView with the given URL to process the link. If Instant View is found, then show it, otherwise, open the fallback URL in an external browser.
         *
         * @param url URL to be passed to getWebPageInstantView.
         * @param fallbackUrl An URL to open if getWebPageInstantView fails.
         */
        public InternalLinkTypeInstantView(String url, String fallbackUrl) {
            this.url = url;
            this.fallbackUrl = fallbackUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1776607039;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an invoice. Call getPaymentForm with the given invoice name to process the link.
     */
    public static class InternalLinkTypeInvoice extends InternalLinkType {
        /**
         * Name of the invoice.
         */
        public String invoiceName;

        /**
         * The link is a link to an invoice. Call getPaymentForm with the given invoice name to process the link.
         */
        public InternalLinkTypeInvoice() {
        }

        /**
         * The link is a link to an invoice. Call getPaymentForm with the given invoice name to process the link.
         *
         * @param invoiceName Name of the invoice.
         */
        public InternalLinkTypeInvoice(String invoiceName) {
            this.invoiceName = invoiceName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -213094996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a language pack. Call getLanguagePackInfo with the given language pack identifier to process the link. If the language pack is found and the user wants to apply it, then call setOption for the option &quot;language_pack_id&quot;.
     */
    public static class InternalLinkTypeLanguagePack extends InternalLinkType {
        /**
         * Language pack identifier.
         */
        public String languagePackId;

        /**
         * The link is a link to a language pack. Call getLanguagePackInfo with the given language pack identifier to process the link. If the language pack is found and the user wants to apply it, then call setOption for the option &quot;language_pack_id&quot;.
         */
        public InternalLinkTypeLanguagePack() {
        }

        /**
         * The link is a link to a language pack. Call getLanguagePackInfo with the given language pack identifier to process the link. If the language pack is found and the user wants to apply it, then call setOption for the option &quot;language_pack_id&quot;.
         *
         * @param languagePackId Language pack identifier.
         */
        public InternalLinkTypeLanguagePack(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1450766996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the language section of the app settings.
     */
    public static class InternalLinkTypeLanguageSettings extends InternalLinkType {

        /**
         * The link is a link to the language section of the app settings.
         */
        public InternalLinkTypeLanguageSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1340479770;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Telegram message or a forum topic. Call getMessageLinkInfo with the given URL to process the link, and then open received forum topic or chat and show the message there.
     */
    public static class InternalLinkTypeMessage extends InternalLinkType {
        /**
         * URL to be passed to getMessageLinkInfo.
         */
        public String url;

        /**
         * The link is a link to a Telegram message or a forum topic. Call getMessageLinkInfo with the given URL to process the link, and then open received forum topic or chat and show the message there.
         */
        public InternalLinkTypeMessage() {
        }

        /**
         * The link is a link to a Telegram message or a forum topic. Call getMessageLinkInfo with the given URL to process the link, and then open received forum topic or chat and show the message there.
         *
         * @param url URL to be passed to getMessageLinkInfo.
         */
        public InternalLinkTypeMessage(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 978541650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link contains a message draft text. A share screen needs to be shown to the user, then the chosen chat must be opened and the text is added to the input field.
     */
    public static class InternalLinkTypeMessageDraft extends InternalLinkType {
        /**
         * Message draft text.
         */
        public FormattedText text;
        /**
         * True, if the first line of the text contains a link. If true, the input field needs to be focused and the text after the link must be selected.
         */
        public boolean containsLink;

        /**
         * The link contains a message draft text. A share screen needs to be shown to the user, then the chosen chat must be opened and the text is added to the input field.
         */
        public InternalLinkTypeMessageDraft() {
        }

        /**
         * The link contains a message draft text. A share screen needs to be shown to the user, then the chosen chat must be opened and the text is added to the input field.
         *
         * @param text Message draft text.
         * @param containsLink True, if the first line of the text contains a link. If true, the input field needs to be focused and the text after the link must be selected.
         */
        public InternalLinkTypeMessageDraft(FormattedText text, boolean containsLink) {
            this.text = text;
            this.containsLink = containsLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 661633749;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link contains a request of Telegram passport data. Call getPassportAuthorizationForm with the given parameters to process the link if the link was received from outside of the application; otherwise, ignore it.
     */
    public static class InternalLinkTypePassportDataRequest extends InternalLinkType {
        /**
         * User identifier of the service's bot; the corresponding user may be unknown yet.
         */
        public long botUserId;
        /**
         * Telegram Passport element types requested by the service.
         */
        public String scope;
        /**
         * Service's public key.
         */
        public String publicKey;
        /**
         * Unique request identifier provided by the service.
         */
        public String nonce;
        /**
         * An HTTP URL to open once the request is finished, canceled, or failed with the parameters tgPassport=success, tgPassport=cancel, or tgPassport=error&amp;error=... respectively. If empty, then onActivityResult method must be used to return response on Android, or the link tgbot{botUserId}://passport/success or tgbot{botUserId}://passport/cancel must be opened otherwise.
         */
        public String callbackUrl;

        /**
         * The link contains a request of Telegram passport data. Call getPassportAuthorizationForm with the given parameters to process the link if the link was received from outside of the application; otherwise, ignore it.
         */
        public InternalLinkTypePassportDataRequest() {
        }

        /**
         * The link contains a request of Telegram passport data. Call getPassportAuthorizationForm with the given parameters to process the link if the link was received from outside of the application; otherwise, ignore it.
         *
         * @param botUserId User identifier of the service's bot; the corresponding user may be unknown yet.
         * @param scope Telegram Passport element types requested by the service.
         * @param publicKey Service's public key.
         * @param nonce Unique request identifier provided by the service.
         * @param callbackUrl An HTTP URL to open once the request is finished, canceled, or failed with the parameters tgPassport=success, tgPassport=cancel, or tgPassport=error&amp;error=... respectively. If empty, then onActivityResult method must be used to return response on Android, or the link tgbot{botUserId}://passport/success or tgbot{botUserId}://passport/cancel must be opened otherwise.
         */
        public InternalLinkTypePassportDataRequest(long botUserId, String scope, String publicKey, String nonce, String callbackUrl) {
            this.botUserId = botUserId;
            this.scope = scope;
            this.publicKey = publicKey;
            this.nonce = nonce;
            this.callbackUrl = callbackUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -988819839;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link can be used to confirm ownership of a phone number to prevent account deletion. Call sendPhoneNumberCode with the given phone number and with phoneNumberCodeTypeConfirmOwnership with the given hash to process the link. If succeeded, call checkPhoneNumberCode to check entered by the user code, or resendPhoneNumberCode to resend it.
     */
    public static class InternalLinkTypePhoneNumberConfirmation extends InternalLinkType {
        /**
         * Hash value from the link.
         */
        public String hash;
        /**
         * Phone number value from the link.
         */
        public String phoneNumber;

        /**
         * The link can be used to confirm ownership of a phone number to prevent account deletion. Call sendPhoneNumberCode with the given phone number and with phoneNumberCodeTypeConfirmOwnership with the given hash to process the link. If succeeded, call checkPhoneNumberCode to check entered by the user code, or resendPhoneNumberCode to resend it.
         */
        public InternalLinkTypePhoneNumberConfirmation() {
        }

        /**
         * The link can be used to confirm ownership of a phone number to prevent account deletion. Call sendPhoneNumberCode with the given phone number and with phoneNumberCodeTypeConfirmOwnership with the given hash to process the link. If succeeded, call checkPhoneNumberCode to check entered by the user code, or resendPhoneNumberCode to resend it.
         *
         * @param hash Hash value from the link.
         * @param phoneNumber Phone number value from the link.
         */
        public InternalLinkTypePhoneNumberConfirmation(String hash, String phoneNumber) {
            this.hash = hash;
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1757375254;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the Premium features screen of the application from which the user can subscribe to Telegram Premium. Call getPremiumFeatures with the given referrer to process the link.
     */
    public static class InternalLinkTypePremiumFeatures extends InternalLinkType {
        /**
         * Referrer specified in the link.
         */
        public String referrer;

        /**
         * The link is a link to the Premium features screen of the application from which the user can subscribe to Telegram Premium. Call getPremiumFeatures with the given referrer to process the link.
         */
        public InternalLinkTypePremiumFeatures() {
        }

        /**
         * The link is a link to the Premium features screen of the application from which the user can subscribe to Telegram Premium. Call getPremiumFeatures with the given referrer to process the link.
         *
         * @param referrer Referrer specified in the link.
         */
        public InternalLinkTypePremiumFeatures(String referrer) {
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1216892745;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the screen for gifting Telegram Premium subscriptions to friends via inputInvoiceTelegram payments or in-store purchases.
     */
    public static class InternalLinkTypePremiumGift extends InternalLinkType {
        /**
         * Referrer specified in the link.
         */
        public String referrer;

        /**
         * The link is a link to the screen for gifting Telegram Premium subscriptions to friends via inputInvoiceTelegram payments or in-store purchases.
         */
        public InternalLinkTypePremiumGift() {
        }

        /**
         * The link is a link to the screen for gifting Telegram Premium subscriptions to friends via inputInvoiceTelegram payments or in-store purchases.
         *
         * @param referrer Referrer specified in the link.
         */
        public InternalLinkTypePremiumGift(String referrer) {
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1523936577;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link with a Telegram Premium gift code. Call checkPremiumGiftCode with the given code to process the link. If the code is valid and the user wants to apply it, then call applyPremiumGiftCode.
     */
    public static class InternalLinkTypePremiumGiftCode extends InternalLinkType {
        /**
         * The Telegram Premium gift code.
         */
        public String code;

        /**
         * The link is a link with a Telegram Premium gift code. Call checkPremiumGiftCode with the given code to process the link. If the code is valid and the user wants to apply it, then call applyPremiumGiftCode.
         */
        public InternalLinkTypePremiumGiftCode() {
        }

        /**
         * The link is a link with a Telegram Premium gift code. Call checkPremiumGiftCode with the given code to process the link. If the code is valid and the user wants to apply it, then call applyPremiumGiftCode.
         *
         * @param code The Telegram Premium gift code.
         */
        public InternalLinkTypePremiumGiftCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -564356974;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the privacy and security section of the app settings.
     */
    public static class InternalLinkTypePrivacyAndSecuritySettings extends InternalLinkType {

        /**
         * The link is a link to the privacy and security section of the app settings.
         */
        public InternalLinkTypePrivacyAndSecuritySettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1386255665;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a proxy. Call addProxy with the given parameters to process the link and add the proxy.
     */
    public static class InternalLinkTypeProxy extends InternalLinkType {
        /**
         * Proxy server domain or IP address.
         */
        public String server;
        /**
         * Proxy server port.
         */
        public int port;
        /**
         * Type of the proxy.
         */
        public ProxyType type;

        /**
         * The link is a link to a proxy. Call addProxy with the given parameters to process the link and add the proxy.
         */
        public InternalLinkTypeProxy() {
        }

        /**
         * The link is a link to a proxy. Call addProxy with the given parameters to process the link and add the proxy.
         *
         * @param server Proxy server domain or IP address.
         * @param port Proxy server port.
         * @param type Type of the proxy.
         */
        public InternalLinkTypeProxy(String server, int port, ProxyType type) {
            this.server = server;
            this.port = port;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1313788694;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a chat by its username. Call searchPublicChat with the given chat username to process the link If the chat is found, open its profile information screen or the chat itself. If draft text isn't empty and the chat is a private chat with a regular user, then put the draft text in the input field.
     */
    public static class InternalLinkTypePublicChat extends InternalLinkType {
        /**
         * Username of the chat.
         */
        public String chatUsername;
        /**
         * Draft text for message to send in the chat.
         */
        public String draftText;

        /**
         * The link is a link to a chat by its username. Call searchPublicChat with the given chat username to process the link If the chat is found, open its profile information screen or the chat itself. If draft text isn't empty and the chat is a private chat with a regular user, then put the draft text in the input field.
         */
        public InternalLinkTypePublicChat() {
        }

        /**
         * The link is a link to a chat by its username. Call searchPublicChat with the given chat username to process the link If the chat is found, open its profile information screen or the chat itself. If draft text isn't empty and the chat is a private chat with a regular user, then put the draft text in the input field.
         *
         * @param chatUsername Username of the chat.
         * @param draftText Draft text for message to send in the chat.
         */
        public InternalLinkTypePublicChat(String chatUsername, String draftText) {
            this.chatUsername = chatUsername;
            this.draftText = draftText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -450728610;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link can be used to login the current user on another device, but it must be scanned from QR-code using in-app camera. An alert similar to &quot;This code can be used to allow someone to log in to your Telegram account. To confirm Telegram login, please go to Settings &gt; Devices &gt; Scan QR and scan the code&quot; needs to be shown.
     */
    public static class InternalLinkTypeQrCodeAuthentication extends InternalLinkType {

        /**
         * The link can be used to login the current user on another device, but it must be scanned from QR-code using in-app camera. An alert similar to &quot;This code can be used to allow someone to log in to your Telegram account. To confirm Telegram login, please go to Settings &gt; Devices &gt; Scan QR and scan the code&quot; needs to be shown.
         */
        public InternalLinkTypeQrCodeAuthentication() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1089332956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link forces restore of App Store purchases when opened. For official iOS application only.
     */
    public static class InternalLinkTypeRestorePurchases extends InternalLinkType {

        /**
         * The link forces restore of App Store purchases when opened. For official iOS application only.
         */
        public InternalLinkTypeRestorePurchases() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 606090371;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to application settings.
     */
    public static class InternalLinkTypeSettings extends InternalLinkType {

        /**
         * The link is a link to application settings.
         */
        public InternalLinkTypeSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 393561524;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a bot, which can be installed to the side menu. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to side menu, then show a disclaimer about Mini Apps being a third-party apps, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the bot is added to side menu, then use getWebAppUrl with the given URL and open the returned URL as a Web App.
     */
    public static class InternalLinkTypeSideMenuBot extends InternalLinkType {
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * URL to be passed to getWebAppUrl.
         */
        public String url;
        /**
         * True, if the Web App must be opened in a compact mode instead of a full-size mode.
         */
        public boolean isCompact;

        /**
         * The link is a link to a bot, which can be installed to the side menu. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to side menu, then show a disclaimer about Mini Apps being a third-party apps, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the bot is added to side menu, then use getWebAppUrl with the given URL and open the returned URL as a Web App.
         */
        public InternalLinkTypeSideMenuBot() {
        }

        /**
         * The link is a link to a bot, which can be installed to the side menu. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to side menu, then show a disclaimer about Mini Apps being a third-party apps, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the bot is added to side menu, then use getWebAppUrl with the given URL and open the returned URL as a Web App.
         *
         * @param botUsername Username of the bot.
         * @param url URL to be passed to getWebAppUrl.
         * @param isCompact True, if the Web App must be opened in a compact mode instead of a full-size mode.
         */
        public InternalLinkTypeSideMenuBot(String botUsername, String url, boolean isCompact) {
            this.botUsername = botUsername;
            this.url = url;
            this.isCompact = isCompact;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1000403946;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a sticker set. Call searchStickerSet with the given sticker set name to process the link and show the sticker set. If the sticker set is found and the user wants to add it, then call changeStickerSet.
     */
    public static class InternalLinkTypeStickerSet extends InternalLinkType {
        /**
         * Name of the sticker set.
         */
        public String stickerSetName;
        /**
         * True, if the sticker set is expected to contain custom emoji.
         */
        public boolean expectCustomEmoji;

        /**
         * The link is a link to a sticker set. Call searchStickerSet with the given sticker set name to process the link and show the sticker set. If the sticker set is found and the user wants to add it, then call changeStickerSet.
         */
        public InternalLinkTypeStickerSet() {
        }

        /**
         * The link is a link to a sticker set. Call searchStickerSet with the given sticker set name to process the link and show the sticker set. If the sticker set is found and the user wants to add it, then call changeStickerSet.
         *
         * @param stickerSetName Name of the sticker set.
         * @param expectCustomEmoji True, if the sticker set is expected to contain custom emoji.
         */
        public InternalLinkTypeStickerSet(String stickerSetName, boolean expectCustomEmoji) {
            this.stickerSetName = stickerSetName;
            this.expectCustomEmoji = expectCustomEmoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1589227614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a story. Call searchPublicChat with the given sender username, then call getStory with the received chat identifier and the given story identifier, then show the story if received.
     */
    public static class InternalLinkTypeStory extends InternalLinkType {
        /**
         * Username of the sender of the story.
         */
        public String storySenderUsername;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * The link is a link to a story. Call searchPublicChat with the given sender username, then call getStory with the received chat identifier and the given story identifier, then show the story if received.
         */
        public InternalLinkTypeStory() {
        }

        /**
         * The link is a link to a story. Call searchPublicChat with the given sender username, then call getStory with the received chat identifier and the given story identifier, then show the story if received.
         *
         * @param storySenderUsername Username of the sender of the story.
         * @param storyId Story identifier.
         */
        public InternalLinkTypeStory(String storySenderUsername, int storyId) {
            this.storySenderUsername = storySenderUsername;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1471997511;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a cloud theme. TDLib has no theme support yet.
     */
    public static class InternalLinkTypeTheme extends InternalLinkType {
        /**
         * Name of the theme.
         */
        public String themeName;

        /**
         * The link is a link to a cloud theme. TDLib has no theme support yet.
         */
        public InternalLinkTypeTheme() {
        }

        /**
         * The link is a link to a cloud theme. TDLib has no theme support yet.
         *
         * @param themeName Name of the theme.
         */
        public InternalLinkTypeTheme(String themeName) {
            this.themeName = themeName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -200935417;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the theme section of the app settings.
     */
    public static class InternalLinkTypeThemeSettings extends InternalLinkType {

        /**
         * The link is a link to the theme section of the app settings.
         */
        public InternalLinkTypeThemeSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1051903722;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an unknown tg: link. Call getDeepLinkInfo to process the link.
     */
    public static class InternalLinkTypeUnknownDeepLink extends InternalLinkType {
        /**
         * Link to be passed to getDeepLinkInfo.
         */
        public String link;

        /**
         * The link is an unknown tg: link. Call getDeepLinkInfo to process the link.
         */
        public InternalLinkTypeUnknownDeepLink() {
        }

        /**
         * The link is an unknown tg: link. Call getDeepLinkInfo to process the link.
         *
         * @param link Link to be passed to getDeepLinkInfo.
         */
        public InternalLinkTypeUnknownDeepLink(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 625596379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an unsupported proxy. An alert can be shown to the user.
     */
    public static class InternalLinkTypeUnsupportedProxy extends InternalLinkType {

        /**
         * The link is a link to an unsupported proxy. An alert can be shown to the user.
         */
        public InternalLinkTypeUnsupportedProxy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -566649079;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a user by its phone number. Call searchUserByPhoneNumber with the given phone number to process the link. If the user is found, then call createPrivateChat and open the chat. If draft text isn't empty, then put the draft text in the input field.
     */
    public static class InternalLinkTypeUserPhoneNumber extends InternalLinkType {
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * Draft text for message to send in the chat.
         */
        public String draftText;

        /**
         * The link is a link to a user by its phone number. Call searchUserByPhoneNumber with the given phone number to process the link. If the user is found, then call createPrivateChat and open the chat. If draft text isn't empty, then put the draft text in the input field.
         */
        public InternalLinkTypeUserPhoneNumber() {
        }

        /**
         * The link is a link to a user by its phone number. Call searchUserByPhoneNumber with the given phone number to process the link. If the user is found, then call createPrivateChat and open the chat. If draft text isn't empty, then put the draft text in the input field.
         *
         * @param phoneNumber Phone number of the user.
         * @param draftText Draft text for message to send in the chat.
         */
        public InternalLinkTypeUserPhoneNumber(String phoneNumber, String draftText) {
            this.phoneNumber = phoneNumber;
            this.draftText = draftText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2009104529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a user by a temporary token. Call searchUserByToken with the given token to process the link. If the user is found, then call createPrivateChat and open the chat.
     */
    public static class InternalLinkTypeUserToken extends InternalLinkType {
        /**
         * The token.
         */
        public String token;

        /**
         * The link is a link to a user by a temporary token. Call searchUserByToken with the given token to process the link. If the user is found, then call createPrivateChat and open the chat.
         */
        public InternalLinkTypeUserToken() {
        }

        /**
         * The link is a link to a user by a temporary token. Call searchUserByToken with the given token to process the link. If the user is found, then call createPrivateChat and open the chat.
         *
         * @param token The token.
         */
        public InternalLinkTypeUserToken(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1462248615;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video chat. Call searchPublicChat with the given chat username, and then joinGroupCall with the given invite hash to process the link.
     */
    public static class InternalLinkTypeVideoChat extends InternalLinkType {
        /**
         * Username of the chat with the video chat.
         */
        public String chatUsername;
        /**
         * If non-empty, invite hash to be used to join the video chat without being muted by administrators.
         */
        public String inviteHash;
        /**
         * True, if the video chat is expected to be a live stream in a channel or a broadcast group.
         */
        public boolean isLiveStream;

        /**
         * The link is a link to a video chat. Call searchPublicChat with the given chat username, and then joinGroupCall with the given invite hash to process the link.
         */
        public InternalLinkTypeVideoChat() {
        }

        /**
         * The link is a link to a video chat. Call searchPublicChat with the given chat username, and then joinGroupCall with the given invite hash to process the link.
         *
         * @param chatUsername Username of the chat with the video chat.
         * @param inviteHash If non-empty, invite hash to be used to join the video chat without being muted by administrators.
         * @param isLiveStream True, if the video chat is expected to be a live stream in a channel or a broadcast group.
         */
        public InternalLinkTypeVideoChat(String chatUsername, String inviteHash, boolean isLiveStream) {
            this.chatUsername = chatUsername;
            this.inviteHash = inviteHash;
            this.isLiveStream = isLiveStream;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2020149068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Web App. Call searchPublicChat with the given bot username, check that the user is a bot, then call searchWebApp with the received bot and the given webAppShortName. Process received foundWebApp by showing a confirmation dialog if needed. If the bot can be added to attachment or side menu, but isn't added yet, then show a disclaimer about Mini Apps being a third-party apps instead of the dialog and ask the user to accept their Terms of service. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. Then, call getWebAppLinkUrl and open the returned URL as a Web App.
     */
    public static class InternalLinkTypeWebApp extends InternalLinkType {
        /**
         * Username of the bot that owns the Web App.
         */
        public String botUsername;
        /**
         * Short name of the Web App.
         */
        public String webAppShortName;
        /**
         * Start parameter to be passed to getWebAppLinkUrl.
         */
        public String startParameter;
        /**
         * True, if the Web App must be opened in a compact mode instead of a full-size mode.
         */
        public boolean isCompact;

        /**
         * The link is a link to a Web App. Call searchPublicChat with the given bot username, check that the user is a bot, then call searchWebApp with the received bot and the given webAppShortName. Process received foundWebApp by showing a confirmation dialog if needed. If the bot can be added to attachment or side menu, but isn't added yet, then show a disclaimer about Mini Apps being a third-party apps instead of the dialog and ask the user to accept their Terms of service. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. Then, call getWebAppLinkUrl and open the returned URL as a Web App.
         */
        public InternalLinkTypeWebApp() {
        }

        /**
         * The link is a link to a Web App. Call searchPublicChat with the given bot username, check that the user is a bot, then call searchWebApp with the received bot and the given webAppShortName. Process received foundWebApp by showing a confirmation dialog if needed. If the bot can be added to attachment or side menu, but isn't added yet, then show a disclaimer about Mini Apps being a third-party apps instead of the dialog and ask the user to accept their Terms of service. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. Then, call getWebAppLinkUrl and open the returned URL as a Web App.
         *
         * @param botUsername Username of the bot that owns the Web App.
         * @param webAppShortName Short name of the Web App.
         * @param startParameter Start parameter to be passed to getWebAppLinkUrl.
         * @param isCompact True, if the Web App must be opened in a compact mode instead of a full-size mode.
         */
        public InternalLinkTypeWebApp(String botUsername, String webAppShortName, String startParameter, boolean isCompact) {
            this.botUsername = botUsername;
            this.webAppShortName = webAppShortName;
            this.startParameter = startParameter;
            this.isCompact = isCompact;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1281932045;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of chat to which points an invite link.
     */
    public abstract static class InviteLinkChatType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InviteLinkChatTypeBasicGroup.CONSTRUCTOR,
            InviteLinkChatTypeSupergroup.CONSTRUCTOR,
            InviteLinkChatTypeChannel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InviteLinkChatType() {
        }
    }

    /**
     * The link is an invite link for a basic group.
     */
    public static class InviteLinkChatTypeBasicGroup extends InviteLinkChatType {

        /**
         * The link is an invite link for a basic group.
         */
        public InviteLinkChatTypeBasicGroup() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1296287214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an invite link for a supergroup.
     */
    public static class InviteLinkChatTypeSupergroup extends InviteLinkChatType {

        /**
         * The link is an invite link for a supergroup.
         */
        public InviteLinkChatTypeSupergroup() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1038640984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an invite link for a channel.
     */
    public static class InviteLinkChatTypeChannel extends InviteLinkChatType {

        /**
         * The link is an invite link for a channel.
         */
        public InviteLinkChatTypeChannel() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 806547211;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Product invoice.
     */
    public static class Invoice extends Object {
        /**
         * ISO 4217 currency code.
         */
        public String currency;
        /**
         * A list of objects used to calculate the total price of the product.
         */
        public LabeledPricePart[] priceParts;
        /**
         * The maximum allowed amount of tip in the smallest units of the currency.
         */
        public long maxTipAmount;
        /**
         * Suggested amounts of tip in the smallest units of the currency.
         */
        public long[] suggestedTipAmounts;
        /**
         * An HTTP URL with terms of service for recurring payments. If non-empty, the invoice payment will result in recurring payments and the user must accept the terms of service before allowed to pay.
         */
        public String recurringPaymentTermsOfServiceUrl;
        /**
         * An HTTP URL with terms of service for non-recurring payments. If non-empty, then the user must accept the terms of service before allowed to pay.
         */
        public String termsOfServiceUrl;
        /**
         * True, if the payment is a test payment.
         */
        public boolean isTest;
        /**
         * True, if the user's name is needed for payment.
         */
        public boolean needName;
        /**
         * True, if the user's phone number is needed for payment.
         */
        public boolean needPhoneNumber;
        /**
         * True, if the user's email address is needed for payment.
         */
        public boolean needEmailAddress;
        /**
         * True, if the user's shipping address is needed for payment.
         */
        public boolean needShippingAddress;
        /**
         * True, if the user's phone number will be sent to the provider.
         */
        public boolean sendPhoneNumberToProvider;
        /**
         * True, if the user's email address will be sent to the provider.
         */
        public boolean sendEmailAddressToProvider;
        /**
         * True, if the total price depends on the shipping method.
         */
        public boolean isFlexible;

        /**
         * Product invoice.
         */
        public Invoice() {
        }

        /**
         * Product invoice.
         *
         * @param currency ISO 4217 currency code.
         * @param priceParts A list of objects used to calculate the total price of the product.
         * @param maxTipAmount The maximum allowed amount of tip in the smallest units of the currency.
         * @param suggestedTipAmounts Suggested amounts of tip in the smallest units of the currency.
         * @param recurringPaymentTermsOfServiceUrl An HTTP URL with terms of service for recurring payments. If non-empty, the invoice payment will result in recurring payments and the user must accept the terms of service before allowed to pay.
         * @param termsOfServiceUrl An HTTP URL with terms of service for non-recurring payments. If non-empty, then the user must accept the terms of service before allowed to pay.
         * @param isTest True, if the payment is a test payment.
         * @param needName True, if the user's name is needed for payment.
         * @param needPhoneNumber True, if the user's phone number is needed for payment.
         * @param needEmailAddress True, if the user's email address is needed for payment.
         * @param needShippingAddress True, if the user's shipping address is needed for payment.
         * @param sendPhoneNumberToProvider True, if the user's phone number will be sent to the provider.
         * @param sendEmailAddressToProvider True, if the user's email address will be sent to the provider.
         * @param isFlexible True, if the total price depends on the shipping method.
         */
        public Invoice(String currency, LabeledPricePart[] priceParts, long maxTipAmount, long[] suggestedTipAmounts, String recurringPaymentTermsOfServiceUrl, String termsOfServiceUrl, boolean isTest, boolean needName, boolean needPhoneNumber, boolean needEmailAddress, boolean needShippingAddress, boolean sendPhoneNumberToProvider, boolean sendEmailAddressToProvider, boolean isFlexible) {
            this.currency = currency;
            this.priceParts = priceParts;
            this.maxTipAmount = maxTipAmount;
            this.suggestedTipAmounts = suggestedTipAmounts;
            this.recurringPaymentTermsOfServiceUrl = recurringPaymentTermsOfServiceUrl;
            this.termsOfServiceUrl = termsOfServiceUrl;
            this.isTest = isTest;
            this.needName = needName;
            this.needPhoneNumber = needPhoneNumber;
            this.needEmailAddress = needEmailAddress;
            this.needShippingAddress = needShippingAddress;
            this.sendPhoneNumberToProvider = sendPhoneNumberToProvider;
            this.sendEmailAddressToProvider = sendEmailAddressToProvider;
            this.isFlexible = isFlexible;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1039926674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents one member of a JSON object.
     */
    public static class JsonObjectMember extends Object {
        /**
         * Member's key.
         */
        public String key;
        /**
         * Member's value.
         */
        public JsonValue value;

        /**
         * Represents one member of a JSON object.
         */
        public JsonObjectMember() {
        }

        /**
         * Represents one member of a JSON object.
         *
         * @param key Member's key.
         * @param value Member's value.
         */
        public JsonObjectMember(String key, JsonValue value) {
            this.key = key;
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1803309418;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a JSON value.
     */
    public abstract static class JsonValue extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            JsonValueNull.CONSTRUCTOR,
            JsonValueBoolean.CONSTRUCTOR,
            JsonValueNumber.CONSTRUCTOR,
            JsonValueString.CONSTRUCTOR,
            JsonValueArray.CONSTRUCTOR,
            JsonValueObject.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public JsonValue() {
        }
    }

    /**
     * Represents a null JSON value.
     */
    public static class JsonValueNull extends JsonValue {

        /**
         * Represents a null JSON value.
         */
        public JsonValueNull() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -92872499;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a boolean JSON value.
     */
    public static class JsonValueBoolean extends JsonValue {
        /**
         * The value.
         */
        public boolean value;

        /**
         * Represents a boolean JSON value.
         */
        public JsonValueBoolean() {
        }

        /**
         * Represents a boolean JSON value.
         *
         * @param value The value.
         */
        public JsonValueBoolean(boolean value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2142186576;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a numeric JSON value.
     */
    public static class JsonValueNumber extends JsonValue {
        /**
         * The value.
         */
        public double value;

        /**
         * Represents a numeric JSON value.
         */
        public JsonValueNumber() {
        }

        /**
         * Represents a numeric JSON value.
         *
         * @param value The value.
         */
        public JsonValueNumber(double value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1010822033;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a string JSON value.
     */
    public static class JsonValueString extends JsonValue {
        /**
         * The value.
         */
        public String value;

        /**
         * Represents a string JSON value.
         */
        public JsonValueString() {
        }

        /**
         * Represents a string JSON value.
         *
         * @param value The value.
         */
        public JsonValueString(String value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1597947313;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a JSON array.
     */
    public static class JsonValueArray extends JsonValue {
        /**
         * The list of array elements.
         */
        public JsonValue[] values;

        /**
         * Represents a JSON array.
         */
        public JsonValueArray() {
        }

        /**
         * Represents a JSON array.
         *
         * @param values The list of array elements.
         */
        public JsonValueArray(JsonValue[] values) {
            this.values = values;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -183913546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a JSON object.
     */
    public static class JsonValueObject extends JsonValue {
        /**
         * The list of object members.
         */
        public JsonObjectMember[] members;

        /**
         * Represents a JSON object.
         */
        public JsonValueObject() {
        }

        /**
         * Represents a JSON object.
         *
         * @param members The list of object members.
         */
        public JsonValueObject(JsonObjectMember[] members) {
            this.members = members;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 520252026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a single button in a bot keyboard.
     */
    public static class KeyboardButton extends Object {
        /**
         * Text of the button.
         */
        public String text;
        /**
         * Type of the button.
         */
        public KeyboardButtonType type;

        /**
         * Represents a single button in a bot keyboard.
         */
        public KeyboardButton() {
        }

        /**
         * Represents a single button in a bot keyboard.
         *
         * @param text Text of the button.
         * @param type Type of the button.
         */
        public KeyboardButton(String text, KeyboardButtonType type) {
            this.text = text;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2069836172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a keyboard button type.
     */
    public abstract static class KeyboardButtonType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            KeyboardButtonTypeText.CONSTRUCTOR,
            KeyboardButtonTypeRequestPhoneNumber.CONSTRUCTOR,
            KeyboardButtonTypeRequestLocation.CONSTRUCTOR,
            KeyboardButtonTypeRequestPoll.CONSTRUCTOR,
            KeyboardButtonTypeRequestUsers.CONSTRUCTOR,
            KeyboardButtonTypeRequestChat.CONSTRUCTOR,
            KeyboardButtonTypeWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public KeyboardButtonType() {
        }
    }

    /**
     * A simple button, with text that must be sent when the button is pressed.
     */
    public static class KeyboardButtonTypeText extends KeyboardButtonType {

        /**
         * A simple button, with text that must be sent when the button is pressed.
         */
        public KeyboardButtonTypeText() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1773037256;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that sends the user's phone number when pressed; available only in private chats.
     */
    public static class KeyboardButtonTypeRequestPhoneNumber extends KeyboardButtonType {

        /**
         * A button that sends the user's phone number when pressed; available only in private chats.
         */
        public KeyboardButtonTypeRequestPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1529235527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that sends the user's location when pressed; available only in private chats.
     */
    public static class KeyboardButtonTypeRequestLocation extends KeyboardButtonType {

        /**
         * A button that sends the user's location when pressed; available only in private chats.
         */
        public KeyboardButtonTypeRequestLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -125661955;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that allows the user to create and send a poll when pressed; available only in private chats.
     */
    public static class KeyboardButtonTypeRequestPoll extends KeyboardButtonType {
        /**
         * If true, only regular polls must be allowed to create.
         */
        public boolean forceRegular;
        /**
         * If true, only polls in quiz mode must be allowed to create.
         */
        public boolean forceQuiz;

        /**
         * A button that allows the user to create and send a poll when pressed; available only in private chats.
         */
        public KeyboardButtonTypeRequestPoll() {
        }

        /**
         * A button that allows the user to create and send a poll when pressed; available only in private chats.
         *
         * @param forceRegular If true, only regular polls must be allowed to create.
         * @param forceQuiz If true, only polls in quiz mode must be allowed to create.
         */
        public KeyboardButtonTypeRequestPoll(boolean forceRegular, boolean forceQuiz) {
            this.forceRegular = forceRegular;
            this.forceQuiz = forceQuiz;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1902435512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that requests users to be shared by the current user; available only in private chats. Use the method shareUsersWithBot to complete the request.
     */
    public static class KeyboardButtonTypeRequestUsers extends KeyboardButtonType {
        /**
         * Unique button identifier.
         */
        public int id;
        /**
         * True, if the shared users must or must not be bots.
         */
        public boolean restrictUserIsBot;
        /**
         * True, if the shared users must be bots; otherwise, the shared users must not be bots. Ignored if restrictUserIsBot is false.
         */
        public boolean userIsBot;
        /**
         * True, if the shared users must or must not be Telegram Premium users.
         */
        public boolean restrictUserIsPremium;
        /**
         * True, if the shared users must be Telegram Premium users; otherwise, the shared users must not be Telegram Premium users. Ignored if restrictUserIsPremium is false.
         */
        public boolean userIsPremium;
        /**
         * The maximum number of users to share.
         */
        public int maxQuantity;
        /**
         * Pass true to request name of the users; bots only.
         */
        public boolean requestName;
        /**
         * Pass true to request username of the users; bots only.
         */
        public boolean requestUsername;
        /**
         * Pass true to request photo of the users; bots only.
         */
        public boolean requestPhoto;

        /**
         * A button that requests users to be shared by the current user; available only in private chats. Use the method shareUsersWithBot to complete the request.
         */
        public KeyboardButtonTypeRequestUsers() {
        }

        /**
         * A button that requests users to be shared by the current user; available only in private chats. Use the method shareUsersWithBot to complete the request.
         *
         * @param id Unique button identifier.
         * @param restrictUserIsBot True, if the shared users must or must not be bots.
         * @param userIsBot True, if the shared users must be bots; otherwise, the shared users must not be bots. Ignored if restrictUserIsBot is false.
         * @param restrictUserIsPremium True, if the shared users must or must not be Telegram Premium users.
         * @param userIsPremium True, if the shared users must be Telegram Premium users; otherwise, the shared users must not be Telegram Premium users. Ignored if restrictUserIsPremium is false.
         * @param maxQuantity The maximum number of users to share.
         * @param requestName Pass true to request name of the users; bots only.
         * @param requestUsername Pass true to request username of the users; bots only.
         * @param requestPhoto Pass true to request photo of the users; bots only.
         */
        public KeyboardButtonTypeRequestUsers(int id, boolean restrictUserIsBot, boolean userIsBot, boolean restrictUserIsPremium, boolean userIsPremium, int maxQuantity, boolean requestName, boolean requestUsername, boolean requestPhoto) {
            this.id = id;
            this.restrictUserIsBot = restrictUserIsBot;
            this.userIsBot = userIsBot;
            this.restrictUserIsPremium = restrictUserIsPremium;
            this.userIsPremium = userIsPremium;
            this.maxQuantity = maxQuantity;
            this.requestName = requestName;
            this.requestUsername = requestUsername;
            this.requestPhoto = requestPhoto;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1738765315;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that requests a chat to be shared by the current user; available only in private chats. Use the method shareChatWithBot to complete the request.
     */
    public static class KeyboardButtonTypeRequestChat extends KeyboardButtonType {
        /**
         * Unique button identifier.
         */
        public int id;
        /**
         * True, if the chat must be a channel; otherwise, a basic group or a supergroup chat is shared.
         */
        public boolean chatIsChannel;
        /**
         * True, if the chat must or must not be a forum supergroup.
         */
        public boolean restrictChatIsForum;
        /**
         * True, if the chat must be a forum supergroup; otherwise, the chat must not be a forum supergroup. Ignored if restrictChatIsForum is false.
         */
        public boolean chatIsForum;
        /**
         * True, if the chat must or must not have a username.
         */
        public boolean restrictChatHasUsername;
        /**
         * True, if the chat must have a username; otherwise, the chat must not have a username. Ignored if restrictChatHasUsername is false.
         */
        public boolean chatHasUsername;
        /**
         * True, if the chat must be created by the current user.
         */
        public boolean chatIsCreated;
        /**
         * Expected user administrator rights in the chat; may be null if they aren't restricted.
         */
        @Nullable public ChatAdministratorRights userAdministratorRights;
        /**
         * Expected bot administrator rights in the chat; may be null if they aren't restricted.
         */
        @Nullable public ChatAdministratorRights botAdministratorRights;
        /**
         * True, if the bot must be a member of the chat; for basic group and supergroup chats only.
         */
        public boolean botIsMember;
        /**
         * Pass true to request title of the chat; bots only.
         */
        public boolean requestTitle;
        /**
         * Pass true to request username of the chat; bots only.
         */
        public boolean requestUsername;
        /**
         * Pass true to request photo of the chat; bots only.
         */
        public boolean requestPhoto;

        /**
         * A button that requests a chat to be shared by the current user; available only in private chats. Use the method shareChatWithBot to complete the request.
         */
        public KeyboardButtonTypeRequestChat() {
        }

        /**
         * A button that requests a chat to be shared by the current user; available only in private chats. Use the method shareChatWithBot to complete the request.
         *
         * @param id Unique button identifier.
         * @param chatIsChannel True, if the chat must be a channel; otherwise, a basic group or a supergroup chat is shared.
         * @param restrictChatIsForum True, if the chat must or must not be a forum supergroup.
         * @param chatIsForum True, if the chat must be a forum supergroup; otherwise, the chat must not be a forum supergroup. Ignored if restrictChatIsForum is false.
         * @param restrictChatHasUsername True, if the chat must or must not have a username.
         * @param chatHasUsername True, if the chat must have a username; otherwise, the chat must not have a username. Ignored if restrictChatHasUsername is false.
         * @param chatIsCreated True, if the chat must be created by the current user.
         * @param userAdministratorRights Expected user administrator rights in the chat; may be null if they aren't restricted.
         * @param botAdministratorRights Expected bot administrator rights in the chat; may be null if they aren't restricted.
         * @param botIsMember True, if the bot must be a member of the chat; for basic group and supergroup chats only.
         * @param requestTitle Pass true to request title of the chat; bots only.
         * @param requestUsername Pass true to request username of the chat; bots only.
         * @param requestPhoto Pass true to request photo of the chat; bots only.
         */
        public KeyboardButtonTypeRequestChat(int id, boolean chatIsChannel, boolean restrictChatIsForum, boolean chatIsForum, boolean restrictChatHasUsername, boolean chatHasUsername, boolean chatIsCreated, ChatAdministratorRights userAdministratorRights, ChatAdministratorRights botAdministratorRights, boolean botIsMember, boolean requestTitle, boolean requestUsername, boolean requestPhoto) {
            this.id = id;
            this.chatIsChannel = chatIsChannel;
            this.restrictChatIsForum = restrictChatIsForum;
            this.chatIsForum = chatIsForum;
            this.restrictChatHasUsername = restrictChatHasUsername;
            this.chatHasUsername = chatHasUsername;
            this.chatIsCreated = chatIsCreated;
            this.userAdministratorRights = userAdministratorRights;
            this.botAdministratorRights = botAdministratorRights;
            this.botIsMember = botIsMember;
            this.requestTitle = requestTitle;
            this.requestUsername = requestUsername;
            this.requestPhoto = requestPhoto;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1511138485;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that opens a Web App by calling getWebAppUrl.
     */
    public static class KeyboardButtonTypeWebApp extends KeyboardButtonType {
        /**
         * An HTTP URL to pass to getWebAppUrl.
         */
        public String url;

        /**
         * A button that opens a Web App by calling getWebAppUrl.
         */
        public KeyboardButtonTypeWebApp() {
        }

        /**
         * A button that opens a Web App by calling getWebAppUrl.
         *
         * @param url An HTTP URL to pass to getWebAppUrl.
         */
        public KeyboardButtonTypeWebApp(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1892220770;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Portion of the price of a product (e.g., &quot;delivery cost&quot;, &quot;tax amount&quot;).
     */
    public static class LabeledPricePart extends Object {
        /**
         * Label for this portion of the product price.
         */
        public String label;
        /**
         * Currency amount in the smallest units of the currency.
         */
        public long amount;

        /**
         * Portion of the price of a product (e.g., &quot;delivery cost&quot;, &quot;tax amount&quot;).
         */
        public LabeledPricePart() {
        }

        /**
         * Portion of the price of a product (e.g., &quot;delivery cost&quot;, &quot;tax amount&quot;).
         *
         * @param label Label for this portion of the product price.
         * @param amount Currency amount in the smallest units of the currency.
         */
        public LabeledPricePart(String label, long amount) {
            this.label = label;
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 552789798;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a language pack.
     */
    public static class LanguagePackInfo extends Object {
        /**
         * Unique language pack identifier.
         */
        public String id;
        /**
         * Identifier of a base language pack; may be empty. If a string is missed in the language pack, then it must be fetched from base language pack. Unsupported in custom language packs.
         */
        public String baseLanguagePackId;
        /**
         * Language name.
         */
        public String name;
        /**
         * Name of the language in that language.
         */
        public String nativeName;
        /**
         * A language code to be used to apply plural forms. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
         */
        public String pluralCode;
        /**
         * True, if the language pack is official.
         */
        public boolean isOfficial;
        /**
         * True, if the language pack strings are RTL.
         */
        public boolean isRtl;
        /**
         * True, if the language pack is a beta language pack.
         */
        public boolean isBeta;
        /**
         * True, if the language pack is installed by the current user.
         */
        public boolean isInstalled;
        /**
         * Total number of non-deleted strings from the language pack.
         */
        public int totalStringCount;
        /**
         * Total number of translated strings from the language pack.
         */
        public int translatedStringCount;
        /**
         * Total number of non-deleted strings from the language pack available locally.
         */
        public int localStringCount;
        /**
         * Link to language translation interface; empty for custom local language packs.
         */
        public String translationUrl;

        /**
         * Contains information about a language pack.
         */
        public LanguagePackInfo() {
        }

        /**
         * Contains information about a language pack.
         *
         * @param id Unique language pack identifier.
         * @param baseLanguagePackId Identifier of a base language pack; may be empty. If a string is missed in the language pack, then it must be fetched from base language pack. Unsupported in custom language packs.
         * @param name Language name.
         * @param nativeName Name of the language in that language.
         * @param pluralCode A language code to be used to apply plural forms. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
         * @param isOfficial True, if the language pack is official.
         * @param isRtl True, if the language pack strings are RTL.
         * @param isBeta True, if the language pack is a beta language pack.
         * @param isInstalled True, if the language pack is installed by the current user.
         * @param totalStringCount Total number of non-deleted strings from the language pack.
         * @param translatedStringCount Total number of translated strings from the language pack.
         * @param localStringCount Total number of non-deleted strings from the language pack available locally.
         * @param translationUrl Link to language translation interface; empty for custom local language packs.
         */
        public LanguagePackInfo(String id, String baseLanguagePackId, String name, String nativeName, String pluralCode, boolean isOfficial, boolean isRtl, boolean isBeta, boolean isInstalled, int totalStringCount, int translatedStringCount, int localStringCount, String translationUrl) {
            this.id = id;
            this.baseLanguagePackId = baseLanguagePackId;
            this.name = name;
            this.nativeName = nativeName;
            this.pluralCode = pluralCode;
            this.isOfficial = isOfficial;
            this.isRtl = isRtl;
            this.isBeta = isBeta;
            this.isInstalled = isInstalled;
            this.totalStringCount = totalStringCount;
            this.translatedStringCount = translatedStringCount;
            this.localStringCount = localStringCount;
            this.translationUrl = translationUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 542199642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents one language pack string.
     */
    public static class LanguagePackString extends Object {
        /**
         * String key.
         */
        public String key;
        /**
         * String value; pass null if the string needs to be taken from the built-in English language pack.
         */
        public LanguagePackStringValue value;

        /**
         * Represents one language pack string.
         */
        public LanguagePackString() {
        }

        /**
         * Represents one language pack string.
         *
         * @param key String key.
         * @param value String value; pass null if the string needs to be taken from the built-in English language pack.
         */
        public LanguagePackString(String key, LanguagePackStringValue value) {
            this.key = key;
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1307632736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the value of a string in a language pack.
     */
    public abstract static class LanguagePackStringValue extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LanguagePackStringValueOrdinary.CONSTRUCTOR,
            LanguagePackStringValuePluralized.CONSTRUCTOR,
            LanguagePackStringValueDeleted.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LanguagePackStringValue() {
        }
    }

    /**
     * An ordinary language pack string.
     */
    public static class LanguagePackStringValueOrdinary extends LanguagePackStringValue {
        /**
         * String value.
         */
        public String value;

        /**
         * An ordinary language pack string.
         */
        public LanguagePackStringValueOrdinary() {
        }

        /**
         * An ordinary language pack string.
         *
         * @param value String value.
         */
        public LanguagePackStringValueOrdinary(String value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -249256352;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A language pack string which has different forms based on the number of some object it mentions. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
     */
    public static class LanguagePackStringValuePluralized extends LanguagePackStringValue {
        /**
         * Value for zero objects.
         */
        public String zeroValue;
        /**
         * Value for one object.
         */
        public String oneValue;
        /**
         * Value for two objects.
         */
        public String twoValue;
        /**
         * Value for few objects.
         */
        public String fewValue;
        /**
         * Value for many objects.
         */
        public String manyValue;
        /**
         * Default value.
         */
        public String otherValue;

        /**
         * A language pack string which has different forms based on the number of some object it mentions. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
         */
        public LanguagePackStringValuePluralized() {
        }

        /**
         * A language pack string which has different forms based on the number of some object it mentions. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
         *
         * @param zeroValue Value for zero objects.
         * @param oneValue Value for one object.
         * @param twoValue Value for two objects.
         * @param fewValue Value for few objects.
         * @param manyValue Value for many objects.
         * @param otherValue Default value.
         */
        public LanguagePackStringValuePluralized(String zeroValue, String oneValue, String twoValue, String fewValue, String manyValue, String otherValue) {
            this.zeroValue = zeroValue;
            this.oneValue = oneValue;
            this.twoValue = twoValue;
            this.fewValue = fewValue;
            this.manyValue = manyValue;
            this.otherValue = otherValue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1906840261;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A deleted language pack string, the value must be taken from the built-in English language pack.
     */
    public static class LanguagePackStringValueDeleted extends LanguagePackStringValue {

        /**
         * A deleted language pack string, the value must be taken from the built-in English language pack.
         */
        public LanguagePackStringValueDeleted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1834792698;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of language pack strings.
     */
    public static class LanguagePackStrings extends Object {
        /**
         * A list of language pack strings.
         */
        public LanguagePackString[] strings;

        /**
         * Contains a list of language pack strings.
         */
        public LanguagePackStrings() {
        }

        /**
         * Contains a list of language pack strings.
         *
         * @param strings A list of language pack strings.
         */
        public LanguagePackStrings(LanguagePackString[] strings) {
            this.strings = strings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1172082922;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a link preview.
     */
    public static class LinkPreview extends Object {
        /**
         * Original URL of the link.
         */
        public String url;
        /**
         * URL to display.
         */
        public String displayUrl;
        /**
         * Short name of the site (e.g., Google Docs, App Store).
         */
        public String siteName;
        /**
         * Title of the content.
         */
        public String title;
        /**
         * Description of the content.
         */
        public FormattedText description;
        /**
         * Type of the link preview.
         */
        public LinkPreviewType type;
        /**
         * True, if size of media in the preview can be changed.
         */
        public boolean hasLargeMedia;
        /**
         * True, if large media preview must be shown; otherwise, the media preview must be shown small and only the first frame must be shown for videos.
         */
        public boolean showLargeMedia;
        /**
         * True, if there is no need to show an ordinary open URL confirmation, when opening the URL from the preview, because the URL is shown in the message text in clear.
         */
        public boolean skipConfirmation;
        /**
         * True, if the link preview must be shown above message text; otherwise, the link preview must be shown below the message text.
         */
        public boolean showAboveText;
        /**
         * Version of instant view (currently, can be 1 or 2) for the web page; 0 if none.
         */
        public int instantViewVersion;

        /**
         * Describes a link preview.
         */
        public LinkPreview() {
        }

        /**
         * Describes a link preview.
         *
         * @param url Original URL of the link.
         * @param displayUrl URL to display.
         * @param siteName Short name of the site (e.g., Google Docs, App Store).
         * @param title Title of the content.
         * @param description Description of the content.
         * @param type Type of the link preview.
         * @param hasLargeMedia True, if size of media in the preview can be changed.
         * @param showLargeMedia True, if large media preview must be shown; otherwise, the media preview must be shown small and only the first frame must be shown for videos.
         * @param skipConfirmation True, if there is no need to show an ordinary open URL confirmation, when opening the URL from the preview, because the URL is shown in the message text in clear.
         * @param showAboveText True, if the link preview must be shown above message text; otherwise, the link preview must be shown below the message text.
         * @param instantViewVersion Version of instant view (currently, can be 1 or 2) for the web page; 0 if none.
         */
        public LinkPreview(String url, String displayUrl, String siteName, String title, FormattedText description, LinkPreviewType type, boolean hasLargeMedia, boolean showLargeMedia, boolean skipConfirmation, boolean showAboveText, int instantViewVersion) {
            this.url = url;
            this.displayUrl = displayUrl;
            this.siteName = siteName;
            this.title = title;
            this.description = description;
            this.type = type;
            this.hasLargeMedia = hasLargeMedia;
            this.showLargeMedia = showLargeMedia;
            this.skipConfirmation = skipConfirmation;
            this.showAboveText = showAboveText;
            this.instantViewVersion = instantViewVersion;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -740917523;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a media from a link preview album.
     */
    public abstract static class LinkPreviewAlbumMedia extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LinkPreviewAlbumMediaPhoto.CONSTRUCTOR,
            LinkPreviewAlbumMediaVideo.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LinkPreviewAlbumMedia() {
        }
    }

    /**
     * The media is a photo.
     */
    public static class LinkPreviewAlbumMediaPhoto extends LinkPreviewAlbumMedia {
        /**
         * Photo description.
         */
        public Photo photo;

        /**
         * The media is a photo.
         */
        public LinkPreviewAlbumMediaPhoto() {
        }

        /**
         * The media is a photo.
         *
         * @param photo Photo description.
         */
        public LinkPreviewAlbumMediaPhoto(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -935480434;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is a video.
     */
    public static class LinkPreviewAlbumMediaVideo extends LinkPreviewAlbumMedia {
        /**
         * Video description.
         */
        public Video video;

        /**
         * The media is a video.
         */
        public LinkPreviewAlbumMediaVideo() {
        }

        /**
         * The media is a video.
         *
         * @param video Video description.
         */
        public LinkPreviewAlbumMediaVideo(Video video) {
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 390616795;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Options to be used for generation of a link preview.
     */
    public static class LinkPreviewOptions extends Object {
        /**
         * True, if link preview must be disabled.
         */
        public boolean isDisabled;
        /**
         * URL to use for link preview. If empty, then the first URL found in the message text will be used.
         */
        public String url;
        /**
         * True, if shown media preview must be small; ignored in secret chats or if the URL isn't explicitly specified.
         */
        public boolean forceSmallMedia;
        /**
         * True, if shown media preview must be large; ignored in secret chats or if the URL isn't explicitly specified.
         */
        public boolean forceLargeMedia;
        /**
         * True, if link preview must be shown above message text; otherwise, the link preview will be shown below the message text; ignored in secret chats.
         */
        public boolean showAboveText;

        /**
         * Options to be used for generation of a link preview.
         */
        public LinkPreviewOptions() {
        }

        /**
         * Options to be used for generation of a link preview.
         *
         * @param isDisabled True, if link preview must be disabled.
         * @param url URL to use for link preview. If empty, then the first URL found in the message text will be used.
         * @param forceSmallMedia True, if shown media preview must be small; ignored in secret chats or if the URL isn't explicitly specified.
         * @param forceLargeMedia True, if shown media preview must be large; ignored in secret chats or if the URL isn't explicitly specified.
         * @param showAboveText True, if link preview must be shown above message text; otherwise, the link preview will be shown below the message text; ignored in secret chats.
         */
        public LinkPreviewOptions(boolean isDisabled, String url, boolean forceSmallMedia, boolean forceLargeMedia, boolean showAboveText) {
            this.isDisabled = isDisabled;
            this.url = url;
            this.forceSmallMedia = forceSmallMedia;
            this.forceLargeMedia = forceLargeMedia;
            this.showAboveText = showAboveText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1046590451;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of link preview.
     */
    public abstract static class LinkPreviewType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LinkPreviewTypeAlbum.CONSTRUCTOR,
            LinkPreviewTypeAnimation.CONSTRUCTOR,
            LinkPreviewTypeApp.CONSTRUCTOR,
            LinkPreviewTypeArticle.CONSTRUCTOR,
            LinkPreviewTypeAudio.CONSTRUCTOR,
            LinkPreviewTypeBackground.CONSTRUCTOR,
            LinkPreviewTypeChannelBoost.CONSTRUCTOR,
            LinkPreviewTypeChat.CONSTRUCTOR,
            LinkPreviewTypeDocument.CONSTRUCTOR,
            LinkPreviewTypeEmbeddedAudioPlayer.CONSTRUCTOR,
            LinkPreviewTypeEmbeddedVideoPlayer.CONSTRUCTOR,
            LinkPreviewTypeInvoice.CONSTRUCTOR,
            LinkPreviewTypeMessage.CONSTRUCTOR,
            LinkPreviewTypePhoto.CONSTRUCTOR,
            LinkPreviewTypePremiumGiftCode.CONSTRUCTOR,
            LinkPreviewTypeShareableChatFolder.CONSTRUCTOR,
            LinkPreviewTypeSticker.CONSTRUCTOR,
            LinkPreviewTypeStickerSet.CONSTRUCTOR,
            LinkPreviewTypeStory.CONSTRUCTOR,
            LinkPreviewTypeSupergroupBoost.CONSTRUCTOR,
            LinkPreviewTypeTheme.CONSTRUCTOR,
            LinkPreviewTypeUnsupported.CONSTRUCTOR,
            LinkPreviewTypeUser.CONSTRUCTOR,
            LinkPreviewTypeVideo.CONSTRUCTOR,
            LinkPreviewTypeVideoChat.CONSTRUCTOR,
            LinkPreviewTypeVideoNote.CONSTRUCTOR,
            LinkPreviewTypeVoiceNote.CONSTRUCTOR,
            LinkPreviewTypeWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LinkPreviewType() {
        }
    }

    /**
     * The link is a link to a media album consisting of photos and videos.
     */
    public static class LinkPreviewTypeAlbum extends LinkPreviewType {
        /**
         * The list of album media.
         */
        public LinkPreviewAlbumMedia[] media;
        /**
         * Album caption.
         */
        public String caption;

        /**
         * The link is a link to a media album consisting of photos and videos.
         */
        public LinkPreviewTypeAlbum() {
        }

        /**
         * The link is a link to a media album consisting of photos and videos.
         *
         * @param media The list of album media.
         * @param caption Album caption.
         */
        public LinkPreviewTypeAlbum(LinkPreviewAlbumMedia[] media, String caption) {
            this.media = media;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -919156671;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an animation.
     */
    public static class LinkPreviewTypeAnimation extends LinkPreviewType {
        /**
         * The animation.
         */
        public Animation animation;
        /**
         * Author of the animation.
         */
        public String author;

        /**
         * The link is a link to an animation.
         */
        public LinkPreviewTypeAnimation() {
        }

        /**
         * The link is a link to an animation.
         *
         * @param animation The animation.
         * @param author Author of the animation.
         */
        public LinkPreviewTypeAnimation(Animation animation, String author) {
            this.animation = animation;
            this.author = author;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1823256946;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an app at App Store or Google Play.
     */
    public static class LinkPreviewTypeApp extends LinkPreviewType {
        /**
         * Photo for the app.
         */
        public Photo photo;
        /**
         * Author of the app.
         */
        public String author;

        /**
         * The link is a link to an app at App Store or Google Play.
         */
        public LinkPreviewTypeApp() {
        }

        /**
         * The link is a link to an app at App Store or Google Play.
         *
         * @param photo Photo for the app.
         * @param author Author of the app.
         */
        public LinkPreviewTypeApp(Photo photo, String author) {
            this.photo = photo;
            this.author = author;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1256642746;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a web site.
     */
    public static class LinkPreviewTypeArticle extends LinkPreviewType {
        /**
         * Article's main photo; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Author of the article.
         */
        public String author;

        /**
         * The link is a link to a web site.
         */
        public LinkPreviewTypeArticle() {
        }

        /**
         * The link is a link to a web site.
         *
         * @param photo Article's main photo; may be null.
         * @param author Author of the article.
         */
        public LinkPreviewTypeArticle(Photo photo, String author) {
            this.photo = photo;
            this.author = author;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1772204505;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an audio.
     */
    public static class LinkPreviewTypeAudio extends LinkPreviewType {
        /**
         * URL of the audio; may be empty if none.
         */
        public String url;
        /**
         * MIME type of the audio file.
         */
        public String mimeType;
        /**
         * The audio description; may be null if unknown.
         */
        @Nullable public Audio audio;
        /**
         * Duration of the audio, in seconds; 0 if unknown.
         */
        public int duration;
        /**
         * Author of the audio.
         */
        public String author;

        /**
         * The link is a link to an audio.
         */
        public LinkPreviewTypeAudio() {
        }

        /**
         * The link is a link to an audio.
         *
         * @param url URL of the audio; may be empty if none.
         * @param mimeType MIME type of the audio file.
         * @param audio The audio description; may be null if unknown.
         * @param duration Duration of the audio, in seconds; 0 if unknown.
         * @param author Author of the audio.
         */
        public LinkPreviewTypeAudio(String url, String mimeType, Audio audio, int duration, String author) {
            this.url = url;
            this.mimeType = mimeType;
            this.audio = audio;
            this.duration = duration;
            this.author = author;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1462528888;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a background. Link preview title and description are available only for filled backgrounds.
     */
    public static class LinkPreviewTypeBackground extends LinkPreviewType {
        /**
         * Document with the background; may be null for filled backgrounds.
         */
        @Nullable public Document document;

        /**
         * The link is a link to a background. Link preview title and description are available only for filled backgrounds.
         */
        public LinkPreviewTypeBackground() {
        }

        /**
         * The link is a link to a background. Link preview title and description are available only for filled backgrounds.
         *
         * @param document Document with the background; may be null for filled backgrounds.
         */
        public LinkPreviewTypeBackground(Document document) {
            this.document = document;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1841628038;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to boost a channel chat.
     */
    public static class LinkPreviewTypeChannelBoost extends LinkPreviewType {
        /**
         * Photo of the chat; may be null.
         */
        @Nullable public ChatPhoto photo;

        /**
         * The link is a link to boost a channel chat.
         */
        public LinkPreviewTypeChannelBoost() {
        }

        /**
         * The link is a link to boost a channel chat.
         *
         * @param photo Photo of the chat; may be null.
         */
        public LinkPreviewTypeChannelBoost(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -957086634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a chat.
     */
    public static class LinkPreviewTypeChat extends LinkPreviewType {
        /**
         * Type of the chat.
         */
        public InviteLinkChatType type;
        /**
         * Photo of the chat; may be null.
         */
        @Nullable public ChatPhoto photo;
        /**
         * True, if the link only creates join request.
         */
        public boolean createsJoinRequest;

        /**
         * The link is a link to a chat.
         */
        public LinkPreviewTypeChat() {
        }

        /**
         * The link is a link to a chat.
         *
         * @param type Type of the chat.
         * @param photo Photo of the chat; may be null.
         * @param createsJoinRequest True, if the link only creates join request.
         */
        public LinkPreviewTypeChat(InviteLinkChatType type, ChatPhoto photo, boolean createsJoinRequest) {
            this.type = type;
            this.photo = photo;
            this.createsJoinRequest = createsJoinRequest;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1372610270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a general file.
     */
    public static class LinkPreviewTypeDocument extends LinkPreviewType {
        /**
         * The document description.
         */
        public Document document;
        /**
         * Author of the document.
         */
        public String author;

        /**
         * The link is a link to a general file.
         */
        public LinkPreviewTypeDocument() {
        }

        /**
         * The link is a link to a general file.
         *
         * @param document The document description.
         * @param author Author of the document.
         */
        public LinkPreviewTypeDocument(Document document, String author) {
            this.document = document;
            this.author = author;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1404053319;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an audio player.
     */
    public static class LinkPreviewTypeEmbeddedAudioPlayer extends LinkPreviewType {
        /**
         * URL of the external audio player.
         */
        public String url;
        /**
         * Duration of the audio, in seconds.
         */
        public int duration;
        /**
         * Author of the audio.
         */
        public String author;

        /**
         * The link is a link to an audio player.
         */
        public LinkPreviewTypeEmbeddedAudioPlayer() {
        }

        /**
         * The link is a link to an audio player.
         *
         * @param url URL of the external audio player.
         * @param duration Duration of the audio, in seconds.
         * @param author Author of the audio.
         */
        public LinkPreviewTypeEmbeddedAudioPlayer(String url, int duration, String author) {
            this.url = url;
            this.duration = duration;
            this.author = author;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 732979462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video player.
     */
    public static class LinkPreviewTypeEmbeddedVideoPlayer extends LinkPreviewType {
        /**
         * URL of the external video player.
         */
        public String url;
        /**
         * Duration of the video, in seconds.
         */
        public int duration;
        /**
         * Author of the video.
         */
        public String author;
        /**
         * Expected width of the preview.
         */
        public int width;
        /**
         * Expected height of the preview.
         */
        public int height;

        /**
         * The link is a link to a video player.
         */
        public LinkPreviewTypeEmbeddedVideoPlayer() {
        }

        /**
         * The link is a link to a video player.
         *
         * @param url URL of the external video player.
         * @param duration Duration of the video, in seconds.
         * @param author Author of the video.
         * @param width Expected width of the preview.
         * @param height Expected height of the preview.
         */
        public LinkPreviewTypeEmbeddedVideoPlayer(String url, int duration, String author, int width, int height) {
            this.url = url;
            this.duration = duration;
            this.author = author;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -45312231;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an invoice.
     */
    public static class LinkPreviewTypeInvoice extends LinkPreviewType {

        /**
         * The link is a link to an invoice.
         */
        public LinkPreviewTypeInvoice() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -729855782;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a text or a poll Telegram message.
     */
    public static class LinkPreviewTypeMessage extends LinkPreviewType {

        /**
         * The link is a link to a text or a poll Telegram message.
         */
        public LinkPreviewTypeMessage() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 435470750;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a photo.
     */
    public static class LinkPreviewTypePhoto extends LinkPreviewType {
        /**
         * The photo.
         */
        public Photo photo;
        /**
         * Author of the photo.
         */
        public String author;

        /**
         * The link is a link to a photo.
         */
        public LinkPreviewTypePhoto() {
        }

        /**
         * The link is a link to a photo.
         *
         * @param photo The photo.
         * @param author Author of the photo.
         */
        public LinkPreviewTypePhoto(Photo photo, String author) {
            this.photo = photo;
            this.author = author;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -286541136;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Telegram Premium gift code.
     */
    public static class LinkPreviewTypePremiumGiftCode extends LinkPreviewType {

        /**
         * The link is a link to a Telegram Premium gift code.
         */
        public LinkPreviewTypePremiumGiftCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1309507761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a shareable chat folder.
     */
    public static class LinkPreviewTypeShareableChatFolder extends LinkPreviewType {

        /**
         * The link is a link to a shareable chat folder.
         */
        public LinkPreviewTypeShareableChatFolder() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2141539524;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a sticker message.
     */
    public static class LinkPreviewTypeSticker extends LinkPreviewType {
        /**
         * The sticker.
         */
        public Sticker sticker;

        /**
         * The link is a link to a sticker message.
         */
        public LinkPreviewTypeSticker() {
        }

        /**
         * The link is a link to a sticker message.
         *
         * @param sticker The sticker.
         */
        public LinkPreviewTypeSticker(Sticker sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 610225445;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a sticker set.
     */
    public static class LinkPreviewTypeStickerSet extends LinkPreviewType {
        /**
         * Up to 4 stickers from the sticker set.
         */
        public Sticker[] stickers;

        /**
         * The link is a link to a sticker set.
         */
        public LinkPreviewTypeStickerSet() {
        }

        /**
         * The link is a link to a sticker set.
         *
         * @param stickers Up to 4 stickers from the sticker set.
         */
        public LinkPreviewTypeStickerSet(Sticker[] stickers) {
            this.stickers = stickers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -145958768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a story. Link preview description is unavailable.
     */
    public static class LinkPreviewTypeStory extends LinkPreviewType {
        /**
         * The identifier of the chat that posted the story.
         */
        public long storySenderChatId;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * The link is a link to a story. Link preview description is unavailable.
         */
        public LinkPreviewTypeStory() {
        }

        /**
         * The link is a link to a story. Link preview description is unavailable.
         *
         * @param storySenderChatId The identifier of the chat that posted the story.
         * @param storyId Story identifier.
         */
        public LinkPreviewTypeStory(long storySenderChatId, int storyId) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 513574862;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to boost a supergroup chat.
     */
    public static class LinkPreviewTypeSupergroupBoost extends LinkPreviewType {
        /**
         * Photo of the chat; may be null.
         */
        @Nullable public ChatPhoto photo;

        /**
         * The link is a link to boost a supergroup chat.
         */
        public LinkPreviewTypeSupergroupBoost() {
        }

        /**
         * The link is a link to boost a supergroup chat.
         *
         * @param photo Photo of the chat; may be null.
         */
        public LinkPreviewTypeSupergroupBoost(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1873345418;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a cloud theme. TDLib has no theme support yet.
     */
    public static class LinkPreviewTypeTheme extends LinkPreviewType {
        /**
         * The list of files with theme description.
         */
        public Document[] documents;
        /**
         * Settings for the cloud theme.
         */
        public ThemeSettings settings;

        /**
         * The link is a link to a cloud theme. TDLib has no theme support yet.
         */
        public LinkPreviewTypeTheme() {
        }

        /**
         * The link is a link to a cloud theme. TDLib has no theme support yet.
         *
         * @param documents The list of files with theme description.
         * @param settings Settings for the cloud theme.
         */
        public LinkPreviewTypeTheme(Document[] documents, ThemeSettings settings) {
            this.documents = documents;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -226118489;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link preview type is unsupported yet.
     */
    public static class LinkPreviewTypeUnsupported extends LinkPreviewType {

        /**
         * The link preview type is unsupported yet.
         */
        public LinkPreviewTypeUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1924738233;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a user.
     */
    public static class LinkPreviewTypeUser extends LinkPreviewType {
        /**
         * Photo of the user; may be null if none.
         */
        @Nullable public ChatPhoto photo;
        /**
         * True, if the user is a bot.
         */
        public boolean isBot;

        /**
         * The link is a link to a user.
         */
        public LinkPreviewTypeUser() {
        }

        /**
         * The link is a link to a user.
         *
         * @param photo Photo of the user; may be null if none.
         * @param isBot True, if the user is a bot.
         */
        public LinkPreviewTypeUser(ChatPhoto photo, boolean isBot) {
            this.photo = photo;
            this.isBot = isBot;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1465024132;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video.
     */
    public static class LinkPreviewTypeVideo extends LinkPreviewType {
        /**
         * URL of the video; may be empty if none.
         */
        public String url;
        /**
         * MIME type of the video file.
         */
        public String mimeType;
        /**
         * The video description; may be null if unknown.
         */
        @Nullable public Video video;
        /**
         * Expected width of the preview.
         */
        public int width;
        /**
         * Expected height of the preview.
         */
        public int height;
        /**
         * Duration of the video, in seconds; 0 if unknown.
         */
        public int duration;
        /**
         * Author of the video.
         */
        public String author;

        /**
         * The link is a link to a video.
         */
        public LinkPreviewTypeVideo() {
        }

        /**
         * The link is a link to a video.
         *
         * @param url URL of the video; may be empty if none.
         * @param mimeType MIME type of the video file.
         * @param video The video description; may be null if unknown.
         * @param width Expected width of the preview.
         * @param height Expected height of the preview.
         * @param duration Duration of the video, in seconds; 0 if unknown.
         * @param author Author of the video.
         */
        public LinkPreviewTypeVideo(String url, String mimeType, Video video, int width, int height, int duration, String author) {
            this.url = url;
            this.mimeType = mimeType;
            this.video = video;
            this.width = width;
            this.height = height;
            this.duration = duration;
            this.author = author;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 737066942;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video chat.
     */
    public static class LinkPreviewTypeVideoChat extends LinkPreviewType {
        /**
         * Photo of the chat with the video chat; may be null if none.
         */
        @Nullable public ChatPhoto photo;
        /**
         * True, if the video chat is expected to be a live stream in a channel or a broadcast group.
         */
        public boolean isLiveStream;

        /**
         * The link is a link to a video chat.
         */
        public LinkPreviewTypeVideoChat() {
        }

        /**
         * The link is a link to a video chat.
         *
         * @param photo Photo of the chat with the video chat; may be null if none.
         * @param isLiveStream True, if the video chat is expected to be a live stream in a channel or a broadcast group.
         */
        public LinkPreviewTypeVideoChat(ChatPhoto photo, boolean isLiveStream) {
            this.photo = photo;
            this.isLiveStream = isLiveStream;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 420015635;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video note message.
     */
    public static class LinkPreviewTypeVideoNote extends LinkPreviewType {
        /**
         * The video note.
         */
        public VideoNote videoNote;

        /**
         * The link is a link to a video note message.
         */
        public LinkPreviewTypeVideoNote() {
        }

        /**
         * The link is a link to a video note message.
         *
         * @param videoNote The video note.
         */
        public LinkPreviewTypeVideoNote(VideoNote videoNote) {
            this.videoNote = videoNote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -814687391;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a voice note message.
     */
    public static class LinkPreviewTypeVoiceNote extends LinkPreviewType {
        /**
         * The voice note.
         */
        public VoiceNote voiceNote;

        /**
         * The link is a link to a voice note message.
         */
        public LinkPreviewTypeVoiceNote() {
        }

        /**
         * The link is a link to a voice note message.
         *
         * @param voiceNote The voice note.
         */
        public LinkPreviewTypeVoiceNote(VoiceNote voiceNote) {
            this.voiceNote = voiceNote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -757936341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Web App.
     */
    public static class LinkPreviewTypeWebApp extends LinkPreviewType {
        /**
         * Web App photo.
         */
        public Photo photo;

        /**
         * The link is a link to a Web App.
         */
        public LinkPreviewTypeWebApp() {
        }

        /**
         * The link is a link to a Web App.
         *
         * @param photo Web App photo.
         */
        public LinkPreviewTypeWebApp(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1506873462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a local file.
     */
    public static class LocalFile extends Object {
        /**
         * Local path to the locally available file part; may be empty.
         */
        public String path;
        /**
         * True, if it is possible to download or generate the file.
         */
        public boolean canBeDownloaded;
        /**
         * True, if the file can be deleted.
         */
        public boolean canBeDeleted;
        /**
         * True, if the file is currently being downloaded (or a local copy is being generated by some other means).
         */
        public boolean isDownloadingActive;
        /**
         * True, if the local copy is fully available.
         */
        public boolean isDownloadingCompleted;
        /**
         * Download will be started from this offset. downloadedPrefixSize is calculated from this offset.
         */
        public long downloadOffset;
        /**
         * If isDownloadingCompleted is false, then only some prefix of the file starting from downloadOffset is ready to be read. downloadedPrefixSize is the size of that prefix in bytes.
         */
        public long downloadedPrefixSize;
        /**
         * Total downloaded file size, in bytes. Can be used only for calculating download progress. The actual file size may be bigger, and some parts of it may contain garbage.
         */
        public long downloadedSize;

        /**
         * Represents a local file.
         */
        public LocalFile() {
        }

        /**
         * Represents a local file.
         *
         * @param path Local path to the locally available file part; may be empty.
         * @param canBeDownloaded True, if it is possible to download or generate the file.
         * @param canBeDeleted True, if the file can be deleted.
         * @param isDownloadingActive True, if the file is currently being downloaded (or a local copy is being generated by some other means).
         * @param isDownloadingCompleted True, if the local copy is fully available.
         * @param downloadOffset Download will be started from this offset. downloadedPrefixSize is calculated from this offset.
         * @param downloadedPrefixSize If isDownloadingCompleted is false, then only some prefix of the file starting from downloadOffset is ready to be read. downloadedPrefixSize is the size of that prefix in bytes.
         * @param downloadedSize Total downloaded file size, in bytes. Can be used only for calculating download progress. The actual file size may be bigger, and some parts of it may contain garbage.
         */
        public LocalFile(String path, boolean canBeDownloaded, boolean canBeDeleted, boolean isDownloadingActive, boolean isDownloadingCompleted, long downloadOffset, long downloadedPrefixSize, long downloadedSize) {
            this.path = path;
            this.canBeDownloaded = canBeDownloaded;
            this.canBeDeleted = canBeDeleted;
            this.isDownloadingActive = isDownloadingActive;
            this.isDownloadingCompleted = isDownloadingCompleted;
            this.downloadOffset = downloadOffset;
            this.downloadedPrefixSize = downloadedPrefixSize;
            this.downloadedSize = downloadedSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1562732153;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the current localization target.
     */
    public static class LocalizationTargetInfo extends Object {
        /**
         * List of available language packs for this application.
         */
        public LanguagePackInfo[] languagePacks;

        /**
         * Contains information about the current localization target.
         */
        public LocalizationTargetInfo() {
        }

        /**
         * Contains information about the current localization target.
         *
         * @param languagePacks List of available language packs for this application.
         */
        public LocalizationTargetInfo(LanguagePackInfo[] languagePacks) {
            this.languagePacks = languagePacks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2048670809;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a location on planet Earth.
     */
    public static class Location extends Object {
        /**
         * Latitude of the location in degrees; as defined by the sender.
         */
        public double latitude;
        /**
         * Longitude of the location, in degrees; as defined by the sender.
         */
        public double longitude;
        /**
         * The estimated horizontal accuracy of the location, in meters; as defined by the sender. 0 if unknown.
         */
        public double horizontalAccuracy;

        /**
         * Describes a location on planet Earth.
         */
        public Location() {
        }

        /**
         * Describes a location on planet Earth.
         *
         * @param latitude Latitude of the location in degrees; as defined by the sender.
         * @param longitude Longitude of the location, in degrees; as defined by the sender.
         * @param horizontalAccuracy The estimated horizontal accuracy of the location, in meters; as defined by the sender. 0 if unknown.
         */
        public Location(double latitude, double longitude, double horizontalAccuracy) {
            this.latitude = latitude;
            this.longitude = longitude;
            this.horizontalAccuracy = horizontalAccuracy;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -443392141;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an address of a location.
     */
    public static class LocationAddress extends Object {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code.
         */
        public String countryCode;
        /**
         * State, if applicable; empty if unknown.
         */
        public String state;
        /**
         * City; empty if unknown.
         */
        public String city;
        /**
         * The address; empty if unknown.
         */
        public String street;

        /**
         * Describes an address of a location.
         */
        public LocationAddress() {
        }

        /**
         * Describes an address of a location.
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code.
         * @param state State, if applicable; empty if unknown.
         * @param city City; empty if unknown.
         * @param street The address; empty if unknown.
         */
        public LocationAddress(String countryCode, String state, String city, String street) {
            this.countryCode = countryCode;
            this.state = state;
            this.city = city;
            this.street = street;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1545940190;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a stream to which TDLib internal log is written.
     */
    public abstract static class LogStream extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LogStreamDefault.CONSTRUCTOR,
            LogStreamFile.CONSTRUCTOR,
            LogStreamEmpty.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LogStream() {
        }
    }

    /**
     * The log is written to stderr or an OS specific log.
     */
    public static class LogStreamDefault extends LogStream {

        /**
         * The log is written to stderr or an OS specific log.
         */
        public LogStreamDefault() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1390581436;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The log is written to a file.
     */
    public static class LogStreamFile extends LogStream {
        /**
         * Path to the file to where the internal TDLib log will be written.
         */
        public String path;
        /**
         * The maximum size of the file to where the internal TDLib log is written before the file will automatically be rotated, in bytes.
         */
        public long maxFileSize;
        /**
         * Pass true to additionally redirect stderr to the log file. Ignored on Windows.
         */
        public boolean redirectStderr;

        /**
         * The log is written to a file.
         */
        public LogStreamFile() {
        }

        /**
         * The log is written to a file.
         *
         * @param path Path to the file to where the internal TDLib log will be written.
         * @param maxFileSize The maximum size of the file to where the internal TDLib log is written before the file will automatically be rotated, in bytes.
         * @param redirectStderr Pass true to additionally redirect stderr to the log file. Ignored on Windows.
         */
        public LogStreamFile(String path, long maxFileSize, boolean redirectStderr) {
            this.path = path;
            this.maxFileSize = maxFileSize;
            this.redirectStderr = redirectStderr;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1532136933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The log is written nowhere.
     */
    public static class LogStreamEmpty extends LogStream {

        /**
         * The log is written nowhere.
         */
        public LogStreamEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -499912244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of available TDLib internal log tags.
     */
    public static class LogTags extends Object {
        /**
         * List of log tags.
         */
        public String[] tags;

        /**
         * Contains a list of available TDLib internal log tags.
         */
        public LogTags() {
        }

        /**
         * Contains a list of available TDLib internal log tags.
         *
         * @param tags List of log tags.
         */
        public LogTags(String[] tags) {
            this.tags = tags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1604930601;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a TDLib internal log verbosity level.
     */
    public static class LogVerbosityLevel extends Object {
        /**
         * Log verbosity level.
         */
        public int verbosityLevel;

        /**
         * Contains a TDLib internal log verbosity level.
         */
        public LogVerbosityLevel() {
        }

        /**
         * Contains a TDLib internal log verbosity level.
         *
         * @param verbosityLevel Log verbosity level.
         */
        public LogVerbosityLevel(int verbosityLevel) {
            this.verbosityLevel = verbosityLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1734624234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about an inline button of type inlineKeyboardButtonTypeLoginUrl.
     */
    public abstract static class LoginUrlInfo extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LoginUrlInfoOpen.CONSTRUCTOR,
            LoginUrlInfoRequestConfirmation.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LoginUrlInfo() {
        }
    }

    /**
     * An HTTP URL needs to be open.
     */
    public static class LoginUrlInfoOpen extends LoginUrlInfo {
        /**
         * The URL to open.
         */
        public String url;
        /**
         * True, if there is no need to show an ordinary open URL confirmation.
         */
        public boolean skipConfirmation;

        /**
         * An HTTP URL needs to be open.
         */
        public LoginUrlInfoOpen() {
        }

        /**
         * An HTTP URL needs to be open.
         *
         * @param url The URL to open.
         * @param skipConfirmation True, if there is no need to show an ordinary open URL confirmation.
         */
        public LoginUrlInfoOpen(String url, boolean skipConfirmation) {
            this.url = url;
            this.skipConfirmation = skipConfirmation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 837282306;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authorization confirmation dialog needs to be shown to the user.
     */
    public static class LoginUrlInfoRequestConfirmation extends LoginUrlInfo {
        /**
         * An HTTP URL to be opened.
         */
        public String url;
        /**
         * A domain of the URL.
         */
        public String domain;
        /**
         * User identifier of a bot linked with the website.
         */
        public long botUserId;
        /**
         * True, if the user must be asked for the permission to the bot to send them messages.
         */
        public boolean requestWriteAccess;

        /**
         * An authorization confirmation dialog needs to be shown to the user.
         */
        public LoginUrlInfoRequestConfirmation() {
        }

        /**
         * An authorization confirmation dialog needs to be shown to the user.
         *
         * @param url An HTTP URL to be opened.
         * @param domain A domain of the URL.
         * @param botUserId User identifier of a bot linked with the website.
         * @param requestWriteAccess True, if the user must be asked for the permission to the bot to send them messages.
         */
        public LoginUrlInfoRequestConfirmation(String url, String domain, long botUserId, boolean requestWriteAccess) {
            this.url = url;
            this.domain = domain;
            this.botUserId = botUserId;
            this.requestWriteAccess = requestWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2128290863;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Part of the face, relative to which a mask is placed.
     */
    public abstract static class MaskPoint extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MaskPointForehead.CONSTRUCTOR,
            MaskPointEyes.CONSTRUCTOR,
            MaskPointMouth.CONSTRUCTOR,
            MaskPointChin.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MaskPoint() {
        }
    }

    /**
     * The mask is placed relatively to the forehead.
     */
    public static class MaskPointForehead extends MaskPoint {

        /**
         * The mask is placed relatively to the forehead.
         */
        public MaskPointForehead() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1027512005;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The mask is placed relatively to the eyes.
     */
    public static class MaskPointEyes extends MaskPoint {

        /**
         * The mask is placed relatively to the eyes.
         */
        public MaskPointEyes() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1748310861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The mask is placed relatively to the mouth.
     */
    public static class MaskPointMouth extends MaskPoint {

        /**
         * The mask is placed relatively to the mouth.
         */
        public MaskPointMouth() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 411773406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The mask is placed relatively to the chin.
     */
    public static class MaskPointChin extends MaskPoint {

        /**
         * The mask is placed relatively to the chin.
         */
        public MaskPointChin() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 534995335;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Position on a photo where a mask is placed.
     */
    public static class MaskPosition extends Object {
        /**
         * Part of the face, relative to which the mask is placed.
         */
        public MaskPoint point;
        /**
         * Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just to the left of the default mask position.)
         */
        public double xShift;
        /**
         * Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. (For example, 1.0 will place the mask just below the default mask position.)
         */
        public double yShift;
        /**
         * Mask scaling coefficient. (For example, 2.0 means a doubled size.)
         */
        public double scale;

        /**
         * Position on a photo where a mask is placed.
         */
        public MaskPosition() {
        }

        /**
         * Position on a photo where a mask is placed.
         *
         * @param point Part of the face, relative to which the mask is placed.
         * @param xShift Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just to the left of the default mask position.)
         * @param yShift Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. (For example, 1.0 will place the mask just below the default mask position.)
         * @param scale Mask scaling coefficient. (For example, 2.0 means a doubled size.)
         */
        public MaskPosition(MaskPoint point, double xShift, double yShift, double scale) {
            this.point = point;
            this.xShift = xShift;
            this.yShift = yShift;
            this.scale = scale;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2097433026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a message.
     */
    public static class Message extends Object {
        /**
         * Message identifier; unique for the chat to which the message belongs.
         */
        public long id;
        /**
         * Identifier of the sender of the message.
         */
        public MessageSender senderId;
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The sending state of the message; may be null if the message isn't being sent and didn't fail to be sent.
         */
        @Nullable public MessageSendingState sendingState;
        /**
         * The scheduling state of the message; may be null if the message isn't scheduled.
         */
        @Nullable public MessageSchedulingState schedulingState;
        /**
         * True, if the message is outgoing.
         */
        public boolean isOutgoing;
        /**
         * True, if the message is pinned.
         */
        public boolean isPinned;
        /**
         * True, if the message was sent because of a scheduled action by the message sender, for example, as away, or greeting service message.
         */
        public boolean isFromOffline;
        /**
         * True, if the message can be edited. For live location and poll messages this fields shows whether editMessageLiveLocation or stopPoll can be used with this message by the application.
         */
        public boolean canBeEdited;
        /**
         * True, if the message can be forwarded.
         */
        public boolean canBeForwarded;
        /**
         * True, if the message can be replied in another chat or topic.
         */
        public boolean canBeRepliedInAnotherChat;
        /**
         * True, if content of the message can be saved locally or copied.
         */
        public boolean canBeSaved;
        /**
         * True, if the message can be deleted only for the current user while other users will continue to see it.
         */
        public boolean canBeDeletedOnlyForSelf;
        /**
         * True, if the message can be deleted for all users.
         */
        public boolean canBeDeletedForAllUsers;
        /**
         * True, if the list of added reactions is available through getMessageAddedReactions.
         */
        public boolean canGetAddedReactions;
        /**
         * True, if the message statistics are available through getMessageStatistics.
         */
        public boolean canGetStatistics;
        /**
         * True, if information about the message thread is available through getMessageThread and getMessageThreadHistory.
         */
        public boolean canGetMessageThread;
        /**
         * True, if read date of the message can be received through getMessageReadDate.
         */
        public boolean canGetReadDate;
        /**
         * True, if chat members already viewed the message can be received through getMessageViewers.
         */
        public boolean canGetViewers;
        /**
         * True, if media timestamp links can be generated for media timestamp entities in the message text, caption or link preview description through getMessageLink.
         */
        public boolean canGetMediaTimestampLinks;
        /**
         * True, if reactions on the message can be reported through reportMessageReactions.
         */
        public boolean canReportReactions;
        /**
         * True, if media timestamp entities refers to a media in this message as opposed to a media in the replied message.
         */
        public boolean hasTimestampedMedia;
        /**
         * True, if the message is a channel post. All messages to channels are channel posts, all other messages are not channel posts.
         */
        public boolean isChannelPost;
        /**
         * True, if the message is a forum topic message.
         */
        public boolean isTopicMessage;
        /**
         * True, if the message contains an unread mention for the current user.
         */
        public boolean containsUnreadMention;
        /**
         * Point in time (Unix timestamp) when the message was sent.
         */
        public int date;
        /**
         * Point in time (Unix timestamp) when the message was last edited.
         */
        public int editDate;
        /**
         * Information about the initial message sender; may be null if none or unknown.
         */
        @Nullable public MessageForwardInfo forwardInfo;
        /**
         * Information about the initial message for messages created with importMessages; may be null if the message isn't imported.
         */
        @Nullable public MessageImportInfo importInfo;
        /**
         * Information about interactions with the message; may be null if none.
         */
        @Nullable public MessageInteractionInfo interactionInfo;
        /**
         * Information about unread reactions added to the message.
         */
        public UnreadReaction[] unreadReactions;
        /**
         * Information about fact-check added to the message; may be null if none.
         */
        @Nullable public FactCheck factCheck;
        /**
         * Information about the message or the story this message is replying to; may be null if none.
         */
        @Nullable public MessageReplyTo replyTo;
        /**
         * If non-zero, the identifier of the message thread the message belongs to; unique within the chat to which the message belongs.
         */
        public long messageThreadId;
        /**
         * Identifier of the Saved Messages topic for the message; 0 for messages not from Saved Messages.
         */
        public long savedMessagesTopicId;
        /**
         * The message's self-destruct type; may be null if none.
         */
        @Nullable public MessageSelfDestructType selfDestructType;
        /**
         * Time left before the message self-destruct timer expires, in seconds; 0 if self-destruction isn't scheduled yet.
         */
        public double selfDestructIn;
        /**
         * Time left before the message will be automatically deleted by messageAutoDeleteTime setting of the chat, in seconds; 0 if never.
         */
        public double autoDeleteIn;
        /**
         * If non-zero, the user identifier of the inline bot through which this message was sent.
         */
        public long viaBotUserId;
        /**
         * If non-zero, the user identifier of the business bot that sent this message.
         */
        public long senderBusinessBotUserId;
        /**
         * Number of times the sender of the message boosted the supergroup at the time the message was sent; 0 if none or unknown. For messages sent by the current user, supergroupFullInfo.myBoostCount must be used instead.
         */
        public int senderBoostCount;
        /**
         * For channel posts and anonymous group messages, optional author signature.
         */
        public String authorSignature;
        /**
         * Unique identifier of an album this message belongs to; 0 if none. Only audios, documents, photos and videos can be grouped together in albums.
         */
        public long mediaAlbumId;
        /**
         * Unique identifier of the effect added to the message; 0 if none.
         */
        public long effectId;
        /**
         * If non-empty, contains a human-readable description of the reason why access to this message must be restricted.
         */
        public String restrictionReason;
        /**
         * Content of the message.
         */
        public MessageContent content;
        /**
         * Reply markup for the message; may be null if none.
         */
        @Nullable public ReplyMarkup replyMarkup;

        /**
         * Describes a message.
         */
        public Message() {
        }

        /**
         * Describes a message.
         *
         * @param id Message identifier; unique for the chat to which the message belongs.
         * @param senderId Identifier of the sender of the message.
         * @param chatId Chat identifier.
         * @param sendingState The sending state of the message; may be null if the message isn't being sent and didn't fail to be sent.
         * @param schedulingState The scheduling state of the message; may be null if the message isn't scheduled.
         * @param isOutgoing True, if the message is outgoing.
         * @param isPinned True, if the message is pinned.
         * @param isFromOffline True, if the message was sent because of a scheduled action by the message sender, for example, as away, or greeting service message.
         * @param canBeEdited True, if the message can be edited. For live location and poll messages this fields shows whether editMessageLiveLocation or stopPoll can be used with this message by the application.
         * @param canBeForwarded True, if the message can be forwarded.
         * @param canBeRepliedInAnotherChat True, if the message can be replied in another chat or topic.
         * @param canBeSaved True, if content of the message can be saved locally or copied.
         * @param canBeDeletedOnlyForSelf True, if the message can be deleted only for the current user while other users will continue to see it.
         * @param canBeDeletedForAllUsers True, if the message can be deleted for all users.
         * @param canGetAddedReactions True, if the list of added reactions is available through getMessageAddedReactions.
         * @param canGetStatistics True, if the message statistics are available through getMessageStatistics.
         * @param canGetMessageThread True, if information about the message thread is available through getMessageThread and getMessageThreadHistory.
         * @param canGetReadDate True, if read date of the message can be received through getMessageReadDate.
         * @param canGetViewers True, if chat members already viewed the message can be received through getMessageViewers.
         * @param canGetMediaTimestampLinks True, if media timestamp links can be generated for media timestamp entities in the message text, caption or link preview description through getMessageLink.
         * @param canReportReactions True, if reactions on the message can be reported through reportMessageReactions.
         * @param hasTimestampedMedia True, if media timestamp entities refers to a media in this message as opposed to a media in the replied message.
         * @param isChannelPost True, if the message is a channel post. All messages to channels are channel posts, all other messages are not channel posts.
         * @param isTopicMessage True, if the message is a forum topic message.
         * @param containsUnreadMention True, if the message contains an unread mention for the current user.
         * @param date Point in time (Unix timestamp) when the message was sent.
         * @param editDate Point in time (Unix timestamp) when the message was last edited.
         * @param forwardInfo Information about the initial message sender; may be null if none or unknown.
         * @param importInfo Information about the initial message for messages created with importMessages; may be null if the message isn't imported.
         * @param interactionInfo Information about interactions with the message; may be null if none.
         * @param unreadReactions Information about unread reactions added to the message.
         * @param factCheck Information about fact-check added to the message; may be null if none.
         * @param replyTo Information about the message or the story this message is replying to; may be null if none.
         * @param messageThreadId If non-zero, the identifier of the message thread the message belongs to; unique within the chat to which the message belongs.
         * @param savedMessagesTopicId Identifier of the Saved Messages topic for the message; 0 for messages not from Saved Messages.
         * @param selfDestructType The message's self-destruct type; may be null if none.
         * @param selfDestructIn Time left before the message self-destruct timer expires, in seconds; 0 if self-destruction isn't scheduled yet.
         * @param autoDeleteIn Time left before the message will be automatically deleted by messageAutoDeleteTime setting of the chat, in seconds; 0 if never.
         * @param viaBotUserId If non-zero, the user identifier of the inline bot through which this message was sent.
         * @param senderBusinessBotUserId If non-zero, the user identifier of the business bot that sent this message.
         * @param senderBoostCount Number of times the sender of the message boosted the supergroup at the time the message was sent; 0 if none or unknown. For messages sent by the current user, supergroupFullInfo.myBoostCount must be used instead.
         * @param authorSignature For channel posts and anonymous group messages, optional author signature.
         * @param mediaAlbumId Unique identifier of an album this message belongs to; 0 if none. Only audios, documents, photos and videos can be grouped together in albums.
         * @param effectId Unique identifier of the effect added to the message; 0 if none.
         * @param restrictionReason If non-empty, contains a human-readable description of the reason why access to this message must be restricted.
         * @param content Content of the message.
         * @param replyMarkup Reply markup for the message; may be null if none.
         */
        public Message(long id, MessageSender senderId, long chatId, MessageSendingState sendingState, MessageSchedulingState schedulingState, boolean isOutgoing, boolean isPinned, boolean isFromOffline, boolean canBeEdited, boolean canBeForwarded, boolean canBeRepliedInAnotherChat, boolean canBeSaved, boolean canBeDeletedOnlyForSelf, boolean canBeDeletedForAllUsers, boolean canGetAddedReactions, boolean canGetStatistics, boolean canGetMessageThread, boolean canGetReadDate, boolean canGetViewers, boolean canGetMediaTimestampLinks, boolean canReportReactions, boolean hasTimestampedMedia, boolean isChannelPost, boolean isTopicMessage, boolean containsUnreadMention, int date, int editDate, MessageForwardInfo forwardInfo, MessageImportInfo importInfo, MessageInteractionInfo interactionInfo, UnreadReaction[] unreadReactions, FactCheck factCheck, MessageReplyTo replyTo, long messageThreadId, long savedMessagesTopicId, MessageSelfDestructType selfDestructType, double selfDestructIn, double autoDeleteIn, long viaBotUserId, long senderBusinessBotUserId, int senderBoostCount, String authorSignature, long mediaAlbumId, long effectId, String restrictionReason, MessageContent content, ReplyMarkup replyMarkup) {
            this.id = id;
            this.senderId = senderId;
            this.chatId = chatId;
            this.sendingState = sendingState;
            this.schedulingState = schedulingState;
            this.isOutgoing = isOutgoing;
            this.isPinned = isPinned;
            this.isFromOffline = isFromOffline;
            this.canBeEdited = canBeEdited;
            this.canBeForwarded = canBeForwarded;
            this.canBeRepliedInAnotherChat = canBeRepliedInAnotherChat;
            this.canBeSaved = canBeSaved;
            this.canBeDeletedOnlyForSelf = canBeDeletedOnlyForSelf;
            this.canBeDeletedForAllUsers = canBeDeletedForAllUsers;
            this.canGetAddedReactions = canGetAddedReactions;
            this.canGetStatistics = canGetStatistics;
            this.canGetMessageThread = canGetMessageThread;
            this.canGetReadDate = canGetReadDate;
            this.canGetViewers = canGetViewers;
            this.canGetMediaTimestampLinks = canGetMediaTimestampLinks;
            this.canReportReactions = canReportReactions;
            this.hasTimestampedMedia = hasTimestampedMedia;
            this.isChannelPost = isChannelPost;
            this.isTopicMessage = isTopicMessage;
            this.containsUnreadMention = containsUnreadMention;
            this.date = date;
            this.editDate = editDate;
            this.forwardInfo = forwardInfo;
            this.importInfo = importInfo;
            this.interactionInfo = interactionInfo;
            this.unreadReactions = unreadReactions;
            this.factCheck = factCheck;
            this.replyTo = replyTo;
            this.messageThreadId = messageThreadId;
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.selfDestructType = selfDestructType;
            this.selfDestructIn = selfDestructIn;
            this.autoDeleteIn = autoDeleteIn;
            this.viaBotUserId = viaBotUserId;
            this.senderBusinessBotUserId = senderBusinessBotUserId;
            this.senderBoostCount = senderBoostCount;
            this.authorSignature = authorSignature;
            this.mediaAlbumId = mediaAlbumId;
            this.effectId = effectId;
            this.restrictionReason = restrictionReason;
            this.content = content;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 825215980;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains default auto-delete timer setting for new chats.
     */
    public static class MessageAutoDeleteTime extends Object {
        /**
         * Message auto-delete time, in seconds. If 0, then messages aren't deleted automatically.
         */
        public int time;

        /**
         * Contains default auto-delete timer setting for new chats.
         */
        public MessageAutoDeleteTime() {
        }

        /**
         * Contains default auto-delete timer setting for new chats.
         *
         * @param time Message auto-delete time, in seconds. If 0, then messages aren't deleted automatically.
         */
        public MessageAutoDeleteTime(int time) {
            this.time = time;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1972045589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about found messages, split by days according to the option &quot;utc_time_offset&quot;.
     */
    public static class MessageCalendar extends Object {
        /**
         * Total number of found messages.
         */
        public int totalCount;
        /**
         * Information about messages sent.
         */
        public MessageCalendarDay[] days;

        /**
         * Contains information about found messages, split by days according to the option &quot;utc_time_offset&quot;.
         */
        public MessageCalendar() {
        }

        /**
         * Contains information about found messages, split by days according to the option &quot;utc_time_offset&quot;.
         *
         * @param totalCount Total number of found messages.
         * @param days Information about messages sent.
         */
        public MessageCalendar(int totalCount, MessageCalendarDay[] days) {
            this.totalCount = totalCount;
            this.days = days;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1682890519;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about found messages sent on a specific day.
     */
    public static class MessageCalendarDay extends Object {
        /**
         * Total number of found messages sent on the day.
         */
        public int totalCount;
        /**
         * First message sent on the day.
         */
        public Message message;

        /**
         * Contains information about found messages sent on a specific day.
         */
        public MessageCalendarDay() {
        }

        /**
         * Contains information about found messages sent on a specific day.
         *
         * @param totalCount Total number of found messages sent on the day.
         * @param message First message sent on the day.
         */
        public MessageCalendarDay(int totalCount, Message message) {
            this.totalCount = totalCount;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -376467614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the content of a message.
     */
    public abstract static class MessageContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageText.CONSTRUCTOR,
            MessageAnimation.CONSTRUCTOR,
            MessageAudio.CONSTRUCTOR,
            MessageDocument.CONSTRUCTOR,
            MessagePaidMedia.CONSTRUCTOR,
            MessagePhoto.CONSTRUCTOR,
            MessageSticker.CONSTRUCTOR,
            MessageVideo.CONSTRUCTOR,
            MessageVideoNote.CONSTRUCTOR,
            MessageVoiceNote.CONSTRUCTOR,
            MessageExpiredPhoto.CONSTRUCTOR,
            MessageExpiredVideo.CONSTRUCTOR,
            MessageExpiredVideoNote.CONSTRUCTOR,
            MessageExpiredVoiceNote.CONSTRUCTOR,
            MessageLocation.CONSTRUCTOR,
            MessageVenue.CONSTRUCTOR,
            MessageContact.CONSTRUCTOR,
            MessageAnimatedEmoji.CONSTRUCTOR,
            MessageDice.CONSTRUCTOR,
            MessageGame.CONSTRUCTOR,
            MessagePoll.CONSTRUCTOR,
            MessageStory.CONSTRUCTOR,
            MessageInvoice.CONSTRUCTOR,
            MessageCall.CONSTRUCTOR,
            MessageVideoChatScheduled.CONSTRUCTOR,
            MessageVideoChatStarted.CONSTRUCTOR,
            MessageVideoChatEnded.CONSTRUCTOR,
            MessageInviteVideoChatParticipants.CONSTRUCTOR,
            MessageBasicGroupChatCreate.CONSTRUCTOR,
            MessageSupergroupChatCreate.CONSTRUCTOR,
            MessageChatChangeTitle.CONSTRUCTOR,
            MessageChatChangePhoto.CONSTRUCTOR,
            MessageChatDeletePhoto.CONSTRUCTOR,
            MessageChatAddMembers.CONSTRUCTOR,
            MessageChatJoinByLink.CONSTRUCTOR,
            MessageChatJoinByRequest.CONSTRUCTOR,
            MessageChatDeleteMember.CONSTRUCTOR,
            MessageChatUpgradeTo.CONSTRUCTOR,
            MessageChatUpgradeFrom.CONSTRUCTOR,
            MessagePinMessage.CONSTRUCTOR,
            MessageScreenshotTaken.CONSTRUCTOR,
            MessageChatSetBackground.CONSTRUCTOR,
            MessageChatSetTheme.CONSTRUCTOR,
            MessageChatSetMessageAutoDeleteTime.CONSTRUCTOR,
            MessageChatBoost.CONSTRUCTOR,
            MessageForumTopicCreated.CONSTRUCTOR,
            MessageForumTopicEdited.CONSTRUCTOR,
            MessageForumTopicIsClosedToggled.CONSTRUCTOR,
            MessageForumTopicIsHiddenToggled.CONSTRUCTOR,
            MessageSuggestProfilePhoto.CONSTRUCTOR,
            MessageCustomServiceAction.CONSTRUCTOR,
            MessageGameScore.CONSTRUCTOR,
            MessagePaymentSuccessful.CONSTRUCTOR,
            MessagePaymentSuccessfulBot.CONSTRUCTOR,
            MessagePaymentRefunded.CONSTRUCTOR,
            MessageGiftedPremium.CONSTRUCTOR,
            MessagePremiumGiftCode.CONSTRUCTOR,
            MessagePremiumGiveawayCreated.CONSTRUCTOR,
            MessagePremiumGiveaway.CONSTRUCTOR,
            MessagePremiumGiveawayCompleted.CONSTRUCTOR,
            MessagePremiumGiveawayWinners.CONSTRUCTOR,
            MessageContactRegistered.CONSTRUCTOR,
            MessageUsersShared.CONSTRUCTOR,
            MessageChatShared.CONSTRUCTOR,
            MessageBotWriteAccessAllowed.CONSTRUCTOR,
            MessageWebAppDataSent.CONSTRUCTOR,
            MessageWebAppDataReceived.CONSTRUCTOR,
            MessagePassportDataSent.CONSTRUCTOR,
            MessagePassportDataReceived.CONSTRUCTOR,
            MessageProximityAlertTriggered.CONSTRUCTOR,
            MessageUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageContent() {
        }
    }

    /**
     * A text message.
     */
    public static class MessageText extends MessageContent {
        /**
         * Text of the message.
         */
        public FormattedText text;
        /**
         * A link preview attached to the message; may be null.
         */
        @Nullable public LinkPreview linkPreview;
        /**
         * Options which were used for generation of the link preview; may be null if default options were used.
         */
        @Nullable public LinkPreviewOptions linkPreviewOptions;

        /**
         * A text message.
         */
        public MessageText() {
        }

        /**
         * A text message.
         *
         * @param text Text of the message.
         * @param linkPreview A link preview attached to the message; may be null.
         * @param linkPreviewOptions Options which were used for generation of the link preview; may be null if default options were used.
         */
        public MessageText(FormattedText text, LinkPreview linkPreview, LinkPreviewOptions linkPreviewOptions) {
            this.text = text;
            this.linkPreview = linkPreview;
            this.linkPreviewOptions = linkPreviewOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1751469188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation message (GIF-style).
     */
    public static class MessageAnimation extends MessageContent {
        /**
         * The animation description.
         */
        public Animation animation;
        /**
         * Animation caption.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the animation; otherwise, the caption must be shown below the animation.
         */
        public boolean showCaptionAboveMedia;
        /**
         * True, if the animation preview must be covered by a spoiler animation.
         */
        public boolean hasSpoiler;
        /**
         * True, if the animation thumbnail must be blurred and the animation must be shown only while tapped.
         */
        public boolean isSecret;

        /**
         * An animation message (GIF-style).
         */
        public MessageAnimation() {
        }

        /**
         * An animation message (GIF-style).
         *
         * @param animation The animation description.
         * @param caption Animation caption.
         * @param showCaptionAboveMedia True, if the caption must be shown above the animation; otherwise, the caption must be shown below the animation.
         * @param hasSpoiler True, if the animation preview must be covered by a spoiler animation.
         * @param isSecret True, if the animation thumbnail must be blurred and the animation must be shown only while tapped.
         */
        public MessageAnimation(Animation animation, FormattedText caption, boolean showCaptionAboveMedia, boolean hasSpoiler, boolean isSecret) {
            this.animation = animation;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.hasSpoiler = hasSpoiler;
            this.isSecret = isSecret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1899294424;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An audio message.
     */
    public static class MessageAudio extends MessageContent {
        /**
         * The audio description.
         */
        public Audio audio;
        /**
         * Audio caption.
         */
        public FormattedText caption;

        /**
         * An audio message.
         */
        public MessageAudio() {
        }

        /**
         * An audio message.
         *
         * @param audio The audio description.
         * @param caption Audio caption.
         */
        public MessageAudio(Audio audio, FormattedText caption) {
            this.audio = audio;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 276722716;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A document message (general file).
     */
    public static class MessageDocument extends MessageContent {
        /**
         * The document description.
         */
        public Document document;
        /**
         * Document caption.
         */
        public FormattedText caption;

        /**
         * A document message (general file).
         */
        public MessageDocument() {
        }

        /**
         * A document message (general file).
         *
         * @param document The document description.
         * @param caption Document caption.
         */
        public MessageDocument(Document document, FormattedText caption) {
            this.document = document;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 596945783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with paid media.
     */
    public static class MessagePaidMedia extends MessageContent {
        /**
         * Number of stars needed to buy access to the media in the message.
         */
        public long starCount;
        /**
         * Information about the media.
         */
        public PaidMedia[] media;
        /**
         * Media caption.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the media; otherwise, the caption must be shown below the media.
         */
        public boolean showCaptionAboveMedia;

        /**
         * A message with paid media.
         */
        public MessagePaidMedia() {
        }

        /**
         * A message with paid media.
         *
         * @param starCount Number of stars needed to buy access to the media in the message.
         * @param media Information about the media.
         * @param caption Media caption.
         * @param showCaptionAboveMedia True, if the caption must be shown above the media; otherwise, the caption must be shown below the media.
         */
        public MessagePaidMedia(long starCount, PaidMedia[] media, FormattedText caption, boolean showCaptionAboveMedia) {
            this.starCount = starCount;
            this.media = media;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -724750073;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A photo message.
     */
    public static class MessagePhoto extends MessageContent {
        /**
         * The photo.
         */
        public Photo photo;
        /**
         * Photo caption.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the photo; otherwise, the caption must be shown below the photo.
         */
        public boolean showCaptionAboveMedia;
        /**
         * True, if the photo preview must be covered by a spoiler animation.
         */
        public boolean hasSpoiler;
        /**
         * True, if the photo must be blurred and must be shown only while tapped.
         */
        public boolean isSecret;

        /**
         * A photo message.
         */
        public MessagePhoto() {
        }

        /**
         * A photo message.
         *
         * @param photo The photo.
         * @param caption Photo caption.
         * @param showCaptionAboveMedia True, if the caption must be shown above the photo; otherwise, the caption must be shown below the photo.
         * @param hasSpoiler True, if the photo preview must be covered by a spoiler animation.
         * @param isSecret True, if the photo must be blurred and must be shown only while tapped.
         */
        public MessagePhoto(Photo photo, FormattedText caption, boolean showCaptionAboveMedia, boolean hasSpoiler, boolean isSecret) {
            this.photo = photo;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.hasSpoiler = hasSpoiler;
            this.isSecret = isSecret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1967947295;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker message.
     */
    public static class MessageSticker extends MessageContent {
        /**
         * The sticker description.
         */
        public Sticker sticker;
        /**
         * True, if premium animation of the sticker must be played.
         */
        public boolean isPremium;

        /**
         * A sticker message.
         */
        public MessageSticker() {
        }

        /**
         * A sticker message.
         *
         * @param sticker The sticker description.
         * @param isPremium True, if premium animation of the sticker must be played.
         */
        public MessageSticker(Sticker sticker, boolean isPremium) {
            this.sticker = sticker;
            this.isPremium = isPremium;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -437199670;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video message.
     */
    public static class MessageVideo extends MessageContent {
        /**
         * The video description.
         */
        public Video video;
        /**
         * Video caption.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the video; otherwise, the caption must be shown below the video.
         */
        public boolean showCaptionAboveMedia;
        /**
         * True, if the video preview must be covered by a spoiler animation.
         */
        public boolean hasSpoiler;
        /**
         * True, if the video thumbnail must be blurred and the video must be shown only while tapped.
         */
        public boolean isSecret;

        /**
         * A video message.
         */
        public MessageVideo() {
        }

        /**
         * A video message.
         *
         * @param video The video description.
         * @param caption Video caption.
         * @param showCaptionAboveMedia True, if the caption must be shown above the video; otherwise, the caption must be shown below the video.
         * @param hasSpoiler True, if the video preview must be covered by a spoiler animation.
         * @param isSecret True, if the video thumbnail must be blurred and the video must be shown only while tapped.
         */
        public MessageVideo(Video video, FormattedText caption, boolean showCaptionAboveMedia, boolean hasSpoiler, boolean isSecret) {
            this.video = video;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.hasSpoiler = hasSpoiler;
            this.isSecret = isSecret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1379746295;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video note message.
     */
    public static class MessageVideoNote extends MessageContent {
        /**
         * The video note description.
         */
        public VideoNote videoNote;
        /**
         * True, if at least one of the recipients has viewed the video note.
         */
        public boolean isViewed;
        /**
         * True, if the video note thumbnail must be blurred and the video note must be shown only while tapped.
         */
        public boolean isSecret;

        /**
         * A video note message.
         */
        public MessageVideoNote() {
        }

        /**
         * A video note message.
         *
         * @param videoNote The video note description.
         * @param isViewed True, if at least one of the recipients has viewed the video note.
         * @param isSecret True, if the video note thumbnail must be blurred and the video note must be shown only while tapped.
         */
        public MessageVideoNote(VideoNote videoNote, boolean isViewed, boolean isSecret) {
            this.videoNote = videoNote;
            this.isViewed = isViewed;
            this.isSecret = isSecret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 963323014;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A voice note message.
     */
    public static class MessageVoiceNote extends MessageContent {
        /**
         * The voice note description.
         */
        public VoiceNote voiceNote;
        /**
         * Voice note caption.
         */
        public FormattedText caption;
        /**
         * True, if at least one of the recipients has listened to the voice note.
         */
        public boolean isListened;

        /**
         * A voice note message.
         */
        public MessageVoiceNote() {
        }

        /**
         * A voice note message.
         *
         * @param voiceNote The voice note description.
         * @param caption Voice note caption.
         * @param isListened True, if at least one of the recipients has listened to the voice note.
         */
        public MessageVoiceNote(VoiceNote voiceNote, FormattedText caption, boolean isListened) {
            this.voiceNote = voiceNote;
            this.caption = caption;
            this.isListened = isListened;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 527777781;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A self-destructed photo message.
     */
    public static class MessageExpiredPhoto extends MessageContent {

        /**
         * A self-destructed photo message.
         */
        public MessageExpiredPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1404641801;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A self-destructed video message.
     */
    public static class MessageExpiredVideo extends MessageContent {

        /**
         * A self-destructed video message.
         */
        public MessageExpiredVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1212209981;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A self-destructed video note message.
     */
    public static class MessageExpiredVideoNote extends MessageContent {

        /**
         * A self-destructed video note message.
         */
        public MessageExpiredVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 599540711;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A self-destructed voice note message.
     */
    public static class MessageExpiredVoiceNote extends MessageContent {

        /**
         * A self-destructed voice note message.
         */
        public MessageExpiredVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 143684989;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a location.
     */
    public static class MessageLocation extends MessageContent {
        /**
         * The location description.
         */
        public Location location;
        /**
         * Time relative to the message send date, for which the location can be updated, in seconds; if 0x7FFFFFFF, then location can be updated forever.
         */
        public int livePeriod;
        /**
         * Left time for which the location can be updated, in seconds. If 0, then the location can't be updated anymore. The update updateMessageContent is not sent when this field changes.
         */
        public int expiresIn;
        /**
         * For live locations, a direction in which the location moves, in degrees; 1-360. If 0 the direction is unknown.
         */
        public int heading;
        /**
         * For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000). 0 if the notification is disabled. Available only to the message sender.
         */
        public int proximityAlertRadius;

        /**
         * A message with a location.
         */
        public MessageLocation() {
        }

        /**
         * A message with a location.
         *
         * @param location The location description.
         * @param livePeriod Time relative to the message send date, for which the location can be updated, in seconds; if 0x7FFFFFFF, then location can be updated forever.
         * @param expiresIn Left time for which the location can be updated, in seconds. If 0, then the location can't be updated anymore. The update updateMessageContent is not sent when this field changes.
         * @param heading For live locations, a direction in which the location moves, in degrees; 1-360. If 0 the direction is unknown.
         * @param proximityAlertRadius For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000). 0 if the notification is disabled. Available only to the message sender.
         */
        public MessageLocation(Location location, int livePeriod, int expiresIn, int heading, int proximityAlertRadius) {
            this.location = location;
            this.livePeriod = livePeriod;
            this.expiresIn = expiresIn;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 303973492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about a venue.
     */
    public static class MessageVenue extends MessageContent {
        /**
         * The venue description.
         */
        public Venue venue;

        /**
         * A message with information about a venue.
         */
        public MessageVenue() {
        }

        /**
         * A message with information about a venue.
         *
         * @param venue The venue description.
         */
        public MessageVenue(Venue venue) {
            this.venue = venue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2146492043;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a user contact.
     */
    public static class MessageContact extends MessageContent {
        /**
         * The contact description.
         */
        public Contact contact;

        /**
         * A message with a user contact.
         */
        public MessageContact() {
        }

        /**
         * A message with a user contact.
         *
         * @param contact The contact description.
         */
        public MessageContact(Contact contact) {
            this.contact = contact;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -512684966;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an animated emoji.
     */
    public static class MessageAnimatedEmoji extends MessageContent {
        /**
         * The animated emoji.
         */
        public AnimatedEmoji animatedEmoji;
        /**
         * The corresponding emoji.
         */
        public String emoji;

        /**
         * A message with an animated emoji.
         */
        public MessageAnimatedEmoji() {
        }

        /**
         * A message with an animated emoji.
         *
         * @param animatedEmoji The animated emoji.
         * @param emoji The corresponding emoji.
         */
        public MessageAnimatedEmoji(AnimatedEmoji animatedEmoji, String emoji) {
            this.animatedEmoji = animatedEmoji;
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 908195298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A dice message. The dice value is randomly generated by the server.
     */
    public static class MessageDice extends MessageContent {
        /**
         * The animated stickers with the initial dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         */
        @Nullable public DiceStickers initialState;
        /**
         * The animated stickers with the final dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         */
        @Nullable public DiceStickers finalState;
        /**
         * Emoji on which the dice throw animation is based.
         */
        public String emoji;
        /**
         * The dice value. If the value is 0, the dice don't have final state yet.
         */
        public int value;
        /**
         * Number of frame after which a success animation like a shower of confetti needs to be shown on updateMessageSendSucceeded.
         */
        public int successAnimationFrameNumber;

        /**
         * A dice message. The dice value is randomly generated by the server.
         */
        public MessageDice() {
        }

        /**
         * A dice message. The dice value is randomly generated by the server.
         *
         * @param initialState The animated stickers with the initial dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         * @param finalState The animated stickers with the final dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         * @param emoji Emoji on which the dice throw animation is based.
         * @param value The dice value. If the value is 0, the dice don't have final state yet.
         * @param successAnimationFrameNumber Number of frame after which a success animation like a shower of confetti needs to be shown on updateMessageSendSucceeded.
         */
        public MessageDice(DiceStickers initialState, DiceStickers finalState, String emoji, int value, int successAnimationFrameNumber) {
            this.initialState = initialState;
            this.finalState = finalState;
            this.emoji = emoji;
            this.value = value;
            this.successAnimationFrameNumber = successAnimationFrameNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1115779641;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a game.
     */
    public static class MessageGame extends MessageContent {
        /**
         * The game description.
         */
        public Game game;

        /**
         * A message with a game.
         */
        public MessageGame() {
        }

        /**
         * A message with a game.
         *
         * @param game The game description.
         */
        public MessageGame(Game game) {
            this.game = game;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -69441162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a poll.
     */
    public static class MessagePoll extends MessageContent {
        /**
         * The poll description.
         */
        public Poll poll;

        /**
         * A message with a poll.
         */
        public MessagePoll() {
        }

        /**
         * A message with a poll.
         *
         * @param poll The poll description.
         */
        public MessagePoll(Poll poll) {
            this.poll = poll;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -662130099;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a forwarded story.
     */
    public static class MessageStory extends MessageContent {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storySenderChatId;
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * True, if the story was automatically forwarded because of a mention of the user.
         */
        public boolean viaMention;

        /**
         * A message with a forwarded story.
         */
        public MessageStory() {
        }

        /**
         * A message with a forwarded story.
         *
         * @param storySenderChatId Identifier of the chat that posted the story.
         * @param storyId Story identifier.
         * @param viaMention True, if the story was automatically forwarded because of a mention of the user.
         */
        public MessageStory(long storySenderChatId, int storyId, boolean viaMention) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
            this.viaMention = viaMention;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 858387156;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an invoice from a bot. Use getInternalLink with internalLinkTypeBotStart to share the invoice.
     */
    public static class MessageInvoice extends MessageContent {
        /**
         * Information about the product.
         */
        public ProductInfo productInfo;
        /**
         * Currency for the product price.
         */
        public String currency;
        /**
         * Product total price in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * Unique invoice bot startParameter to be passed to getInternalLink.
         */
        public String startParameter;
        /**
         * True, if the invoice is a test invoice.
         */
        public boolean isTest;
        /**
         * True, if the shipping address must be specified.
         */
        public boolean needShippingAddress;
        /**
         * The identifier of the message with the receipt, after the product has been purchased.
         */
        public long receiptMessageId;
        /**
         * Extended media attached to the invoice; may be null if none.
         */
        @Nullable public PaidMedia paidMedia;
        /**
         * Extended media caption; may be null if none.
         */
        @Nullable public FormattedText paidMediaCaption;

        /**
         * A message with an invoice from a bot. Use getInternalLink with internalLinkTypeBotStart to share the invoice.
         */
        public MessageInvoice() {
        }

        /**
         * A message with an invoice from a bot. Use getInternalLink with internalLinkTypeBotStart to share the invoice.
         *
         * @param productInfo Information about the product.
         * @param currency Currency for the product price.
         * @param totalAmount Product total price in the smallest units of the currency.
         * @param startParameter Unique invoice bot startParameter to be passed to getInternalLink.
         * @param isTest True, if the invoice is a test invoice.
         * @param needShippingAddress True, if the shipping address must be specified.
         * @param receiptMessageId The identifier of the message with the receipt, after the product has been purchased.
         * @param paidMedia Extended media attached to the invoice; may be null if none.
         * @param paidMediaCaption Extended media caption; may be null if none.
         */
        public MessageInvoice(ProductInfo productInfo, String currency, long totalAmount, String startParameter, boolean isTest, boolean needShippingAddress, long receiptMessageId, PaidMedia paidMedia, FormattedText paidMediaCaption) {
            this.productInfo = productInfo;
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.startParameter = startParameter;
            this.isTest = isTest;
            this.needShippingAddress = needShippingAddress;
            this.receiptMessageId = receiptMessageId;
            this.paidMedia = paidMedia;
            this.paidMediaCaption = paidMediaCaption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 263060806;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about an ended call.
     */
    public static class MessageCall extends MessageContent {
        /**
         * True, if the call was a video call.
         */
        public boolean isVideo;
        /**
         * Reason why the call was discarded.
         */
        public CallDiscardReason discardReason;
        /**
         * Call duration, in seconds.
         */
        public int duration;

        /**
         * A message with information about an ended call.
         */
        public MessageCall() {
        }

        /**
         * A message with information about an ended call.
         *
         * @param isVideo True, if the call was a video call.
         * @param discardReason Reason why the call was discarded.
         * @param duration Call duration, in seconds.
         */
        public MessageCall(boolean isVideo, CallDiscardReason discardReason, int duration) {
            this.isVideo = isVideo;
            this.discardReason = discardReason;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 538893824;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new video chat was scheduled.
     */
    public static class MessageVideoChatScheduled extends MessageContent {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;
        /**
         * Point in time (Unix timestamp) when the group call is supposed to be started by an administrator.
         */
        public int startDate;

        /**
         * A new video chat was scheduled.
         */
        public MessageVideoChatScheduled() {
        }

        /**
         * A new video chat was scheduled.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         * @param startDate Point in time (Unix timestamp) when the group call is supposed to be started by an administrator.
         */
        public MessageVideoChatScheduled(int groupCallId, int startDate) {
            this.groupCallId = groupCallId;
            this.startDate = startDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1855185481;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A newly created video chat.
     */
    public static class MessageVideoChatStarted extends MessageContent {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;

        /**
         * A newly created video chat.
         */
        public MessageVideoChatStarted() {
        }

        /**
         * A newly created video chat.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public MessageVideoChatStarted(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 521225561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about an ended video chat.
     */
    public static class MessageVideoChatEnded extends MessageContent {
        /**
         * Call duration, in seconds.
         */
        public int duration;

        /**
         * A message with information about an ended video chat.
         */
        public MessageVideoChatEnded() {
        }

        /**
         * A message with information about an ended video chat.
         *
         * @param duration Call duration, in seconds.
         */
        public MessageVideoChatEnded(int duration) {
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2032544855;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about an invitation to a video chat.
     */
    public static class MessageInviteVideoChatParticipants extends MessageContent {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;
        /**
         * Invited user identifiers.
         */
        public long[] userIds;

        /**
         * A message with information about an invitation to a video chat.
         */
        public MessageInviteVideoChatParticipants() {
        }

        /**
         * A message with information about an invitation to a video chat.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         * @param userIds Invited user identifiers.
         */
        public MessageInviteVideoChatParticipants(int groupCallId, long[] userIds) {
            this.groupCallId = groupCallId;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1459065585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A newly created basic group.
     */
    public static class MessageBasicGroupChatCreate extends MessageContent {
        /**
         * Title of the basic group.
         */
        public String title;
        /**
         * User identifiers of members in the basic group.
         */
        public long[] memberUserIds;

        /**
         * A newly created basic group.
         */
        public MessageBasicGroupChatCreate() {
        }

        /**
         * A newly created basic group.
         *
         * @param title Title of the basic group.
         * @param memberUserIds User identifiers of members in the basic group.
         */
        public MessageBasicGroupChatCreate(String title, long[] memberUserIds) {
            this.title = title;
            this.memberUserIds = memberUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 795404060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A newly created supergroup or channel.
     */
    public static class MessageSupergroupChatCreate extends MessageContent {
        /**
         * Title of the supergroup or channel.
         */
        public String title;

        /**
         * A newly created supergroup or channel.
         */
        public MessageSupergroupChatCreate() {
        }

        /**
         * A newly created supergroup or channel.
         *
         * @param title Title of the supergroup or channel.
         */
        public MessageSupergroupChatCreate(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -434325733;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An updated chat title.
     */
    public static class MessageChatChangeTitle extends MessageContent {
        /**
         * New chat title.
         */
        public String title;

        /**
         * An updated chat title.
         */
        public MessageChatChangeTitle() {
        }

        /**
         * An updated chat title.
         *
         * @param title New chat title.
         */
        public MessageChatChangeTitle(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 748272449;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An updated chat photo.
     */
    public static class MessageChatChangePhoto extends MessageContent {
        /**
         * New chat photo.
         */
        public ChatPhoto photo;

        /**
         * An updated chat photo.
         */
        public MessageChatChangePhoto() {
        }

        /**
         * An updated chat photo.
         *
         * @param photo New chat photo.
         */
        public MessageChatChangePhoto(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -813415093;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A deleted chat photo.
     */
    public static class MessageChatDeletePhoto extends MessageContent {

        /**
         * A deleted chat photo.
         */
        public MessageChatDeletePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -184374809;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New chat members were added.
     */
    public static class MessageChatAddMembers extends MessageContent {
        /**
         * User identifiers of the new members.
         */
        public long[] memberUserIds;

        /**
         * New chat members were added.
         */
        public MessageChatAddMembers() {
        }

        /**
         * New chat members were added.
         *
         * @param memberUserIds User identifiers of the new members.
         */
        public MessageChatAddMembers(long[] memberUserIds) {
            this.memberUserIds = memberUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1701117908;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member joined the chat via an invite link.
     */
    public static class MessageChatJoinByLink extends MessageContent {

        /**
         * A new member joined the chat via an invite link.
         */
        public MessageChatJoinByLink() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1846493311;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member was accepted to the chat by an administrator.
     */
    public static class MessageChatJoinByRequest extends MessageContent {

        /**
         * A new member was accepted to the chat by an administrator.
         */
        public MessageChatJoinByRequest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1195428732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member was deleted.
     */
    public static class MessageChatDeleteMember extends MessageContent {
        /**
         * User identifier of the deleted chat member.
         */
        public long userId;

        /**
         * A chat member was deleted.
         */
        public MessageChatDeleteMember() {
        }

        /**
         * A chat member was deleted.
         *
         * @param userId User identifier of the deleted chat member.
         */
        public MessageChatDeleteMember(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 938029481;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A basic group was upgraded to a supergroup and was deactivated as the result.
     */
    public static class MessageChatUpgradeTo extends MessageContent {
        /**
         * Identifier of the supergroup to which the basic group was upgraded.
         */
        public long supergroupId;

        /**
         * A basic group was upgraded to a supergroup and was deactivated as the result.
         */
        public MessageChatUpgradeTo() {
        }

        /**
         * A basic group was upgraded to a supergroup and was deactivated as the result.
         *
         * @param supergroupId Identifier of the supergroup to which the basic group was upgraded.
         */
        public MessageChatUpgradeTo(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 104813723;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A supergroup has been created from a basic group.
     */
    public static class MessageChatUpgradeFrom extends MessageContent {
        /**
         * Title of the newly created supergroup.
         */
        public String title;
        /**
         * The identifier of the original basic group.
         */
        public long basicGroupId;

        /**
         * A supergroup has been created from a basic group.
         */
        public MessageChatUpgradeFrom() {
        }

        /**
         * A supergroup has been created from a basic group.
         *
         * @param title Title of the newly created supergroup.
         * @param basicGroupId The identifier of the original basic group.
         */
        public MessageChatUpgradeFrom(String title, long basicGroupId) {
            this.title = title;
            this.basicGroupId = basicGroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 325954268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message has been pinned.
     */
    public static class MessagePinMessage extends MessageContent {
        /**
         * Identifier of the pinned message, can be an identifier of a deleted message or 0.
         */
        public long messageId;

        /**
         * A message has been pinned.
         */
        public MessagePinMessage() {
        }

        /**
         * A message has been pinned.
         *
         * @param messageId Identifier of the pinned message, can be an identifier of a deleted message or 0.
         */
        public MessagePinMessage(long messageId) {
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 953503801;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A screenshot of a message in the chat has been taken.
     */
    public static class MessageScreenshotTaken extends MessageContent {

        /**
         * A screenshot of a message in the chat has been taken.
         */
        public MessageScreenshotTaken() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1564971605;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new background was set in the chat.
     */
    public static class MessageChatSetBackground extends MessageContent {
        /**
         * Identifier of the message with a previously set same background; 0 if none. Can be an identifier of a deleted message.
         */
        public long oldBackgroundMessageId;
        /**
         * The new background.
         */
        public ChatBackground background;
        /**
         * True, if the background was set only for self.
         */
        public boolean onlyForSelf;

        /**
         * A new background was set in the chat.
         */
        public MessageChatSetBackground() {
        }

        /**
         * A new background was set in the chat.
         *
         * @param oldBackgroundMessageId Identifier of the message with a previously set same background; 0 if none. Can be an identifier of a deleted message.
         * @param background The new background.
         * @param onlyForSelf True, if the background was set only for self.
         */
        public MessageChatSetBackground(long oldBackgroundMessageId, ChatBackground background, boolean onlyForSelf) {
            this.oldBackgroundMessageId = oldBackgroundMessageId;
            this.background = background;
            this.onlyForSelf = onlyForSelf;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1029536832;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A theme in the chat has been changed.
     */
    public static class MessageChatSetTheme extends MessageContent {
        /**
         * If non-empty, name of a new theme, set for the chat. Otherwise, chat theme was reset to the default one.
         */
        public String themeName;

        /**
         * A theme in the chat has been changed.
         */
        public MessageChatSetTheme() {
        }

        /**
         * A theme in the chat has been changed.
         *
         * @param themeName If non-empty, name of a new theme, set for the chat. Otherwise, chat theme was reset to the default one.
         */
        public MessageChatSetTheme(String themeName) {
            this.themeName = themeName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1716612088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The auto-delete or self-destruct timer for messages in the chat has been changed.
     */
    public static class MessageChatSetMessageAutoDeleteTime extends MessageContent {
        /**
         * New value auto-delete or self-destruct time, in seconds; 0 if disabled.
         */
        public int messageAutoDeleteTime;
        /**
         * If not 0, a user identifier, which default setting was automatically applied.
         */
        public long fromUserId;

        /**
         * The auto-delete or self-destruct timer for messages in the chat has been changed.
         */
        public MessageChatSetMessageAutoDeleteTime() {
        }

        /**
         * The auto-delete or self-destruct timer for messages in the chat has been changed.
         *
         * @param messageAutoDeleteTime New value auto-delete or self-destruct time, in seconds; 0 if disabled.
         * @param fromUserId If not 0, a user identifier, which default setting was automatically applied.
         */
        public MessageChatSetMessageAutoDeleteTime(int messageAutoDeleteTime, long fromUserId) {
            this.messageAutoDeleteTime = messageAutoDeleteTime;
            this.fromUserId = fromUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1637745966;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat was boosted by the sender of the message.
     */
    public static class MessageChatBoost extends MessageContent {
        /**
         * Number of times the chat was boosted.
         */
        public int boostCount;

        /**
         * The chat was boosted by the sender of the message.
         */
        public MessageChatBoost() {
        }

        /**
         * The chat was boosted by the sender of the message.
         *
         * @param boostCount Number of times the chat was boosted.
         */
        public MessageChatBoost(int boostCount) {
            this.boostCount = boostCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1583310219;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic has been created.
     */
    public static class MessageForumTopicCreated extends MessageContent {
        /**
         * Name of the topic.
         */
        public String name;
        /**
         * Icon of the topic.
         */
        public ForumTopicIcon icon;

        /**
         * A forum topic has been created.
         */
        public MessageForumTopicCreated() {
        }

        /**
         * A forum topic has been created.
         *
         * @param name Name of the topic.
         * @param icon Icon of the topic.
         */
        public MessageForumTopicCreated(String name, ForumTopicIcon icon) {
            this.name = name;
            this.icon = icon;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1194440751;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic has been edited.
     */
    public static class MessageForumTopicEdited extends MessageContent {
        /**
         * If non-empty, the new name of the topic.
         */
        public String name;
        /**
         * True, if icon's customEmojiId is changed.
         */
        public boolean editIconCustomEmojiId;
        /**
         * New unique identifier of the custom emoji shown on the topic icon; 0 if none. Must be ignored if editIconCustomEmojiId is false.
         */
        public long iconCustomEmojiId;

        /**
         * A forum topic has been edited.
         */
        public MessageForumTopicEdited() {
        }

        /**
         * A forum topic has been edited.
         *
         * @param name If non-empty, the new name of the topic.
         * @param editIconCustomEmojiId True, if icon's customEmojiId is changed.
         * @param iconCustomEmojiId New unique identifier of the custom emoji shown on the topic icon; 0 if none. Must be ignored if editIconCustomEmojiId is false.
         */
        public MessageForumTopicEdited(String name, boolean editIconCustomEmojiId, long iconCustomEmojiId) {
            this.name = name;
            this.editIconCustomEmojiId = editIconCustomEmojiId;
            this.iconCustomEmojiId = iconCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 12629888;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic has been closed or opened.
     */
    public static class MessageForumTopicIsClosedToggled extends MessageContent {
        /**
         * True, if the topic was closed; otherwise, the topic was reopened.
         */
        public boolean isClosed;

        /**
         * A forum topic has been closed or opened.
         */
        public MessageForumTopicIsClosedToggled() {
        }

        /**
         * A forum topic has been closed or opened.
         *
         * @param isClosed True, if the topic was closed; otherwise, the topic was reopened.
         */
        public MessageForumTopicIsClosedToggled(boolean isClosed) {
            this.isClosed = isClosed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1264029664;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A General forum topic has been hidden or unhidden.
     */
    public static class MessageForumTopicIsHiddenToggled extends MessageContent {
        /**
         * True, if the topic was hidden; otherwise, the topic was unhidden.
         */
        public boolean isHidden;

        /**
         * A General forum topic has been hidden or unhidden.
         */
        public MessageForumTopicIsHiddenToggled() {
        }

        /**
         * A General forum topic has been hidden or unhidden.
         *
         * @param isHidden True, if the topic was hidden; otherwise, the topic was unhidden.
         */
        public MessageForumTopicIsHiddenToggled(boolean isHidden) {
            this.isHidden = isHidden;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1751936002;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A profile photo was suggested to a user in a private chat.
     */
    public static class MessageSuggestProfilePhoto extends MessageContent {
        /**
         * The suggested chat photo. Use the method setProfilePhoto with inputChatPhotoPrevious to apply the photo.
         */
        public ChatPhoto photo;

        /**
         * A profile photo was suggested to a user in a private chat.
         */
        public MessageSuggestProfilePhoto() {
        }

        /**
         * A profile photo was suggested to a user in a private chat.
         *
         * @param photo The suggested chat photo. Use the method setProfilePhoto with inputChatPhotoPrevious to apply the photo.
         */
        public MessageSuggestProfilePhoto(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1251926297;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A non-standard action has happened in the chat.
     */
    public static class MessageCustomServiceAction extends MessageContent {
        /**
         * Message text to be shown in the chat.
         */
        public String text;

        /**
         * A non-standard action has happened in the chat.
         */
        public MessageCustomServiceAction() {
        }

        /**
         * A non-standard action has happened in the chat.
         *
         * @param text Message text to be shown in the chat.
         */
        public MessageCustomServiceAction(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1435879282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new high score was achieved in a game.
     */
    public static class MessageGameScore extends MessageContent {
        /**
         * Identifier of the message with the game, can be an identifier of a deleted message.
         */
        public long gameMessageId;
        /**
         * Identifier of the game; may be different from the games presented in the message with the game.
         */
        public long gameId;
        /**
         * New score.
         */
        public int score;

        /**
         * A new high score was achieved in a game.
         */
        public MessageGameScore() {
        }

        /**
         * A new high score was achieved in a game.
         *
         * @param gameMessageId Identifier of the message with the game, can be an identifier of a deleted message.
         * @param gameId Identifier of the game; may be different from the games presented in the message with the game.
         * @param score New score.
         */
        public MessageGameScore(long gameMessageId, long gameId, int score) {
            this.gameMessageId = gameMessageId;
            this.gameId = gameId;
            this.score = score;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1344904575;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A payment has been completed.
     */
    public static class MessagePaymentSuccessful extends MessageContent {
        /**
         * Identifier of the chat, containing the corresponding invoice message.
         */
        public long invoiceChatId;
        /**
         * Identifier of the message with the corresponding invoice; can be 0 or an identifier of a deleted message.
         */
        public long invoiceMessageId;
        /**
         * Currency for the price of the product.
         */
        public String currency;
        /**
         * Total price for the product, in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * True, if this is a recurring payment.
         */
        public boolean isRecurring;
        /**
         * True, if this is the first recurring payment.
         */
        public boolean isFirstRecurring;
        /**
         * Name of the invoice; may be empty if unknown.
         */
        public String invoiceName;

        /**
         * A payment has been completed.
         */
        public MessagePaymentSuccessful() {
        }

        /**
         * A payment has been completed.
         *
         * @param invoiceChatId Identifier of the chat, containing the corresponding invoice message.
         * @param invoiceMessageId Identifier of the message with the corresponding invoice; can be 0 or an identifier of a deleted message.
         * @param currency Currency for the price of the product.
         * @param totalAmount Total price for the product, in the smallest units of the currency.
         * @param isRecurring True, if this is a recurring payment.
         * @param isFirstRecurring True, if this is the first recurring payment.
         * @param invoiceName Name of the invoice; may be empty if unknown.
         */
        public MessagePaymentSuccessful(long invoiceChatId, long invoiceMessageId, String currency, long totalAmount, boolean isRecurring, boolean isFirstRecurring, String invoiceName) {
            this.invoiceChatId = invoiceChatId;
            this.invoiceMessageId = invoiceMessageId;
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.isRecurring = isRecurring;
            this.isFirstRecurring = isFirstRecurring;
            this.invoiceName = invoiceName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1406745820;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A payment has been completed; for bots only.
     */
    public static class MessagePaymentSuccessfulBot extends MessageContent {
        /**
         * Currency for price of the product.
         */
        public String currency;
        /**
         * Total price for the product, in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * True, if this is a recurring payment.
         */
        public boolean isRecurring;
        /**
         * True, if this is the first recurring payment.
         */
        public boolean isFirstRecurring;
        /**
         * Invoice payload.
         */
        public byte[] invoicePayload;
        /**
         * Identifier of the shipping option chosen by the user; may be empty if not applicable.
         */
        public String shippingOptionId;
        /**
         * Information about the order; may be null.
         */
        @Nullable public OrderInfo orderInfo;
        /**
         * Telegram payment identifier.
         */
        public String telegramPaymentChargeId;
        /**
         * Provider payment identifier.
         */
        public String providerPaymentChargeId;

        /**
         * A payment has been completed; for bots only.
         */
        public MessagePaymentSuccessfulBot() {
        }

        /**
         * A payment has been completed; for bots only.
         *
         * @param currency Currency for price of the product.
         * @param totalAmount Total price for the product, in the smallest units of the currency.
         * @param isRecurring True, if this is a recurring payment.
         * @param isFirstRecurring True, if this is the first recurring payment.
         * @param invoicePayload Invoice payload.
         * @param shippingOptionId Identifier of the shipping option chosen by the user; may be empty if not applicable.
         * @param orderInfo Information about the order; may be null.
         * @param telegramPaymentChargeId Telegram payment identifier.
         * @param providerPaymentChargeId Provider payment identifier.
         */
        public MessagePaymentSuccessfulBot(String currency, long totalAmount, boolean isRecurring, boolean isFirstRecurring, byte[] invoicePayload, String shippingOptionId, OrderInfo orderInfo, String telegramPaymentChargeId, String providerPaymentChargeId) {
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.isRecurring = isRecurring;
            this.isFirstRecurring = isFirstRecurring;
            this.invoicePayload = invoicePayload;
            this.shippingOptionId = shippingOptionId;
            this.orderInfo = orderInfo;
            this.telegramPaymentChargeId = telegramPaymentChargeId;
            this.providerPaymentChargeId = providerPaymentChargeId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1759592121;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A payment has been refunded.
     */
    public static class MessagePaymentRefunded extends MessageContent {
        /**
         * Identifier of the previous owner of the Telegram stars that refunds them.
         */
        public MessageSender ownerId;
        /**
         * Currency for the price of the product.
         */
        public String currency;
        /**
         * Total price for the product, in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * Invoice payload; only for bots.
         */
        public byte[] invoicePayload;
        /**
         * Telegram payment identifier.
         */
        public String telegramPaymentChargeId;
        /**
         * Provider payment identifier.
         */
        public String providerPaymentChargeId;

        /**
         * A payment has been refunded.
         */
        public MessagePaymentRefunded() {
        }

        /**
         * A payment has been refunded.
         *
         * @param ownerId Identifier of the previous owner of the Telegram stars that refunds them.
         * @param currency Currency for the price of the product.
         * @param totalAmount Total price for the product, in the smallest units of the currency.
         * @param invoicePayload Invoice payload; only for bots.
         * @param telegramPaymentChargeId Telegram payment identifier.
         * @param providerPaymentChargeId Provider payment identifier.
         */
        public MessagePaymentRefunded(MessageSender ownerId, String currency, long totalAmount, byte[] invoicePayload, String telegramPaymentChargeId, String providerPaymentChargeId) {
            this.ownerId = ownerId;
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.invoicePayload = invoicePayload;
            this.telegramPaymentChargeId = telegramPaymentChargeId;
            this.providerPaymentChargeId = providerPaymentChargeId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 297580787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Telegram Premium was gifted to the user.
     */
    public static class MessageGiftedPremium extends MessageContent {
        /**
         * The identifier of a user that gifted Telegram Premium; 0 if the gift was anonymous.
         */
        public long gifterUserId;
        /**
         * Currency for the paid amount.
         */
        public String currency;
        /**
         * The paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Cryptocurrency used to pay for the gift; may be empty if none.
         */
        public String cryptocurrency;
        /**
         * The paid amount, in the smallest units of the cryptocurrency; 0 if none.
         */
        public long cryptocurrencyAmount;
        /**
         * Number of months the Telegram Premium subscription will be active.
         */
        public int monthCount;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * Telegram Premium was gifted to the user.
         */
        public MessageGiftedPremium() {
        }

        /**
         * Telegram Premium was gifted to the user.
         *
         * @param gifterUserId The identifier of a user that gifted Telegram Premium; 0 if the gift was anonymous.
         * @param currency Currency for the paid amount.
         * @param amount The paid amount, in the smallest units of the currency.
         * @param cryptocurrency Cryptocurrency used to pay for the gift; may be empty if none.
         * @param cryptocurrencyAmount The paid amount, in the smallest units of the cryptocurrency; 0 if none.
         * @param monthCount Number of months the Telegram Premium subscription will be active.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         */
        public MessageGiftedPremium(long gifterUserId, String currency, long amount, String cryptocurrency, long cryptocurrencyAmount, int monthCount, Sticker sticker) {
            this.gifterUserId = gifterUserId;
            this.currency = currency;
            this.amount = amount;
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.monthCount = monthCount;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 126688522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Premium gift code was created for the user.
     */
    public static class MessagePremiumGiftCode extends MessageContent {
        /**
         * Identifier of a chat or a user that created the gift code; may be null if unknown.
         */
        @Nullable public MessageSender creatorId;
        /**
         * True, if the gift code was created for a giveaway.
         */
        public boolean isFromGiveaway;
        /**
         * True, if the winner for the corresponding Telegram Premium subscription wasn't chosen.
         */
        public boolean isUnclaimed;
        /**
         * Currency for the paid amount; empty if unknown.
         */
        public String currency;
        /**
         * The paid amount, in the smallest units of the currency; 0 if unknown.
         */
        public long amount;
        /**
         * Cryptocurrency used to pay for the gift; may be empty if none or unknown.
         */
        public String cryptocurrency;
        /**
         * The paid amount, in the smallest units of the cryptocurrency; 0 if unknown.
         */
        public long cryptocurrencyAmount;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation.
         */
        public int monthCount;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;
        /**
         * The gift code.
         */
        public String code;

        /**
         * A Telegram Premium gift code was created for the user.
         */
        public MessagePremiumGiftCode() {
        }

        /**
         * A Telegram Premium gift code was created for the user.
         *
         * @param creatorId Identifier of a chat or a user that created the gift code; may be null if unknown.
         * @param isFromGiveaway True, if the gift code was created for a giveaway.
         * @param isUnclaimed True, if the winner for the corresponding Telegram Premium subscription wasn't chosen.
         * @param currency Currency for the paid amount; empty if unknown.
         * @param amount The paid amount, in the smallest units of the currency; 0 if unknown.
         * @param cryptocurrency Cryptocurrency used to pay for the gift; may be empty if none or unknown.
         * @param cryptocurrencyAmount The paid amount, in the smallest units of the cryptocurrency; 0 if unknown.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         * @param code The gift code.
         */
        public MessagePremiumGiftCode(MessageSender creatorId, boolean isFromGiveaway, boolean isUnclaimed, String currency, long amount, String cryptocurrency, long cryptocurrencyAmount, int monthCount, Sticker sticker, String code) {
            this.creatorId = creatorId;
            this.isFromGiveaway = isFromGiveaway;
            this.isUnclaimed = isUnclaimed;
            this.currency = currency;
            this.amount = amount;
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.monthCount = monthCount;
            this.sticker = sticker;
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 649927667;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Premium giveaway was created for the chat. Use telegramPaymentPurposePremiumGiveaway or storePaymentPurposePremiumGiveaway to create a giveaway.
     */
    public static class MessagePremiumGiveawayCreated extends MessageContent {

        /**
         * A Telegram Premium giveaway was created for the chat. Use telegramPaymentPurposePremiumGiveaway or storePaymentPurposePremiumGiveaway to create a giveaway.
         */
        public MessagePremiumGiveawayCreated() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 655305796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Premium giveaway.
     */
    public static class MessagePremiumGiveaway extends MessageContent {
        /**
         * Giveaway parameters.
         */
        public PremiumGiveawayParameters parameters;
        /**
         * Number of users which will receive Telegram Premium subscription gift codes.
         */
        public int winnerCount;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation.
         */
        public int monthCount;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * A Telegram Premium giveaway.
         */
        public MessagePremiumGiveaway() {
        }

        /**
         * A Telegram Premium giveaway.
         *
         * @param parameters Giveaway parameters.
         * @param winnerCount Number of users which will receive Telegram Premium subscription gift codes.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         */
        public MessagePremiumGiveaway(PremiumGiveawayParameters parameters, int winnerCount, int monthCount, Sticker sticker) {
            this.parameters = parameters;
            this.winnerCount = winnerCount;
            this.monthCount = monthCount;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1252053168;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Premium giveaway without public winners has been completed for the chat.
     */
    public static class MessagePremiumGiveawayCompleted extends MessageContent {
        /**
         * Identifier of the message with the giveaway; can be 0 if the message was deleted.
         */
        public long giveawayMessageId;
        /**
         * Number of winners in the giveaway.
         */
        public int winnerCount;
        /**
         * Number of undistributed prizes.
         */
        public int unclaimedPrizeCount;

        /**
         * A Telegram Premium giveaway without public winners has been completed for the chat.
         */
        public MessagePremiumGiveawayCompleted() {
        }

        /**
         * A Telegram Premium giveaway without public winners has been completed for the chat.
         *
         * @param giveawayMessageId Identifier of the message with the giveaway; can be 0 if the message was deleted.
         * @param winnerCount Number of winners in the giveaway.
         * @param unclaimedPrizeCount Number of undistributed prizes.
         */
        public MessagePremiumGiveawayCompleted(long giveawayMessageId, int winnerCount, int unclaimedPrizeCount) {
            this.giveawayMessageId = giveawayMessageId;
            this.winnerCount = winnerCount;
            this.unclaimedPrizeCount = unclaimedPrizeCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2142029495;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Premium giveaway with public winners has been completed for the chat.
     */
    public static class MessagePremiumGiveawayWinners extends MessageContent {
        /**
         * Identifier of the channel chat, which was automatically boosted by the winners of the giveaway for duration of the Premium subscription.
         */
        public long boostedChatId;
        /**
         * Identifier of the message with the giveaway in the boosted chat.
         */
        public long giveawayMessageId;
        /**
         * Number of other chats that participated in the giveaway.
         */
        public int additionalChatCount;
        /**
         * Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in parameters of the giveaway.
         */
        public int actualWinnersSelectionDate;
        /**
         * True, if only new members of the chats were eligible for the giveaway.
         */
        public boolean onlyNewMembers;
        /**
         * True, if the giveaway was canceled and was fully refunded.
         */
        public boolean wasRefunded;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation.
         */
        public int monthCount;
        /**
         * Additional description of the giveaway prize.
         */
        public String prizeDescription;
        /**
         * Total number of winners in the giveaway.
         */
        public int winnerCount;
        /**
         * Up to 100 user identifiers of the winners of the giveaway.
         */
        public long[] winnerUserIds;
        /**
         * Number of undistributed prizes.
         */
        public int unclaimedPrizeCount;

        /**
         * A Telegram Premium giveaway with public winners has been completed for the chat.
         */
        public MessagePremiumGiveawayWinners() {
        }

        /**
         * A Telegram Premium giveaway with public winners has been completed for the chat.
         *
         * @param boostedChatId Identifier of the channel chat, which was automatically boosted by the winners of the giveaway for duration of the Premium subscription.
         * @param giveawayMessageId Identifier of the message with the giveaway in the boosted chat.
         * @param additionalChatCount Number of other chats that participated in the giveaway.
         * @param actualWinnersSelectionDate Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in parameters of the giveaway.
         * @param onlyNewMembers True, if only new members of the chats were eligible for the giveaway.
         * @param wasRefunded True, if the giveaway was canceled and was fully refunded.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation.
         * @param prizeDescription Additional description of the giveaway prize.
         * @param winnerCount Total number of winners in the giveaway.
         * @param winnerUserIds Up to 100 user identifiers of the winners of the giveaway.
         * @param unclaimedPrizeCount Number of undistributed prizes.
         */
        public MessagePremiumGiveawayWinners(long boostedChatId, long giveawayMessageId, int additionalChatCount, int actualWinnersSelectionDate, boolean onlyNewMembers, boolean wasRefunded, int monthCount, String prizeDescription, int winnerCount, long[] winnerUserIds, int unclaimedPrizeCount) {
            this.boostedChatId = boostedChatId;
            this.giveawayMessageId = giveawayMessageId;
            this.additionalChatCount = additionalChatCount;
            this.actualWinnersSelectionDate = actualWinnersSelectionDate;
            this.onlyNewMembers = onlyNewMembers;
            this.wasRefunded = wasRefunded;
            this.monthCount = monthCount;
            this.prizeDescription = prizeDescription;
            this.winnerCount = winnerCount;
            this.winnerUserIds = winnerUserIds;
            this.unclaimedPrizeCount = unclaimedPrizeCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1326563847;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A contact has registered with Telegram.
     */
    public static class MessageContactRegistered extends MessageContent {

        /**
         * A contact has registered with Telegram.
         */
        public MessageContactRegistered() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1502020353;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The current user shared users, which were requested by the bot.
     */
    public static class MessageUsersShared extends MessageContent {
        /**
         * The shared users.
         */
        public SharedUser[] users;
        /**
         * Identifier of the keyboard button with the request.
         */
        public int buttonId;

        /**
         * The current user shared users, which were requested by the bot.
         */
        public MessageUsersShared() {
        }

        /**
         * The current user shared users, which were requested by the bot.
         *
         * @param users The shared users.
         * @param buttonId Identifier of the keyboard button with the request.
         */
        public MessageUsersShared(SharedUser[] users, int buttonId) {
            this.users = users;
            this.buttonId = buttonId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -842442318;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The current user shared a chat, which was requested by the bot.
     */
    public static class MessageChatShared extends MessageContent {
        /**
         * The shared chat.
         */
        public SharedChat chat;
        /**
         * Identifier of the keyboard button with the request.
         */
        public int buttonId;

        /**
         * The current user shared a chat, which was requested by the bot.
         */
        public MessageChatShared() {
        }

        /**
         * The current user shared a chat, which was requested by the bot.
         *
         * @param chat The shared chat.
         * @param buttonId Identifier of the keyboard button with the request.
         */
        public MessageChatShared(SharedChat chat, int buttonId) {
            this.chat = chat;
            this.buttonId = buttonId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1362699935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user allowed the bot to send messages.
     */
    public static class MessageBotWriteAccessAllowed extends MessageContent {
        /**
         * The reason why the bot was allowed to write messages.
         */
        public BotWriteAccessAllowReason reason;

        /**
         * The user allowed the bot to send messages.
         */
        public MessageBotWriteAccessAllowed() {
        }

        /**
         * The user allowed the bot to send messages.
         *
         * @param reason The reason why the bot was allowed to write messages.
         */
        public MessageBotWriteAccessAllowed(BotWriteAccessAllowReason reason) {
            this.reason = reason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1702185036;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Data from a Web App has been sent to a bot.
     */
    public static class MessageWebAppDataSent extends MessageContent {
        /**
         * Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         */
        public String buttonText;

        /**
         * Data from a Web App has been sent to a bot.
         */
        public MessageWebAppDataSent() {
        }

        /**
         * Data from a Web App has been sent to a bot.
         *
         * @param buttonText Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         */
        public MessageWebAppDataSent(String buttonText) {
            this.buttonText = buttonText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -83674862;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Data from a Web App has been received; for bots only.
     */
    public static class MessageWebAppDataReceived extends MessageContent {
        /**
         * Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         */
        public String buttonText;
        /**
         * The data.
         */
        public String data;

        /**
         * Data from a Web App has been received; for bots only.
         */
        public MessageWebAppDataReceived() {
        }

        /**
         * Data from a Web App has been received; for bots only.
         *
         * @param buttonText Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         * @param data The data.
         */
        public MessageWebAppDataReceived(String buttonText, String data) {
            this.buttonText = buttonText;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -8578539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Telegram Passport data has been sent to a bot.
     */
    public static class MessagePassportDataSent extends MessageContent {
        /**
         * List of Telegram Passport element types sent.
         */
        public PassportElementType[] types;

        /**
         * Telegram Passport data has been sent to a bot.
         */
        public MessagePassportDataSent() {
        }

        /**
         * Telegram Passport data has been sent to a bot.
         *
         * @param types List of Telegram Passport element types sent.
         */
        public MessagePassportDataSent(PassportElementType[] types) {
            this.types = types;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1017405171;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Telegram Passport data has been received; for bots only.
     */
    public static class MessagePassportDataReceived extends MessageContent {
        /**
         * List of received Telegram Passport elements.
         */
        public EncryptedPassportElement[] elements;
        /**
         * Encrypted data credentials.
         */
        public EncryptedCredentials credentials;

        /**
         * Telegram Passport data has been received; for bots only.
         */
        public MessagePassportDataReceived() {
        }

        /**
         * Telegram Passport data has been received; for bots only.
         *
         * @param elements List of received Telegram Passport elements.
         * @param credentials Encrypted data credentials.
         */
        public MessagePassportDataReceived(EncryptedPassportElement[] elements, EncryptedCredentials credentials) {
            this.elements = elements;
            this.credentials = credentials;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1367863624;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user in the chat came within proximity alert range.
     */
    public static class MessageProximityAlertTriggered extends MessageContent {
        /**
         * The identifier of a user or chat that triggered the proximity alert.
         */
        public MessageSender travelerId;
        /**
         * The identifier of a user or chat that subscribed for the proximity alert.
         */
        public MessageSender watcherId;
        /**
         * The distance between the users.
         */
        public int distance;

        /**
         * A user in the chat came within proximity alert range.
         */
        public MessageProximityAlertTriggered() {
        }

        /**
         * A user in the chat came within proximity alert range.
         *
         * @param travelerId The identifier of a user or chat that triggered the proximity alert.
         * @param watcherId The identifier of a user or chat that subscribed for the proximity alert.
         * @param distance The distance between the users.
         */
        public MessageProximityAlertTriggered(MessageSender travelerId, MessageSender watcherId, int distance) {
            this.travelerId = travelerId;
            this.watcherId = watcherId;
            this.distance = distance;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 67761875;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message content that is not supported in the current TDLib version.
     */
    public static class MessageUnsupported extends MessageContent {

        /**
         * A message content that is not supported in the current TDLib version.
         */
        public MessageUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1816726139;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Options to be used when a message content is copied without reference to the original sender. Service messages, messages with messageInvoice, messagePaidMedia, messagePremiumGiveaway, or messagePremiumGiveawayWinners content can't be copied.
     */
    public static class MessageCopyOptions extends Object {
        /**
         * True, if content of the message needs to be copied without reference to the original sender. Always true if the message is forwarded to a secret chat or is local.
         */
        public boolean sendCopy;
        /**
         * True, if media caption of the message copy needs to be replaced. Ignored if sendCopy is false.
         */
        public boolean replaceCaption;
        /**
         * New message caption; pass null to copy message without caption. Ignored if replaceCaption is false.
         */
        public FormattedText newCaption;
        /**
         * True, if new caption must be shown above the animation; otherwise, new caption must be shown below the animation; not supported in secret chats. Ignored if replaceCaption is false.
         */
        public boolean newShowCaptionAboveMedia;

        /**
         * Options to be used when a message content is copied without reference to the original sender. Service messages, messages with messageInvoice, messagePaidMedia, messagePremiumGiveaway, or messagePremiumGiveawayWinners content can't be copied.
         */
        public MessageCopyOptions() {
        }

        /**
         * Options to be used when a message content is copied without reference to the original sender. Service messages, messages with messageInvoice, messagePaidMedia, messagePremiumGiveaway, or messagePremiumGiveawayWinners content can't be copied.
         *
         * @param sendCopy True, if content of the message needs to be copied without reference to the original sender. Always true if the message is forwarded to a secret chat or is local.
         * @param replaceCaption True, if media caption of the message copy needs to be replaced. Ignored if sendCopy is false.
         * @param newCaption New message caption; pass null to copy message without caption. Ignored if replaceCaption is false.
         * @param newShowCaptionAboveMedia True, if new caption must be shown above the animation; otherwise, new caption must be shown below the animation; not supported in secret chats. Ignored if replaceCaption is false.
         */
        public MessageCopyOptions(boolean sendCopy, boolean replaceCaption, FormattedText newCaption, boolean newShowCaptionAboveMedia) {
            this.sendCopy = sendCopy;
            this.replaceCaption = replaceCaption;
            this.newCaption = newCaption;
            this.newShowCaptionAboveMedia = newShowCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1079772090;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an effect added to a message.
     */
    public static class MessageEffect extends Object {
        /**
         * Unique identifier of the effect.
         */
        public long id;
        /**
         * Static icon for the effect in WEBP format; may be null if none.
         */
        @Nullable public Sticker staticIcon;
        /**
         * Emoji corresponding to the effect that can be used if static icon isn't available.
         */
        public String emoji;
        /**
         * True, if Telegram Premium subscription is required to use the effect.
         */
        public boolean isPremium;
        /**
         * Type of the effect.
         */
        public MessageEffectType type;

        /**
         * Contains information about an effect added to a message.
         */
        public MessageEffect() {
        }

        /**
         * Contains information about an effect added to a message.
         *
         * @param id Unique identifier of the effect.
         * @param staticIcon Static icon for the effect in WEBP format; may be null if none.
         * @param emoji Emoji corresponding to the effect that can be used if static icon isn't available.
         * @param isPremium True, if Telegram Premium subscription is required to use the effect.
         * @param type Type of the effect.
         */
        public MessageEffect(long id, Sticker staticIcon, String emoji, boolean isPremium, MessageEffectType type) {
            this.id = id;
            this.staticIcon = staticIcon;
            this.emoji = emoji;
            this.isPremium = isPremium;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1758836433;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of emoji effect.
     */
    public abstract static class MessageEffectType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageEffectTypeEmojiReaction.CONSTRUCTOR,
            MessageEffectTypePremiumSticker.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageEffectType() {
        }
    }

    /**
     * An effect from an emoji reaction.
     */
    public static class MessageEffectTypeEmojiReaction extends MessageEffectType {
        /**
         * Select animation for the effect in TGS format.
         */
        public Sticker selectAnimation;
        /**
         * Effect animation for the effect in TGS format.
         */
        public Sticker effectAnimation;

        /**
         * An effect from an emoji reaction.
         */
        public MessageEffectTypeEmojiReaction() {
        }

        /**
         * An effect from an emoji reaction.
         *
         * @param selectAnimation Select animation for the effect in TGS format.
         * @param effectAnimation Effect animation for the effect in TGS format.
         */
        public MessageEffectTypeEmojiReaction(Sticker selectAnimation, Sticker effectAnimation) {
            this.selectAnimation = selectAnimation;
            this.effectAnimation = effectAnimation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1756079678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An effect from a premium sticker.
     */
    public static class MessageEffectTypePremiumSticker extends MessageEffectType {
        /**
         * The premium sticker. The effect can be found at sticker.fullType.premiumAnimation.
         */
        public Sticker sticker;

        /**
         * An effect from a premium sticker.
         */
        public MessageEffectTypePremiumSticker() {
        }

        /**
         * An effect from a premium sticker.
         *
         * @param sticker The premium sticker. The effect can be found at sticker.fullType.premiumAnimation.
         */
        public MessageEffectTypePremiumSticker(Sticker sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1637231609;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a file with messages exported from another app.
     */
    public abstract static class MessageFileType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageFileTypePrivate.CONSTRUCTOR,
            MessageFileTypeGroup.CONSTRUCTOR,
            MessageFileTypeUnknown.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageFileType() {
        }
    }

    /**
     * The messages were exported from a private chat.
     */
    public static class MessageFileTypePrivate extends MessageFileType {
        /**
         * Name of the other party; may be empty if unrecognized.
         */
        public String name;

        /**
         * The messages were exported from a private chat.
         */
        public MessageFileTypePrivate() {
        }

        /**
         * The messages were exported from a private chat.
         *
         * @param name Name of the other party; may be empty if unrecognized.
         */
        public MessageFileTypePrivate(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -521908524;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The messages were exported from a group chat.
     */
    public static class MessageFileTypeGroup extends MessageFileType {
        /**
         * Title of the group chat; may be empty if unrecognized.
         */
        public String title;

        /**
         * The messages were exported from a group chat.
         */
        public MessageFileTypeGroup() {
        }

        /**
         * The messages were exported from a group chat.
         *
         * @param title Title of the group chat; may be empty if unrecognized.
         */
        public MessageFileTypeGroup(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -219836568;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The messages were exported from a chat of unknown type.
     */
    public static class MessageFileTypeUnknown extends MessageFileType {

        /**
         * The messages were exported from a chat of unknown type.
         */
        public MessageFileTypeUnknown() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1176353458;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a forwarded message.
     */
    public static class MessageForwardInfo extends Object {
        /**
         * Origin of the forwarded message.
         */
        public MessageOrigin origin;
        /**
         * Point in time (Unix timestamp) when the message was originally sent.
         */
        public int date;
        /**
         * For messages forwarded to the chat with the current user (Saved Messages), to the Replies bot chat, or to the channel's discussion group, information about the source message from which the message was forwarded last time; may be null for other forwards or if unknown.
         */
        @Nullable public ForwardSource source;
        /**
         * The type of public service announcement for the forwarded message.
         */
        public String publicServiceAnnouncementType;

        /**
         * Contains information about a forwarded message.
         */
        public MessageForwardInfo() {
        }

        /**
         * Contains information about a forwarded message.
         *
         * @param origin Origin of the forwarded message.
         * @param date Point in time (Unix timestamp) when the message was originally sent.
         * @param source For messages forwarded to the chat with the current user (Saved Messages), to the Replies bot chat, or to the channel's discussion group, information about the source message from which the message was forwarded last time; may be null for other forwards or if unknown.
         * @param publicServiceAnnouncementType The type of public service announcement for the forwarded message.
         */
        public MessageForwardInfo(MessageOrigin origin, int date, ForwardSource source, String publicServiceAnnouncementType) {
            this.origin = origin;
            this.date = date;
            this.source = source;
            this.publicServiceAnnouncementType = publicServiceAnnouncementType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -880313475;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a message created with importMessages.
     */
    public static class MessageImportInfo extends Object {
        /**
         * Name of the original sender.
         */
        public String senderName;
        /**
         * Point in time (Unix timestamp) when the message was originally sent.
         */
        public int date;

        /**
         * Contains information about a message created with importMessages.
         */
        public MessageImportInfo() {
        }

        /**
         * Contains information about a message created with importMessages.
         *
         * @param senderName Name of the original sender.
         * @param date Point in time (Unix timestamp) when the message was originally sent.
         */
        public MessageImportInfo(String senderName, int date) {
            this.senderName = senderName;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -421549105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about interactions with a message.
     */
    public static class MessageInteractionInfo extends Object {
        /**
         * Number of times the message was viewed.
         */
        public int viewCount;
        /**
         * Number of times the message was forwarded.
         */
        public int forwardCount;
        /**
         * Information about direct or indirect replies to the message; may be null. Currently, available only in channels with a discussion supergroup and discussion supergroups for messages, which are not replies itself.
         */
        @Nullable public MessageReplyInfo replyInfo;
        /**
         * The list of reactions or tags added to the message; may be null.
         */
        @Nullable public MessageReactions reactions;

        /**
         * Contains information about interactions with a message.
         */
        public MessageInteractionInfo() {
        }

        /**
         * Contains information about interactions with a message.
         *
         * @param viewCount Number of times the message was viewed.
         * @param forwardCount Number of times the message was forwarded.
         * @param replyInfo Information about direct or indirect replies to the message; may be null. Currently, available only in channels with a discussion supergroup and discussion supergroups for messages, which are not replies itself.
         * @param reactions The list of reactions or tags added to the message; may be null.
         */
        public MessageInteractionInfo(int viewCount, int forwardCount, MessageReplyInfo replyInfo, MessageReactions reactions) {
            this.viewCount = viewCount;
            this.forwardCount = forwardCount;
            this.replyInfo = replyInfo;
            this.reactions = reactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 733797893;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an HTTPS link to a message in a supergroup or channel, or a forum topic.
     */
    public static class MessageLink extends Object {
        /**
         * The link.
         */
        public String link;
        /**
         * True, if the link will work for non-members of the chat.
         */
        public boolean isPublic;

        /**
         * Contains an HTTPS link to a message in a supergroup or channel, or a forum topic.
         */
        public MessageLink() {
        }

        /**
         * Contains an HTTPS link to a message in a supergroup or channel, or a forum topic.
         *
         * @param link The link.
         * @param isPublic True, if the link will work for non-members of the chat.
         */
        public MessageLink(String link, boolean isPublic) {
            this.link = link;
            this.isPublic = isPublic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1354089818;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a link to a message or a forum topic in a chat.
     */
    public static class MessageLinkInfo extends Object {
        /**
         * True, if the link is a public link for a message or a forum topic in a chat.
         */
        public boolean isPublic;
        /**
         * If found, identifier of the chat to which the link points, 0 otherwise.
         */
        public long chatId;
        /**
         * If found, identifier of the message thread in which to open the message, or a forum topic to open if the message is missing.
         */
        public long messageThreadId;
        /**
         * If found, the linked message; may be null.
         */
        @Nullable public Message message;
        /**
         * Timestamp from which the video/audio/video note/voice note/story playing must start, in seconds; 0 if not specified. The media can be in the message content or in its link preview.
         */
        public int mediaTimestamp;
        /**
         * True, if the whole media album to which the message belongs is linked.
         */
        public boolean forAlbum;

        /**
         * Contains information about a link to a message or a forum topic in a chat.
         */
        public MessageLinkInfo() {
        }

        /**
         * Contains information about a link to a message or a forum topic in a chat.
         *
         * @param isPublic True, if the link is a public link for a message or a forum topic in a chat.
         * @param chatId If found, identifier of the chat to which the link points, 0 otherwise.
         * @param messageThreadId If found, identifier of the message thread in which to open the message, or a forum topic to open if the message is missing.
         * @param message If found, the linked message; may be null.
         * @param mediaTimestamp Timestamp from which the video/audio/video note/voice note/story playing must start, in seconds; 0 if not specified. The media can be in the message content or in its link preview.
         * @param forAlbum True, if the whole media album to which the message belongs is linked.
         */
        public MessageLinkInfo(boolean isPublic, long chatId, long messageThreadId, Message message, int mediaTimestamp, boolean forAlbum) {
            this.isPublic = isPublic;
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.message = message;
            this.mediaTimestamp = mediaTimestamp;
            this.forAlbum = forAlbum;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 731315024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the origin of a message.
     */
    public abstract static class MessageOrigin extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageOriginUser.CONSTRUCTOR,
            MessageOriginHiddenUser.CONSTRUCTOR,
            MessageOriginChat.CONSTRUCTOR,
            MessageOriginChannel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageOrigin() {
        }
    }

    /**
     * The message was originally sent by a known user.
     */
    public static class MessageOriginUser extends MessageOrigin {
        /**
         * Identifier of the user that originally sent the message.
         */
        public long senderUserId;

        /**
         * The message was originally sent by a known user.
         */
        public MessageOriginUser() {
        }

        /**
         * The message was originally sent by a known user.
         *
         * @param senderUserId Identifier of the user that originally sent the message.
         */
        public MessageOriginUser(long senderUserId) {
            this.senderUserId = senderUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1677684669;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was originally sent by a user, which is hidden by their privacy settings.
     */
    public static class MessageOriginHiddenUser extends MessageOrigin {
        /**
         * Name of the sender.
         */
        public String senderName;

        /**
         * The message was originally sent by a user, which is hidden by their privacy settings.
         */
        public MessageOriginHiddenUser() {
        }

        /**
         * The message was originally sent by a user, which is hidden by their privacy settings.
         *
         * @param senderName Name of the sender.
         */
        public MessageOriginHiddenUser(String senderName) {
            this.senderName = senderName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -317971494;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was originally sent on behalf of a chat.
     */
    public static class MessageOriginChat extends MessageOrigin {
        /**
         * Identifier of the chat that originally sent the message.
         */
        public long senderChatId;
        /**
         * For messages originally sent by an anonymous chat administrator, original message author signature.
         */
        public String authorSignature;

        /**
         * The message was originally sent on behalf of a chat.
         */
        public MessageOriginChat() {
        }

        /**
         * The message was originally sent on behalf of a chat.
         *
         * @param senderChatId Identifier of the chat that originally sent the message.
         * @param authorSignature For messages originally sent by an anonymous chat administrator, original message author signature.
         */
        public MessageOriginChat(long senderChatId, String authorSignature) {
            this.senderChatId = senderChatId;
            this.authorSignature = authorSignature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -205824332;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was originally a post in a channel.
     */
    public static class MessageOriginChannel extends MessageOrigin {
        /**
         * Identifier of the channel chat to which the message was originally sent.
         */
        public long chatId;
        /**
         * Message identifier of the original message.
         */
        public long messageId;
        /**
         * Original post author signature.
         */
        public String authorSignature;

        /**
         * The message was originally a post in a channel.
         */
        public MessageOriginChannel() {
        }

        /**
         * The message was originally a post in a channel.
         *
         * @param chatId Identifier of the channel chat to which the message was originally sent.
         * @param messageId Message identifier of the original message.
         * @param authorSignature Original post author signature.
         */
        public MessageOriginChannel(long chatId, long messageId, String authorSignature) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.authorSignature = authorSignature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1451535938;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a message in a specific position.
     */
    public static class MessagePosition extends Object {
        /**
         * 0-based message position in the full list of suitable messages.
         */
        public int position;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Point in time (Unix timestamp) when the message was sent.
         */
        public int date;

        /**
         * Contains information about a message in a specific position.
         */
        public MessagePosition() {
        }

        /**
         * Contains information about a message in a specific position.
         *
         * @param position 0-based message position in the full list of suitable messages.
         * @param messageId Message identifier.
         * @param date Point in time (Unix timestamp) when the message was sent.
         */
        public MessagePosition(int position, long messageId, int date) {
            this.position = position;
            this.messageId = messageId;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1292189935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of message positions.
     */
    public static class MessagePositions extends Object {
        /**
         * Total number of messages found.
         */
        public int totalCount;
        /**
         * List of message positions.
         */
        public MessagePosition[] positions;

        /**
         * Contains a list of message positions.
         */
        public MessagePositions() {
        }

        /**
         * Contains a list of message positions.
         *
         * @param totalCount Total number of messages found.
         * @param positions List of message positions.
         */
        public MessagePositions(int totalCount, MessagePosition[] positions) {
            this.totalCount = totalCount;
            this.positions = positions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1930466649;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a reaction to a message.
     */
    public static class MessageReaction extends Object {
        /**
         * Type of the reaction.
         */
        public ReactionType type;
        /**
         * Number of times the reaction was added.
         */
        public int totalCount;
        /**
         * True, if the reaction is chosen by the current user.
         */
        public boolean isChosen;
        /**
         * Identifier of the message sender used by the current user to add the reaction; may be null if unknown or the reaction isn't chosen.
         */
        @Nullable public MessageSender usedSenderId;
        /**
         * Identifiers of at most 3 recent message senders, added the reaction; available in private, basic group and supergroup chats.
         */
        public MessageSender[] recentSenderIds;

        /**
         * Contains information about a reaction to a message.
         */
        public MessageReaction() {
        }

        /**
         * Contains information about a reaction to a message.
         *
         * @param type Type of the reaction.
         * @param totalCount Number of times the reaction was added.
         * @param isChosen True, if the reaction is chosen by the current user.
         * @param usedSenderId Identifier of the message sender used by the current user to add the reaction; may be null if unknown or the reaction isn't chosen.
         * @param recentSenderIds Identifiers of at most 3 recent message senders, added the reaction; available in private, basic group and supergroup chats.
         */
        public MessageReaction(ReactionType type, int totalCount, boolean isChosen, MessageSender usedSenderId, MessageSender[] recentSenderIds) {
            this.type = type;
            this.totalCount = totalCount;
            this.isChosen = isChosen;
            this.usedSenderId = usedSenderId;
            this.recentSenderIds = recentSenderIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1093994369;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of reactions added to a message.
     */
    public static class MessageReactions extends Object {
        /**
         * List of added reactions.
         */
        public MessageReaction[] reactions;
        /**
         * True, if the reactions are tags and Telegram Premium users can filter messages by them.
         */
        public boolean areTags;

        /**
         * Contains a list of reactions added to a message.
         */
        public MessageReactions() {
        }

        /**
         * Contains a list of reactions added to a message.
         *
         * @param reactions List of added reactions.
         * @param areTags True, if the reactions are tags and Telegram Premium users can filter messages by them.
         */
        public MessageReactions(MessageReaction[] reactions, boolean areTags) {
            this.reactions = reactions;
            this.areTags = areTags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1384310218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes read date of a recent outgoing message in a private chat.
     */
    public abstract static class MessageReadDate extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageReadDateRead.CONSTRUCTOR,
            MessageReadDateUnread.CONSTRUCTOR,
            MessageReadDateTooOld.CONSTRUCTOR,
            MessageReadDateUserPrivacyRestricted.CONSTRUCTOR,
            MessageReadDateMyPrivacyRestricted.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageReadDate() {
        }
    }

    /**
     * Contains read date of the message.
     */
    public static class MessageReadDateRead extends MessageReadDate {
        /**
         * Point in time (Unix timestamp) when the message was read by the other user.
         */
        public int readDate;

        /**
         * Contains read date of the message.
         */
        public MessageReadDateRead() {
        }

        /**
         * Contains read date of the message.
         *
         * @param readDate Point in time (Unix timestamp) when the message was read by the other user.
         */
        public MessageReadDateRead(int readDate) {
            this.readDate = readDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1972186672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is unread yet.
     */
    public static class MessageReadDateUnread extends MessageReadDate {

        /**
         * The message is unread yet.
         */
        public MessageReadDateUnread() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 397549868;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is too old to get read date.
     */
    public static class MessageReadDateTooOld extends MessageReadDate {

        /**
         * The message is too old to get read date.
         */
        public MessageReadDateTooOld() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1233773024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The read date is unknown due to privacy settings of the other user.
     */
    public static class MessageReadDateUserPrivacyRestricted extends MessageReadDate {

        /**
         * The read date is unknown due to privacy settings of the other user.
         */
        public MessageReadDateUserPrivacyRestricted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1282567130;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The read date is unknown due to privacy settings of the current user, but will be known if the user subscribes to Telegram Premium.
     */
    public static class MessageReadDateMyPrivacyRestricted extends MessageReadDate {

        /**
         * The read date is unknown due to privacy settings of the current user, but will be known if the user subscribes to Telegram Premium.
         */
        public MessageReadDateMyPrivacyRestricted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -693971852;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about replies to a message.
     */
    public static class MessageReplyInfo extends Object {
        /**
         * Number of times the message was directly or indirectly replied.
         */
        public int replyCount;
        /**
         * Identifiers of at most 3 recent repliers to the message; available in channels with a discussion supergroup. The users and chats are expected to be inaccessible: only their photo and name will be available.
         */
        public MessageSender[] recentReplierIds;
        /**
         * Identifier of the last read incoming reply to the message.
         */
        public long lastReadInboxMessageId;
        /**
         * Identifier of the last read outgoing reply to the message.
         */
        public long lastReadOutboxMessageId;
        /**
         * Identifier of the last reply to the message.
         */
        public long lastMessageId;

        /**
         * Contains information about replies to a message.
         */
        public MessageReplyInfo() {
        }

        /**
         * Contains information about replies to a message.
         *
         * @param replyCount Number of times the message was directly or indirectly replied.
         * @param recentReplierIds Identifiers of at most 3 recent repliers to the message; available in channels with a discussion supergroup. The users and chats are expected to be inaccessible: only their photo and name will be available.
         * @param lastReadInboxMessageId Identifier of the last read incoming reply to the message.
         * @param lastReadOutboxMessageId Identifier of the last read outgoing reply to the message.
         * @param lastMessageId Identifier of the last reply to the message.
         */
        public MessageReplyInfo(int replyCount, MessageSender[] recentReplierIds, long lastReadInboxMessageId, long lastReadOutboxMessageId, long lastMessageId) {
            this.replyCount = replyCount;
            this.recentReplierIds = recentReplierIds;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
            this.lastMessageId = lastMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2093702263;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the message or the story a message is replying to.
     */
    public abstract static class MessageReplyTo extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageReplyToMessage.CONSTRUCTOR,
            MessageReplyToStory.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageReplyTo() {
        }
    }

    /**
     * Describes a message replied by a given message.
     */
    public static class MessageReplyToMessage extends MessageReplyTo {
        /**
         * The identifier of the chat to which the message belongs; may be 0 if the replied message is in unknown chat.
         */
        public long chatId;
        /**
         * The identifier of the message; may be 0 if the replied message is in unknown chat.
         */
        public long messageId;
        /**
         * Chosen quote from the replied message; may be null if none.
         */
        @Nullable public TextQuote quote;
        /**
         * Information about origin of the message if the message was from another chat or topic; may be null for messages from the same chat.
         */
        @Nullable public MessageOrigin origin;
        /**
         * Point in time (Unix timestamp) when the message was sent if the message was from another chat or topic; 0 for messages from the same chat.
         */
        public int originSendDate;
        /**
         * Media content of the message if the message was from another chat or topic; may be null for messages from the same chat and messages without media. Can be only one of the following types: messageAnimation, messageAudio, messageContact, messageDice, messageDocument, messageGame, messageInvoice, messageLocation, messagePaidMedia, messagePhoto, messagePoll, messagePremiumGiveaway, messagePremiumGiveawayWinners, messageSticker, messageStory, messageText (for link preview), messageVenue, messageVideo, messageVideoNote, or messageVoiceNote.
         */
        @Nullable public MessageContent content;

        /**
         * Describes a message replied by a given message.
         */
        public MessageReplyToMessage() {
        }

        /**
         * Describes a message replied by a given message.
         *
         * @param chatId The identifier of the chat to which the message belongs; may be 0 if the replied message is in unknown chat.
         * @param messageId The identifier of the message; may be 0 if the replied message is in unknown chat.
         * @param quote Chosen quote from the replied message; may be null if none.
         * @param origin Information about origin of the message if the message was from another chat or topic; may be null for messages from the same chat.
         * @param originSendDate Point in time (Unix timestamp) when the message was sent if the message was from another chat or topic; 0 for messages from the same chat.
         * @param content Media content of the message if the message was from another chat or topic; may be null for messages from the same chat and messages without media. Can be only one of the following types: messageAnimation, messageAudio, messageContact, messageDice, messageDocument, messageGame, messageInvoice, messageLocation, messagePaidMedia, messagePhoto, messagePoll, messagePremiumGiveaway, messagePremiumGiveawayWinners, messageSticker, messageStory, messageText (for link preview), messageVenue, messageVideo, messageVideoNote, or messageVoiceNote.
         */
        public MessageReplyToMessage(long chatId, long messageId, TextQuote quote, MessageOrigin origin, int originSendDate, MessageContent content) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.quote = quote;
            this.origin = origin;
            this.originSendDate = originSendDate;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -300918393;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a story replied by a given message.
     */
    public static class MessageReplyToStory extends MessageReplyTo {
        /**
         * The identifier of the sender of the story.
         */
        public long storySenderChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;

        /**
         * Describes a story replied by a given message.
         */
        public MessageReplyToStory() {
        }

        /**
         * Describes a story replied by a given message.
         *
         * @param storySenderChatId The identifier of the sender of the story.
         * @param storyId The identifier of the story.
         */
        public MessageReplyToStory(long storySenderChatId, int storyId) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1888266553;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the time when a scheduled message will be sent.
     */
    public abstract static class MessageSchedulingState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSchedulingStateSendAtDate.CONSTRUCTOR,
            MessageSchedulingStateSendWhenOnline.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSchedulingState() {
        }
    }

    /**
     * The message will be sent at the specified date.
     */
    public static class MessageSchedulingStateSendAtDate extends MessageSchedulingState {
        /**
         * Point in time (Unix timestamp) when the message will be sent. The date must be within 367 days in the future.
         */
        public int sendDate;

        /**
         * The message will be sent at the specified date.
         */
        public MessageSchedulingStateSendAtDate() {
        }

        /**
         * The message will be sent at the specified date.
         *
         * @param sendDate Point in time (Unix timestamp) when the message will be sent. The date must be within 367 days in the future.
         */
        public MessageSchedulingStateSendAtDate(int sendDate) {
            this.sendDate = sendDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1485570073;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message will be sent when the other user is online. Applicable to private chats only and when the exact online status of the other user is known.
     */
    public static class MessageSchedulingStateSendWhenOnline extends MessageSchedulingState {

        /**
         * The message will be sent when the other user is online. Applicable to private chats only and when the exact online status of the other user is known.
         */
        public MessageSchedulingStateSendWhenOnline() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2092947464;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes when a message will be self-destructed.
     */
    public abstract static class MessageSelfDestructType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSelfDestructTypeTimer.CONSTRUCTOR,
            MessageSelfDestructTypeImmediately.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSelfDestructType() {
        }
    }

    /**
     * The message will be self-destructed in the specified time after its content was opened.
     */
    public static class MessageSelfDestructTypeTimer extends MessageSelfDestructType {
        /**
         * The message's self-destruct time, in seconds; must be between 0 and 60 in private chats.
         */
        public int selfDestructTime;

        /**
         * The message will be self-destructed in the specified time after its content was opened.
         */
        public MessageSelfDestructTypeTimer() {
        }

        /**
         * The message will be self-destructed in the specified time after its content was opened.
         *
         * @param selfDestructTime The message's self-destruct time, in seconds; must be between 0 and 60 in private chats.
         */
        public MessageSelfDestructTypeTimer(int selfDestructTime) {
            this.selfDestructTime = selfDestructTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1351440333;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message can be opened only once and will be self-destructed once closed.
     */
    public static class MessageSelfDestructTypeImmediately extends MessageSelfDestructType {

        /**
         * The message can be opened only once and will be self-destructed once closed.
         */
        public MessageSelfDestructTypeImmediately() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1036218363;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Options to be used when a message is sent.
     */
    public static class MessageSendOptions extends Object {
        /**
         * Pass true to disable notification for the message.
         */
        public boolean disableNotification;
        /**
         * Pass true if the message is sent from the background.
         */
        public boolean fromBackground;
        /**
         * Pass true if the content of the message must be protected from forwarding and saving; for bots only.
         */
        public boolean protectContent;
        /**
         * Pass true if the user explicitly chosen a sticker or a custom emoji from an installed sticker set; applicable only to sendMessage and sendMessageAlbum.
         */
        public boolean updateOrderOfInstalledStickerSets;
        /**
         * Message scheduling state; pass null to send message immediately. Messages sent to a secret chat, live location messages and self-destructing messages can't be scheduled.
         */
        public MessageSchedulingState schedulingState;
        /**
         * Identifier of the effect to apply to the message; pass 0 if none; applicable only to sendMessage and sendMessageAlbum in private chats.
         */
        public long effectId;
        /**
         * Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates.
         */
        public int sendingId;
        /**
         * Pass true to get a fake message instead of actually sending them.
         */
        public boolean onlyPreview;

        /**
         * Options to be used when a message is sent.
         */
        public MessageSendOptions() {
        }

        /**
         * Options to be used when a message is sent.
         *
         * @param disableNotification Pass true to disable notification for the message.
         * @param fromBackground Pass true if the message is sent from the background.
         * @param protectContent Pass true if the content of the message must be protected from forwarding and saving; for bots only.
         * @param updateOrderOfInstalledStickerSets Pass true if the user explicitly chosen a sticker or a custom emoji from an installed sticker set; applicable only to sendMessage and sendMessageAlbum.
         * @param schedulingState Message scheduling state; pass null to send message immediately. Messages sent to a secret chat, live location messages and self-destructing messages can't be scheduled.
         * @param effectId Identifier of the effect to apply to the message; pass 0 if none; applicable only to sendMessage and sendMessageAlbum in private chats.
         * @param sendingId Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates.
         * @param onlyPreview Pass true to get a fake message instead of actually sending them.
         */
        public MessageSendOptions(boolean disableNotification, boolean fromBackground, boolean protectContent, boolean updateOrderOfInstalledStickerSets, MessageSchedulingState schedulingState, long effectId, int sendingId, boolean onlyPreview) {
            this.disableNotification = disableNotification;
            this.fromBackground = fromBackground;
            this.protectContent = protectContent;
            this.updateOrderOfInstalledStickerSets = updateOrderOfInstalledStickerSets;
            this.schedulingState = schedulingState;
            this.effectId = effectId;
            this.sendingId = sendingId;
            this.onlyPreview = onlyPreview;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2105243218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the sender of a message.
     */
    public abstract static class MessageSender extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSenderUser.CONSTRUCTOR,
            MessageSenderChat.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSender() {
        }
    }

    /**
     * The message was sent by a known user.
     */
    public static class MessageSenderUser extends MessageSender {
        /**
         * Identifier of the user that sent the message.
         */
        public long userId;

        /**
         * The message was sent by a known user.
         */
        public MessageSenderUser() {
        }

        /**
         * The message was sent by a known user.
         *
         * @param userId Identifier of the user that sent the message.
         */
        public MessageSenderUser(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -336109341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was sent on behalf of a chat.
     */
    public static class MessageSenderChat extends MessageSender {
        /**
         * Identifier of the chat that sent the message.
         */
        public long chatId;

        /**
         * The message was sent on behalf of a chat.
         */
        public MessageSenderChat() {
        }

        /**
         * The message was sent on behalf of a chat.
         *
         * @param chatId Identifier of the chat that sent the message.
         */
        public MessageSenderChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -239660751;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of message senders.
     */
    public static class MessageSenders extends Object {
        /**
         * Approximate total number of messages senders found.
         */
        public int totalCount;
        /**
         * List of message senders.
         */
        public MessageSender[] senders;

        /**
         * Represents a list of message senders.
         */
        public MessageSenders() {
        }

        /**
         * Represents a list of message senders.
         *
         * @param totalCount Approximate total number of messages senders found.
         * @param senders List of message senders.
         */
        public MessageSenders(int totalCount, MessageSender[] senders) {
            this.totalCount = totalCount;
            this.senders = senders;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -690158467;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the sending state of the message.
     */
    public abstract static class MessageSendingState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSendingStatePending.CONSTRUCTOR,
            MessageSendingStateFailed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSendingState() {
        }
    }

    /**
     * The message is being sent now, but has not yet been delivered to the server.
     */
    public static class MessageSendingStatePending extends MessageSendingState {
        /**
         * Non-persistent message sending identifier, specified by the application.
         */
        public int sendingId;

        /**
         * The message is being sent now, but has not yet been delivered to the server.
         */
        public MessageSendingStatePending() {
        }

        /**
         * The message is being sent now, but has not yet been delivered to the server.
         *
         * @param sendingId Non-persistent message sending identifier, specified by the application.
         */
        public MessageSendingStatePending(int sendingId) {
            this.sendingId = sendingId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -215260236;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message failed to be sent.
     */
    public static class MessageSendingStateFailed extends MessageSendingState {
        /**
         * The cause of the message sending failure.
         */
        public Error error;
        /**
         * True, if the message can be re-sent.
         */
        public boolean canRetry;
        /**
         * True, if the message can be re-sent only on behalf of a different sender.
         */
        public boolean needAnotherSender;
        /**
         * True, if the message can be re-sent only if another quote is chosen in the message that is replied by the given message.
         */
        public boolean needAnotherReplyQuote;
        /**
         * True, if the message can be re-sent only if the message to be replied is removed. This will be done automatically by resendMessages.
         */
        public boolean needDropReply;
        /**
         * Time left before the message can be re-sent, in seconds. No update is sent when this field changes.
         */
        public double retryAfter;

        /**
         * The message failed to be sent.
         */
        public MessageSendingStateFailed() {
        }

        /**
         * The message failed to be sent.
         *
         * @param error The cause of the message sending failure.
         * @param canRetry True, if the message can be re-sent.
         * @param needAnotherSender True, if the message can be re-sent only on behalf of a different sender.
         * @param needAnotherReplyQuote True, if the message can be re-sent only if another quote is chosen in the message that is replied by the given message.
         * @param needDropReply True, if the message can be re-sent only if the message to be replied is removed. This will be done automatically by resendMessages.
         * @param retryAfter Time left before the message can be re-sent, in seconds. No update is sent when this field changes.
         */
        public MessageSendingStateFailed(Error error, boolean canRetry, boolean needAnotherSender, boolean needAnotherReplyQuote, boolean needDropReply, double retryAfter) {
            this.error = error;
            this.canRetry = canRetry;
            this.needAnotherSender = needAnotherSender;
            this.needAnotherReplyQuote = needAnotherReplyQuote;
            this.needDropReply = needDropReply;
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1400770978;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes source of a message.
     */
    public abstract static class MessageSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSourceChatHistory.CONSTRUCTOR,
            MessageSourceMessageThreadHistory.CONSTRUCTOR,
            MessageSourceForumTopicHistory.CONSTRUCTOR,
            MessageSourceHistoryPreview.CONSTRUCTOR,
            MessageSourceChatList.CONSTRUCTOR,
            MessageSourceSearch.CONSTRUCTOR,
            MessageSourceChatEventLog.CONSTRUCTOR,
            MessageSourceNotification.CONSTRUCTOR,
            MessageSourceScreenshot.CONSTRUCTOR,
            MessageSourceOther.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSource() {
        }
    }

    /**
     * The message is from a chat history.
     */
    public static class MessageSourceChatHistory extends MessageSource {

        /**
         * The message is from a chat history.
         */
        public MessageSourceChatHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1090386116;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from a message thread history.
     */
    public static class MessageSourceMessageThreadHistory extends MessageSource {

        /**
         * The message is from a message thread history.
         */
        public MessageSourceMessageThreadHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 290427142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from a forum topic history.
     */
    public static class MessageSourceForumTopicHistory extends MessageSource {

        /**
         * The message is from a forum topic history.
         */
        public MessageSourceForumTopicHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1518064457;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from chat, message thread or forum topic history preview.
     */
    public static class MessageSourceHistoryPreview extends MessageSource {

        /**
         * The message is from chat, message thread or forum topic history preview.
         */
        public MessageSourceHistoryPreview() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1024254993;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from a chat list or a forum topic list.
     */
    public static class MessageSourceChatList extends MessageSource {

        /**
         * The message is from a chat list or a forum topic list.
         */
        public MessageSourceChatList() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2047406102;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from search results, including file downloads, local file list, outgoing document messages, calendar.
     */
    public static class MessageSourceSearch extends MessageSource {

        /**
         * The message is from search results, including file downloads, local file list, outgoing document messages, calendar.
         */
        public MessageSourceSearch() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1921333105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from a chat event log.
     */
    public static class MessageSourceChatEventLog extends MessageSource {

        /**
         * The message is from a chat event log.
         */
        public MessageSourceChatEventLog() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1028777540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from a notification.
     */
    public static class MessageSourceNotification extends MessageSource {

        /**
         * The message is from a notification.
         */
        public MessageSourceNotification() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1046406163;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was screenshotted; the source must be used only if the message content was visible during the screenshot.
     */
    public static class MessageSourceScreenshot extends MessageSource {

        /**
         * The message was screenshotted; the source must be used only if the message content was visible during the screenshot.
         */
        public MessageSourceScreenshot() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 469982474;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from some other source.
     */
    public static class MessageSourceOther extends MessageSource {

        /**
         * The message is from some other source.
         */
        public MessageSourceOther() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 901818114;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the sponsor of a message.
     */
    public static class MessageSponsor extends Object {
        /**
         * URL of the sponsor to be opened when the message is clicked.
         */
        public String url;
        /**
         * Photo of the sponsor; may be null if must not be shown.
         */
        @Nullable public Photo photo;
        /**
         * Additional optional information about the sponsor to be shown along with the message.
         */
        public String info;

        /**
         * Information about the sponsor of a message.
         */
        public MessageSponsor() {
        }

        /**
         * Information about the sponsor of a message.
         *
         * @param url URL of the sponsor to be opened when the message is clicked.
         * @param photo Photo of the sponsor; may be null if must not be shown.
         * @param info Additional optional information about the sponsor to be shown along with the message.
         */
        public MessageSponsor(String url, Photo photo, String info) {
            this.url = url;
            this.photo = photo;
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2009223646;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about a message.
     */
    public static class MessageStatistics extends Object {
        /**
         * A graph containing number of message views and shares.
         */
        public StatisticalGraph messageInteractionGraph;
        /**
         * A graph containing number of message reactions.
         */
        public StatisticalGraph messageReactionGraph;

        /**
         * A detailed statistics about a message.
         */
        public MessageStatistics() {
        }

        /**
         * A detailed statistics about a message.
         *
         * @param messageInteractionGraph A graph containing number of message views and shares.
         * @param messageReactionGraph A graph containing number of message reactions.
         */
        public MessageStatistics(StatisticalGraph messageInteractionGraph, StatisticalGraph messageReactionGraph) {
            this.messageInteractionGraph = messageInteractionGraph;
            this.messageReactionGraph = messageReactionGraph;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1563537657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a message thread.
     */
    public static class MessageThreadInfo extends Object {
        /**
         * Identifier of the chat to which the message thread belongs.
         */
        public long chatId;
        /**
         * Message thread identifier, unique within the chat.
         */
        public long messageThreadId;
        /**
         * Information about the message thread; may be null for forum topic threads.
         */
        @Nullable public MessageReplyInfo replyInfo;
        /**
         * Approximate number of unread messages in the message thread.
         */
        public int unreadMessageCount;
        /**
         * The messages from which the thread starts. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId).
         */
        public Message[] messages;
        /**
         * A draft of a message in the message thread; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;

        /**
         * Contains information about a message thread.
         */
        public MessageThreadInfo() {
        }

        /**
         * Contains information about a message thread.
         *
         * @param chatId Identifier of the chat to which the message thread belongs.
         * @param messageThreadId Message thread identifier, unique within the chat.
         * @param replyInfo Information about the message thread; may be null for forum topic threads.
         * @param unreadMessageCount Approximate number of unread messages in the message thread.
         * @param messages The messages from which the thread starts. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId).
         * @param draftMessage A draft of a message in the message thread; may be null if none.
         */
        public MessageThreadInfo(long chatId, long messageThreadId, MessageReplyInfo replyInfo, int unreadMessageCount, Message[] messages, DraftMessage draftMessage) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.replyInfo = replyInfo;
            this.unreadMessageCount = unreadMessageCount;
            this.messages = messages;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -248536056;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a viewer of a message.
     */
    public static class MessageViewer extends Object {
        /**
         * User identifier of the viewer.
         */
        public long userId;
        /**
         * Approximate point in time (Unix timestamp) when the message was viewed.
         */
        public int viewDate;

        /**
         * Represents a viewer of a message.
         */
        public MessageViewer() {
        }

        /**
         * Represents a viewer of a message.
         *
         * @param userId User identifier of the viewer.
         * @param viewDate Approximate point in time (Unix timestamp) when the message was viewed.
         */
        public MessageViewer(long userId, int viewDate) {
            this.userId = userId;
            this.viewDate = viewDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1458639309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of message viewers.
     */
    public static class MessageViewers extends Object {
        /**
         * List of message viewers.
         */
        public MessageViewer[] viewers;

        /**
         * Represents a list of message viewers.
         */
        public MessageViewers() {
        }

        /**
         * Represents a list of message viewers.
         *
         * @param viewers List of message viewers.
         */
        public MessageViewers(MessageViewer[] viewers) {
            this.viewers = viewers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2116480287;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages.
     */
    public static class Messages extends Object {
        /**
         * Approximate total number of messages found.
         */
        public int totalCount;
        /**
         * List of messages; messages may be null.
         */
        public Message[] messages;

        /**
         * Contains a list of messages.
         */
        public Messages() {
        }

        /**
         * Contains a list of messages.
         *
         * @param totalCount Approximate total number of messages found.
         * @param messages List of messages; messages may be null.
         */
        public Messages(int totalCount, Message[] messages) {
            this.totalCount = totalCount;
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -16498159;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Thumbnail image of a very poor quality and low resolution.
     */
    public static class Minithumbnail extends Object {
        /**
         * Thumbnail width, usually doesn't exceed 40.
         */
        public int width;
        /**
         * Thumbnail height, usually doesn't exceed 40.
         */
        public int height;
        /**
         * The thumbnail in JPEG format.
         */
        public byte[] data;

        /**
         * Thumbnail image of a very poor quality and low resolution.
         */
        public Minithumbnail() {
        }

        /**
         * Thumbnail image of a very poor quality and low resolution.
         *
         * @param width Thumbnail width, usually doesn't exceed 40.
         * @param height Thumbnail height, usually doesn't exceed 40.
         * @param data The thumbnail in JPEG format.
         */
        public Minithumbnail(int width, int height, byte[] data) {
            this.width = width;
            this.height = height;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -328540758;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A full list of available network statistic entries.
     */
    public static class NetworkStatistics extends Object {
        /**
         * Point in time (Unix timestamp) from which the statistics are collected.
         */
        public int sinceDate;
        /**
         * Network statistics entries.
         */
        public NetworkStatisticsEntry[] entries;

        /**
         * A full list of available network statistic entries.
         */
        public NetworkStatistics() {
        }

        /**
         * A full list of available network statistic entries.
         *
         * @param sinceDate Point in time (Unix timestamp) from which the statistics are collected.
         * @param entries Network statistics entries.
         */
        public NetworkStatistics(int sinceDate, NetworkStatisticsEntry[] entries) {
            this.sinceDate = sinceDate;
            this.entries = entries;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1615554212;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains statistics about network usage.
     */
    public abstract static class NetworkStatisticsEntry extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NetworkStatisticsEntryFile.CONSTRUCTOR,
            NetworkStatisticsEntryCall.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NetworkStatisticsEntry() {
        }
    }

    /**
     * Contains information about the total amount of data that was used to send and receive files.
     */
    public static class NetworkStatisticsEntryFile extends NetworkStatisticsEntry {
        /**
         * Type of the file the data is part of; pass null if the data isn't related to files.
         */
        public FileType fileType;
        /**
         * Type of the network the data was sent through. Call setNetworkType to maintain the actual network type.
         */
        public NetworkType networkType;
        /**
         * Total number of bytes sent.
         */
        public long sentBytes;
        /**
         * Total number of bytes received.
         */
        public long receivedBytes;

        /**
         * Contains information about the total amount of data that was used to send and receive files.
         */
        public NetworkStatisticsEntryFile() {
        }

        /**
         * Contains information about the total amount of data that was used to send and receive files.
         *
         * @param fileType Type of the file the data is part of; pass null if the data isn't related to files.
         * @param networkType Type of the network the data was sent through. Call setNetworkType to maintain the actual network type.
         * @param sentBytes Total number of bytes sent.
         * @param receivedBytes Total number of bytes received.
         */
        public NetworkStatisticsEntryFile(FileType fileType, NetworkType networkType, long sentBytes, long receivedBytes) {
            this.fileType = fileType;
            this.networkType = networkType;
            this.sentBytes = sentBytes;
            this.receivedBytes = receivedBytes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 188452706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the total amount of data that was used for calls.
     */
    public static class NetworkStatisticsEntryCall extends NetworkStatisticsEntry {
        /**
         * Type of the network the data was sent through. Call setNetworkType to maintain the actual network type.
         */
        public NetworkType networkType;
        /**
         * Total number of bytes sent.
         */
        public long sentBytes;
        /**
         * Total number of bytes received.
         */
        public long receivedBytes;
        /**
         * Total call duration, in seconds.
         */
        public double duration;

        /**
         * Contains information about the total amount of data that was used for calls.
         */
        public NetworkStatisticsEntryCall() {
        }

        /**
         * Contains information about the total amount of data that was used for calls.
         *
         * @param networkType Type of the network the data was sent through. Call setNetworkType to maintain the actual network type.
         * @param sentBytes Total number of bytes sent.
         * @param receivedBytes Total number of bytes received.
         * @param duration Total call duration, in seconds.
         */
        public NetworkStatisticsEntryCall(NetworkType networkType, long sentBytes, long receivedBytes, double duration) {
            this.networkType = networkType;
            this.sentBytes = sentBytes;
            this.receivedBytes = receivedBytes;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 737000365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the type of network.
     */
    public abstract static class NetworkType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NetworkTypeNone.CONSTRUCTOR,
            NetworkTypeMobile.CONSTRUCTOR,
            NetworkTypeMobileRoaming.CONSTRUCTOR,
            NetworkTypeWiFi.CONSTRUCTOR,
            NetworkTypeOther.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NetworkType() {
        }
    }

    /**
     * The network is not available.
     */
    public static class NetworkTypeNone extends NetworkType {

        /**
         * The network is not available.
         */
        public NetworkTypeNone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1971691759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A mobile network.
     */
    public static class NetworkTypeMobile extends NetworkType {

        /**
         * A mobile network.
         */
        public NetworkTypeMobile() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 819228239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A mobile roaming network.
     */
    public static class NetworkTypeMobileRoaming extends NetworkType {

        /**
         * A mobile roaming network.
         */
        public NetworkTypeMobileRoaming() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1435199760;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Wi-Fi network.
     */
    public static class NetworkTypeWiFi extends NetworkType {

        /**
         * A Wi-Fi network.
         */
        public NetworkTypeWiFi() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -633872070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A different network type (e.g., Ethernet network).
     */
    public static class NetworkTypeOther extends NetworkType {

        /**
         * A different network type (e.g., Ethernet network).
         */
        public NetworkTypeOther() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1942128539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains privacy settings for new chats with non-contacts.
     */
    public static class NewChatPrivacySettings extends Object {
        /**
         * True, if non-contacts users are able to write first to the current user. Telegram Premium subscribers are able to write first regardless of this setting.
         */
        public boolean allowNewChatsFromUnknownUsers;

        /**
         * Contains privacy settings for new chats with non-contacts.
         */
        public NewChatPrivacySettings() {
        }

        /**
         * Contains privacy settings for new chats with non-contacts.
         *
         * @param allowNewChatsFromUnknownUsers True, if non-contacts users are able to write first to the current user. Telegram Premium subscribers are able to write first regardless of this setting.
         */
        public NewChatPrivacySettings(boolean allowNewChatsFromUnknownUsers) {
            this.allowNewChatsFromUnknownUsers = allowNewChatsFromUnknownUsers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1528154694;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a notification.
     */
    public static class Notification extends Object {
        /**
         * Unique persistent identifier of this notification.
         */
        public int id;
        /**
         * Notification date.
         */
        public int date;
        /**
         * True, if the notification was explicitly sent without sound.
         */
        public boolean isSilent;
        /**
         * Notification type.
         */
        public NotificationType type;

        /**
         * Contains information about a notification.
         */
        public Notification() {
        }

        /**
         * Contains information about a notification.
         *
         * @param id Unique persistent identifier of this notification.
         * @param date Notification date.
         * @param isSilent True, if the notification was explicitly sent without sound.
         * @param type Notification type.
         */
        public Notification(int id, int date, boolean isSilent, NotificationType type) {
            this.id = id;
            this.date = date;
            this.isSilent = isSilent;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 788743120;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a group of notifications.
     */
    public static class NotificationGroup extends Object {
        /**
         * Unique persistent auto-incremented from 1 identifier of the notification group.
         */
        public int id;
        /**
         * Type of the group.
         */
        public NotificationGroupType type;
        /**
         * Identifier of a chat to which all notifications in the group belong.
         */
        public long chatId;
        /**
         * Total number of active notifications in the group.
         */
        public int totalCount;
        /**
         * The list of active notifications.
         */
        public Notification[] notifications;

        /**
         * Describes a group of notifications.
         */
        public NotificationGroup() {
        }

        /**
         * Describes a group of notifications.
         *
         * @param id Unique persistent auto-incremented from 1 identifier of the notification group.
         * @param type Type of the group.
         * @param chatId Identifier of a chat to which all notifications in the group belong.
         * @param totalCount Total number of active notifications in the group.
         * @param notifications The list of active notifications.
         */
        public NotificationGroup(int id, NotificationGroupType type, long chatId, int totalCount, Notification[] notifications) {
            this.id = id;
            this.type = type;
            this.chatId = chatId;
            this.totalCount = totalCount;
            this.notifications = notifications;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 780691541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of notifications in a notification group.
     */
    public abstract static class NotificationGroupType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NotificationGroupTypeMessages.CONSTRUCTOR,
            NotificationGroupTypeMentions.CONSTRUCTOR,
            NotificationGroupTypeSecretChat.CONSTRUCTOR,
            NotificationGroupTypeCalls.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NotificationGroupType() {
        }
    }

    /**
     * A group containing notifications of type notificationTypeNewMessage and notificationTypeNewPushMessage with ordinary unread messages.
     */
    public static class NotificationGroupTypeMessages extends NotificationGroupType {

        /**
         * A group containing notifications of type notificationTypeNewMessage and notificationTypeNewPushMessage with ordinary unread messages.
         */
        public NotificationGroupTypeMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1702481123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A group containing notifications of type notificationTypeNewMessage and notificationTypeNewPushMessage with unread mentions of the current user, replies to their messages, or a pinned message.
     */
    public static class NotificationGroupTypeMentions extends NotificationGroupType {

        /**
         * A group containing notifications of type notificationTypeNewMessage and notificationTypeNewPushMessage with unread mentions of the current user, replies to their messages, or a pinned message.
         */
        public NotificationGroupTypeMentions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2050324051;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A group containing a notification of type notificationTypeNewSecretChat.
     */
    public static class NotificationGroupTypeSecretChat extends NotificationGroupType {

        /**
         * A group containing a notification of type notificationTypeNewSecretChat.
         */
        public NotificationGroupTypeSecretChat() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1390759476;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A group containing notifications of type notificationTypeNewCall.
     */
    public static class NotificationGroupTypeCalls extends NotificationGroupType {

        /**
         * A group containing notifications of type notificationTypeNewCall.
         */
        public NotificationGroupTypeCalls() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1379123538;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the types of chats to which notification settings are relevant.
     */
    public abstract static class NotificationSettingsScope extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NotificationSettingsScopePrivateChats.CONSTRUCTOR,
            NotificationSettingsScopeGroupChats.CONSTRUCTOR,
            NotificationSettingsScopeChannelChats.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NotificationSettingsScope() {
        }
    }

    /**
     * Notification settings applied to all private and secret chats when the corresponding chat setting has a default value.
     */
    public static class NotificationSettingsScopePrivateChats extends NotificationSettingsScope {

        /**
         * Notification settings applied to all private and secret chats when the corresponding chat setting has a default value.
         */
        public NotificationSettingsScopePrivateChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 937446759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings applied to all basic group and supergroup chats when the corresponding chat setting has a default value.
     */
    public static class NotificationSettingsScopeGroupChats extends NotificationSettingsScope {

        /**
         * Notification settings applied to all basic group and supergroup chats when the corresponding chat setting has a default value.
         */
        public NotificationSettingsScopeGroupChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1212142067;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings applied to all channel chats when the corresponding chat setting has a default value.
     */
    public static class NotificationSettingsScopeChannelChats extends NotificationSettingsScope {

        /**
         * Notification settings applied to all channel chats when the corresponding chat setting has a default value.
         */
        public NotificationSettingsScopeChannelChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 548013448;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a notification sound in MP3 format.
     */
    public static class NotificationSound extends Object {
        /**
         * Unique identifier of the notification sound.
         */
        public long id;
        /**
         * Duration of the sound, in seconds.
         */
        public int duration;
        /**
         * Point in time (Unix timestamp) when the sound was created.
         */
        public int date;
        /**
         * Title of the notification sound.
         */
        public String title;
        /**
         * Arbitrary data, defined while the sound was uploaded.
         */
        public String data;
        /**
         * File containing the sound.
         */
        public File sound;

        /**
         * Describes a notification sound in MP3 format.
         */
        public NotificationSound() {
        }

        /**
         * Describes a notification sound in MP3 format.
         *
         * @param id Unique identifier of the notification sound.
         * @param duration Duration of the sound, in seconds.
         * @param date Point in time (Unix timestamp) when the sound was created.
         * @param title Title of the notification sound.
         * @param data Arbitrary data, defined while the sound was uploaded.
         * @param sound File containing the sound.
         */
        public NotificationSound(long id, int duration, int date, String title, String data, File sound) {
            this.id = id;
            this.duration = duration;
            this.date = date;
            this.title = title;
            this.data = data;
            this.sound = sound;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -185638601;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of notification sounds.
     */
    public static class NotificationSounds extends Object {
        /**
         * A list of notification sounds.
         */
        public NotificationSound[] notificationSounds;

        /**
         * Contains a list of notification sounds.
         */
        public NotificationSounds() {
        }

        /**
         * Contains a list of notification sounds.
         *
         * @param notificationSounds A list of notification sounds.
         */
        public NotificationSounds(NotificationSound[] notificationSounds) {
            this.notificationSounds = notificationSounds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -630813169;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains detailed information about a notification.
     */
    public abstract static class NotificationType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NotificationTypeNewMessage.CONSTRUCTOR,
            NotificationTypeNewSecretChat.CONSTRUCTOR,
            NotificationTypeNewCall.CONSTRUCTOR,
            NotificationTypeNewPushMessage.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NotificationType() {
        }
    }

    /**
     * New message was received.
     */
    public static class NotificationTypeNewMessage extends NotificationType {
        /**
         * The message.
         */
        public Message message;
        /**
         * True, if message content must be displayed in notifications.
         */
        public boolean showPreview;

        /**
         * New message was received.
         */
        public NotificationTypeNewMessage() {
        }

        /**
         * New message was received.
         *
         * @param message The message.
         * @param showPreview True, if message content must be displayed in notifications.
         */
        public NotificationTypeNewMessage(Message message, boolean showPreview) {
            this.message = message;
            this.showPreview = showPreview;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -254745614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New secret chat was created.
     */
    public static class NotificationTypeNewSecretChat extends NotificationType {

        /**
         * New secret chat was created.
         */
        public NotificationTypeNewSecretChat() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1198638768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New call was received.
     */
    public static class NotificationTypeNewCall extends NotificationType {
        /**
         * Call identifier.
         */
        public int callId;

        /**
         * New call was received.
         */
        public NotificationTypeNewCall() {
        }

        /**
         * New call was received.
         *
         * @param callId Call identifier.
         */
        public NotificationTypeNewCall(int callId) {
            this.callId = callId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1712734585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New message was received through a push notification.
     */
    public static class NotificationTypeNewPushMessage extends NotificationType {
        /**
         * The message identifier. The message will not be available in the chat history, but the identifier can be used in viewMessages, or as a message to be replied in the same chat.
         */
        public long messageId;
        /**
         * Identifier of the sender of the message. Corresponding user or chat may be inaccessible.
         */
        public MessageSender senderId;
        /**
         * Name of the sender.
         */
        public String senderName;
        /**
         * True, if the message is outgoing.
         */
        public boolean isOutgoing;
        /**
         * Push message content.
         */
        public PushMessageContent content;

        /**
         * New message was received through a push notification.
         */
        public NotificationTypeNewPushMessage() {
        }

        /**
         * New message was received through a push notification.
         *
         * @param messageId The message identifier. The message will not be available in the chat history, but the identifier can be used in viewMessages, or as a message to be replied in the same chat.
         * @param senderId Identifier of the sender of the message. Corresponding user or chat may be inaccessible.
         * @param senderName Name of the sender.
         * @param isOutgoing True, if the message is outgoing.
         * @param content Push message content.
         */
        public NotificationTypeNewPushMessage(long messageId, MessageSender senderId, String senderName, boolean isOutgoing, PushMessageContent content) {
            this.messageId = messageId;
            this.senderId = senderId;
            this.senderName = senderName;
            this.isOutgoing = isOutgoing;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -711680462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An object of this type is returned on a successful function call for certain functions.
     */
    public static class Ok extends Object {

        /**
         * An object of this type is returned on a successful function call for certain functions.
         */
        public Ok() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -722616727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the value of an option.
     */
    public abstract static class OptionValue extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            OptionValueBoolean.CONSTRUCTOR,
            OptionValueEmpty.CONSTRUCTOR,
            OptionValueInteger.CONSTRUCTOR,
            OptionValueString.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public OptionValue() {
        }
    }

    /**
     * Represents a boolean option.
     */
    public static class OptionValueBoolean extends OptionValue {
        /**
         * The value of the option.
         */
        public boolean value;

        /**
         * Represents a boolean option.
         */
        public OptionValueBoolean() {
        }

        /**
         * Represents a boolean option.
         *
         * @param value The value of the option.
         */
        public OptionValueBoolean(boolean value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 63135518;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an unknown option or an option which has a default value.
     */
    public static class OptionValueEmpty extends OptionValue {

        /**
         * Represents an unknown option or an option which has a default value.
         */
        public OptionValueEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 918955155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an integer option.
     */
    public static class OptionValueInteger extends OptionValue {
        /**
         * The value of the option.
         */
        public long value;

        /**
         * Represents an integer option.
         */
        public OptionValueInteger() {
        }

        /**
         * Represents an integer option.
         *
         * @param value The value of the option.
         */
        public OptionValueInteger(long value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -186858780;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a string option.
     */
    public static class OptionValueString extends OptionValue {
        /**
         * The value of the option.
         */
        public String value;

        /**
         * Represents a string option.
         */
        public OptionValueString() {
        }

        /**
         * Represents a string option.
         *
         * @param value The value of the option.
         */
        public OptionValueString(String value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 756248212;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Order information.
     */
    public static class OrderInfo extends Object {
        /**
         * Name of the user.
         */
        public String name;
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * Email address of the user.
         */
        public String emailAddress;
        /**
         * Shipping address for this order; may be null.
         */
        @Nullable public Address shippingAddress;

        /**
         * Order information.
         */
        public OrderInfo() {
        }

        /**
         * Order information.
         *
         * @param name Name of the user.
         * @param phoneNumber Phone number of the user.
         * @param emailAddress Email address of the user.
         * @param shippingAddress Shipping address for this order; may be null.
         */
        public OrderInfo(String name, String phoneNumber, String emailAddress, Address shippingAddress) {
            this.name = name;
            this.phoneNumber = phoneNumber;
            this.emailAddress = emailAddress;
            this.shippingAddress = shippingAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 783997294;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a block of an instant view for a web page.
     */
    public abstract static class PageBlock extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PageBlockTitle.CONSTRUCTOR,
            PageBlockSubtitle.CONSTRUCTOR,
            PageBlockAuthorDate.CONSTRUCTOR,
            PageBlockHeader.CONSTRUCTOR,
            PageBlockSubheader.CONSTRUCTOR,
            PageBlockKicker.CONSTRUCTOR,
            PageBlockParagraph.CONSTRUCTOR,
            PageBlockPreformatted.CONSTRUCTOR,
            PageBlockFooter.CONSTRUCTOR,
            PageBlockDivider.CONSTRUCTOR,
            PageBlockAnchor.CONSTRUCTOR,
            PageBlockList.CONSTRUCTOR,
            PageBlockBlockQuote.CONSTRUCTOR,
            PageBlockPullQuote.CONSTRUCTOR,
            PageBlockAnimation.CONSTRUCTOR,
            PageBlockAudio.CONSTRUCTOR,
            PageBlockPhoto.CONSTRUCTOR,
            PageBlockVideo.CONSTRUCTOR,
            PageBlockVoiceNote.CONSTRUCTOR,
            PageBlockCover.CONSTRUCTOR,
            PageBlockEmbedded.CONSTRUCTOR,
            PageBlockEmbeddedPost.CONSTRUCTOR,
            PageBlockCollage.CONSTRUCTOR,
            PageBlockSlideshow.CONSTRUCTOR,
            PageBlockChatLink.CONSTRUCTOR,
            PageBlockTable.CONSTRUCTOR,
            PageBlockDetails.CONSTRUCTOR,
            PageBlockRelatedArticles.CONSTRUCTOR,
            PageBlockMap.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PageBlock() {
        }
    }

    /**
     * The title of a page.
     */
    public static class PageBlockTitle extends PageBlock {
        /**
         * Title.
         */
        public RichText title;

        /**
         * The title of a page.
         */
        public PageBlockTitle() {
        }

        /**
         * The title of a page.
         *
         * @param title Title.
         */
        public PageBlockTitle(RichText title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1629664784;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The subtitle of a page.
     */
    public static class PageBlockSubtitle extends PageBlock {
        /**
         * Subtitle.
         */
        public RichText subtitle;

        /**
         * The subtitle of a page.
         */
        public PageBlockSubtitle() {
        }

        /**
         * The subtitle of a page.
         *
         * @param subtitle Subtitle.
         */
        public PageBlockSubtitle(RichText subtitle) {
            this.subtitle = subtitle;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 264524263;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The author and publishing date of a page.
     */
    public static class PageBlockAuthorDate extends PageBlock {
        /**
         * Author.
         */
        public RichText author;
        /**
         * Point in time (Unix timestamp) when the article was published; 0 if unknown.
         */
        public int publishDate;

        /**
         * The author and publishing date of a page.
         */
        public PageBlockAuthorDate() {
        }

        /**
         * The author and publishing date of a page.
         *
         * @param author Author.
         * @param publishDate Point in time (Unix timestamp) when the article was published; 0 if unknown.
         */
        public PageBlockAuthorDate(RichText author, int publishDate) {
            this.author = author;
            this.publishDate = publishDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1300231184;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A header.
     */
    public static class PageBlockHeader extends PageBlock {
        /**
         * Header.
         */
        public RichText header;

        /**
         * A header.
         */
        public PageBlockHeader() {
        }

        /**
         * A header.
         *
         * @param header Header.
         */
        public PageBlockHeader(RichText header) {
            this.header = header;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1402854811;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A subheader.
     */
    public static class PageBlockSubheader extends PageBlock {
        /**
         * Subheader.
         */
        public RichText subheader;

        /**
         * A subheader.
         */
        public PageBlockSubheader() {
        }

        /**
         * A subheader.
         *
         * @param subheader Subheader.
         */
        public PageBlockSubheader(RichText subheader) {
            this.subheader = subheader;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1263956774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A kicker.
     */
    public static class PageBlockKicker extends PageBlock {
        /**
         * Kicker.
         */
        public RichText kicker;

        /**
         * A kicker.
         */
        public PageBlockKicker() {
        }

        /**
         * A kicker.
         *
         * @param kicker Kicker.
         */
        public PageBlockKicker(RichText kicker) {
            this.kicker = kicker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1361282635;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text paragraph.
     */
    public static class PageBlockParagraph extends PageBlock {
        /**
         * Paragraph text.
         */
        public RichText text;

        /**
         * A text paragraph.
         */
        public PageBlockParagraph() {
        }

        /**
         * A text paragraph.
         *
         * @param text Paragraph text.
         */
        public PageBlockParagraph(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1182402406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A preformatted text paragraph.
     */
    public static class PageBlockPreformatted extends PageBlock {
        /**
         * Paragraph text.
         */
        public RichText text;
        /**
         * Programming language for which the text needs to be formatted.
         */
        public String language;

        /**
         * A preformatted text paragraph.
         */
        public PageBlockPreformatted() {
        }

        /**
         * A preformatted text paragraph.
         *
         * @param text Paragraph text.
         * @param language Programming language for which the text needs to be formatted.
         */
        public PageBlockPreformatted(RichText text, String language) {
            this.text = text;
            this.language = language;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1066346178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The footer of a page.
     */
    public static class PageBlockFooter extends PageBlock {
        /**
         * Footer.
         */
        public RichText footer;

        /**
         * The footer of a page.
         */
        public PageBlockFooter() {
        }

        /**
         * The footer of a page.
         *
         * @param footer Footer.
         */
        public PageBlockFooter(RichText footer) {
            this.footer = footer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 886429480;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An empty block separating a page.
     */
    public static class PageBlockDivider extends PageBlock {

        /**
         * An empty block separating a page.
         */
        public PageBlockDivider() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -618614392;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor.
     */
    public static class PageBlockAnchor extends PageBlock {
        /**
         * Name of the anchor.
         */
        public String name;

        /**
         * An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor.
         */
        public PageBlockAnchor() {
        }

        /**
         * An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor.
         *
         * @param name Name of the anchor.
         */
        public PageBlockAnchor(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -837994576;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of data blocks.
     */
    public static class PageBlockList extends PageBlock {
        /**
         * The items of the list.
         */
        public PageBlockListItem[] items;

        /**
         * A list of data blocks.
         */
        public PageBlockList() {
        }

        /**
         * A list of data blocks.
         *
         * @param items The items of the list.
         */
        public PageBlockList(PageBlockListItem[] items) {
            this.items = items;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1037074852;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A block quote.
     */
    public static class PageBlockBlockQuote extends PageBlock {
        /**
         * Quote text.
         */
        public RichText text;
        /**
         * Quote credit.
         */
        public RichText credit;

        /**
         * A block quote.
         */
        public PageBlockBlockQuote() {
        }

        /**
         * A block quote.
         *
         * @param text Quote text.
         * @param credit Quote credit.
         */
        public PageBlockBlockQuote(RichText text, RichText credit) {
            this.text = text;
            this.credit = credit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1657834142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A pull quote.
     */
    public static class PageBlockPullQuote extends PageBlock {
        /**
         * Quote text.
         */
        public RichText text;
        /**
         * Quote credit.
         */
        public RichText credit;

        /**
         * A pull quote.
         */
        public PageBlockPullQuote() {
        }

        /**
         * A pull quote.
         *
         * @param text Quote text.
         * @param credit Quote credit.
         */
        public PageBlockPullQuote(RichText text, RichText credit) {
            this.text = text;
            this.credit = credit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 490242317;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation.
     */
    public static class PageBlockAnimation extends PageBlock {
        /**
         * Animation file; may be null.
         */
        @Nullable public Animation animation;
        /**
         * Animation caption.
         */
        public PageBlockCaption caption;
        /**
         * True, if the animation must be played automatically.
         */
        public boolean needAutoplay;

        /**
         * An animation.
         */
        public PageBlockAnimation() {
        }

        /**
         * An animation.
         *
         * @param animation Animation file; may be null.
         * @param caption Animation caption.
         * @param needAutoplay True, if the animation must be played automatically.
         */
        public PageBlockAnimation(Animation animation, PageBlockCaption caption, boolean needAutoplay) {
            this.animation = animation;
            this.caption = caption;
            this.needAutoplay = needAutoplay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1355669513;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An audio file.
     */
    public static class PageBlockAudio extends PageBlock {
        /**
         * Audio file; may be null.
         */
        @Nullable public Audio audio;
        /**
         * Audio file caption.
         */
        public PageBlockCaption caption;

        /**
         * An audio file.
         */
        public PageBlockAudio() {
        }

        /**
         * An audio file.
         *
         * @param audio Audio file; may be null.
         * @param caption Audio file caption.
         */
        public PageBlockAudio(Audio audio, PageBlockCaption caption) {
            this.audio = audio;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -63371245;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A photo.
     */
    public static class PageBlockPhoto extends PageBlock {
        /**
         * Photo file; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Photo caption.
         */
        public PageBlockCaption caption;
        /**
         * URL that needs to be opened when the photo is clicked.
         */
        public String url;

        /**
         * A photo.
         */
        public PageBlockPhoto() {
        }

        /**
         * A photo.
         *
         * @param photo Photo file; may be null.
         * @param caption Photo caption.
         * @param url URL that needs to be opened when the photo is clicked.
         */
        public PageBlockPhoto(Photo photo, PageBlockCaption caption, String url) {
            this.photo = photo;
            this.caption = caption;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 417601156;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video.
     */
    public static class PageBlockVideo extends PageBlock {
        /**
         * Video file; may be null.
         */
        @Nullable public Video video;
        /**
         * Video caption.
         */
        public PageBlockCaption caption;
        /**
         * True, if the video must be played automatically.
         */
        public boolean needAutoplay;
        /**
         * True, if the video must be looped.
         */
        public boolean isLooped;

        /**
         * A video.
         */
        public PageBlockVideo() {
        }

        /**
         * A video.
         *
         * @param video Video file; may be null.
         * @param caption Video caption.
         * @param needAutoplay True, if the video must be played automatically.
         * @param isLooped True, if the video must be looped.
         */
        public PageBlockVideo(Video video, PageBlockCaption caption, boolean needAutoplay, boolean isLooped) {
            this.video = video;
            this.caption = caption;
            this.needAutoplay = needAutoplay;
            this.isLooped = isLooped;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 510041394;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A voice note.
     */
    public static class PageBlockVoiceNote extends PageBlock {
        /**
         * Voice note; may be null.
         */
        @Nullable public VoiceNote voiceNote;
        /**
         * Voice note caption.
         */
        public PageBlockCaption caption;

        /**
         * A voice note.
         */
        public PageBlockVoiceNote() {
        }

        /**
         * A voice note.
         *
         * @param voiceNote Voice note; may be null.
         * @param caption Voice note caption.
         */
        public PageBlockVoiceNote(VoiceNote voiceNote, PageBlockCaption caption) {
            this.voiceNote = voiceNote;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1823310463;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A page cover.
     */
    public static class PageBlockCover extends PageBlock {
        /**
         * Cover.
         */
        public PageBlock cover;

        /**
         * A page cover.
         */
        public PageBlockCover() {
        }

        /**
         * A page cover.
         *
         * @param cover Cover.
         */
        public PageBlockCover(PageBlock cover) {
            this.cover = cover;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 972174080;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An embedded web page.
     */
    public static class PageBlockEmbedded extends PageBlock {
        /**
         * URL of the embedded page, if available.
         */
        public String url;
        /**
         * HTML-markup of the embedded page.
         */
        public String html;
        /**
         * Poster photo, if available; may be null.
         */
        @Nullable public Photo posterPhoto;
        /**
         * Block width; 0 if unknown.
         */
        public int width;
        /**
         * Block height; 0 if unknown.
         */
        public int height;
        /**
         * Block caption.
         */
        public PageBlockCaption caption;
        /**
         * True, if the block must be full width.
         */
        public boolean isFullWidth;
        /**
         * True, if scrolling needs to be allowed.
         */
        public boolean allowScrolling;

        /**
         * An embedded web page.
         */
        public PageBlockEmbedded() {
        }

        /**
         * An embedded web page.
         *
         * @param url URL of the embedded page, if available.
         * @param html HTML-markup of the embedded page.
         * @param posterPhoto Poster photo, if available; may be null.
         * @param width Block width; 0 if unknown.
         * @param height Block height; 0 if unknown.
         * @param caption Block caption.
         * @param isFullWidth True, if the block must be full width.
         * @param allowScrolling True, if scrolling needs to be allowed.
         */
        public PageBlockEmbedded(String url, String html, Photo posterPhoto, int width, int height, PageBlockCaption caption, boolean isFullWidth, boolean allowScrolling) {
            this.url = url;
            this.html = html;
            this.posterPhoto = posterPhoto;
            this.width = width;
            this.height = height;
            this.caption = caption;
            this.isFullWidth = isFullWidth;
            this.allowScrolling = allowScrolling;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1942577763;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An embedded post.
     */
    public static class PageBlockEmbeddedPost extends PageBlock {
        /**
         * URL of the embedded post.
         */
        public String url;
        /**
         * Post author.
         */
        public String author;
        /**
         * Post author photo; may be null.
         */
        @Nullable public Photo authorPhoto;
        /**
         * Point in time (Unix timestamp) when the post was created; 0 if unknown.
         */
        public int date;
        /**
         * Post content.
         */
        public PageBlock[] pageBlocks;
        /**
         * Post caption.
         */
        public PageBlockCaption caption;

        /**
         * An embedded post.
         */
        public PageBlockEmbeddedPost() {
        }

        /**
         * An embedded post.
         *
         * @param url URL of the embedded post.
         * @param author Post author.
         * @param authorPhoto Post author photo; may be null.
         * @param date Point in time (Unix timestamp) when the post was created; 0 if unknown.
         * @param pageBlocks Post content.
         * @param caption Post caption.
         */
        public PageBlockEmbeddedPost(String url, String author, Photo authorPhoto, int date, PageBlock[] pageBlocks, PageBlockCaption caption) {
            this.url = url;
            this.author = author;
            this.authorPhoto = authorPhoto;
            this.date = date;
            this.pageBlocks = pageBlocks;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 397600949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A collage.
     */
    public static class PageBlockCollage extends PageBlock {
        /**
         * Collage item contents.
         */
        public PageBlock[] pageBlocks;
        /**
         * Block caption.
         */
        public PageBlockCaption caption;

        /**
         * A collage.
         */
        public PageBlockCollage() {
        }

        /**
         * A collage.
         *
         * @param pageBlocks Collage item contents.
         * @param caption Block caption.
         */
        public PageBlockCollage(PageBlock[] pageBlocks, PageBlockCaption caption) {
            this.pageBlocks = pageBlocks;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1163760110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A slideshow.
     */
    public static class PageBlockSlideshow extends PageBlock {
        /**
         * Slideshow item contents.
         */
        public PageBlock[] pageBlocks;
        /**
         * Block caption.
         */
        public PageBlockCaption caption;

        /**
         * A slideshow.
         */
        public PageBlockSlideshow() {
        }

        /**
         * A slideshow.
         *
         * @param pageBlocks Slideshow item contents.
         * @param caption Block caption.
         */
        public PageBlockSlideshow(PageBlock[] pageBlocks, PageBlockCaption caption) {
            this.pageBlocks = pageBlocks;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 539217375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A link to a chat.
     */
    public static class PageBlockChatLink extends PageBlock {
        /**
         * Chat title.
         */
        public String title;
        /**
         * Chat photo; may be null.
         */
        @Nullable public ChatPhotoInfo photo;
        /**
         * Identifier of the accent color for chat title and background of chat photo.
         */
        public int accentColorId;
        /**
         * Chat username by which all other information about the chat can be resolved.
         */
        public String username;

        /**
         * A link to a chat.
         */
        public PageBlockChatLink() {
        }

        /**
         * A link to a chat.
         *
         * @param title Chat title.
         * @param photo Chat photo; may be null.
         * @param accentColorId Identifier of the accent color for chat title and background of chat photo.
         * @param username Chat username by which all other information about the chat can be resolved.
         */
        public PageBlockChatLink(String title, ChatPhotoInfo photo, int accentColorId, String username) {
            this.title = title;
            this.photo = photo;
            this.accentColorId = accentColorId;
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1646188731;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A table.
     */
    public static class PageBlockTable extends PageBlock {
        /**
         * Table caption.
         */
        public RichText caption;
        /**
         * Table cells.
         */
        public PageBlockTableCell[][] cells;
        /**
         * True, if the table is bordered.
         */
        public boolean isBordered;
        /**
         * True, if the table is striped.
         */
        public boolean isStriped;

        /**
         * A table.
         */
        public PageBlockTable() {
        }

        /**
         * A table.
         *
         * @param caption Table caption.
         * @param cells Table cells.
         * @param isBordered True, if the table is bordered.
         * @param isStriped True, if the table is striped.
         */
        public PageBlockTable(RichText caption, PageBlockTableCell[][] cells, boolean isBordered, boolean isStriped) {
            this.caption = caption;
            this.cells = cells;
            this.isBordered = isBordered;
            this.isStriped = isStriped;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -942649288;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A collapsible block.
     */
    public static class PageBlockDetails extends PageBlock {
        /**
         * Always visible heading for the block.
         */
        public RichText header;
        /**
         * Block contents.
         */
        public PageBlock[] pageBlocks;
        /**
         * True, if the block is open by default.
         */
        public boolean isOpen;

        /**
         * A collapsible block.
         */
        public PageBlockDetails() {
        }

        /**
         * A collapsible block.
         *
         * @param header Always visible heading for the block.
         * @param pageBlocks Block contents.
         * @param isOpen True, if the block is open by default.
         */
        public PageBlockDetails(RichText header, PageBlock[] pageBlocks, boolean isOpen) {
            this.header = header;
            this.pageBlocks = pageBlocks;
            this.isOpen = isOpen;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1599869809;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Related articles.
     */
    public static class PageBlockRelatedArticles extends PageBlock {
        /**
         * Block header.
         */
        public RichText header;
        /**
         * List of related articles.
         */
        public PageBlockRelatedArticle[] articles;

        /**
         * Related articles.
         */
        public PageBlockRelatedArticles() {
        }

        /**
         * Related articles.
         *
         * @param header Block header.
         * @param articles List of related articles.
         */
        public PageBlockRelatedArticles(RichText header, PageBlockRelatedArticle[] articles) {
            this.header = header;
            this.articles = articles;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1807324374;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A map.
     */
    public static class PageBlockMap extends PageBlock {
        /**
         * Location of the map center.
         */
        public Location location;
        /**
         * Map zoom level.
         */
        public int zoom;
        /**
         * Map width.
         */
        public int width;
        /**
         * Map height.
         */
        public int height;
        /**
         * Block caption.
         */
        public PageBlockCaption caption;

        /**
         * A map.
         */
        public PageBlockMap() {
        }

        /**
         * A map.
         *
         * @param location Location of the map center.
         * @param zoom Map zoom level.
         * @param width Map width.
         * @param height Map height.
         * @param caption Block caption.
         */
        public PageBlockMap(Location location, int zoom, int width, int height, PageBlockCaption caption) {
            this.location = location;
            this.zoom = zoom;
            this.width = width;
            this.height = height;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1510961171;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a caption of another block.
     */
    public static class PageBlockCaption extends Object {
        /**
         * Content of the caption.
         */
        public RichText text;
        /**
         * Block credit (like HTML tag &lt;cite&gt;).
         */
        public RichText credit;

        /**
         * Contains a caption of another block.
         */
        public PageBlockCaption() {
        }

        /**
         * Contains a caption of another block.
         *
         * @param text Content of the caption.
         * @param credit Block credit (like HTML tag &lt;cite&gt;).
         */
        public PageBlockCaption(RichText text, RichText credit) {
            this.text = text;
            this.credit = credit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1180064650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a horizontal alignment of a table cell content.
     */
    public abstract static class PageBlockHorizontalAlignment extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PageBlockHorizontalAlignmentLeft.CONSTRUCTOR,
            PageBlockHorizontalAlignmentCenter.CONSTRUCTOR,
            PageBlockHorizontalAlignmentRight.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PageBlockHorizontalAlignment() {
        }
    }

    /**
     * The content must be left-aligned.
     */
    public static class PageBlockHorizontalAlignmentLeft extends PageBlockHorizontalAlignment {

        /**
         * The content must be left-aligned.
         */
        public PageBlockHorizontalAlignmentLeft() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 848701417;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The content must be center-aligned.
     */
    public static class PageBlockHorizontalAlignmentCenter extends PageBlockHorizontalAlignment {

        /**
         * The content must be center-aligned.
         */
        public PageBlockHorizontalAlignmentCenter() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1009203990;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The content must be right-aligned.
     */
    public static class PageBlockHorizontalAlignmentRight extends PageBlockHorizontalAlignment {

        /**
         * The content must be right-aligned.
         */
        public PageBlockHorizontalAlignmentRight() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1371369214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an item of a list page block.
     */
    public static class PageBlockListItem extends Object {
        /**
         * Item label.
         */
        public String label;
        /**
         * Item blocks.
         */
        public PageBlock[] pageBlocks;

        /**
         * Describes an item of a list page block.
         */
        public PageBlockListItem() {
        }

        /**
         * Describes an item of a list page block.
         *
         * @param label Item label.
         * @param pageBlocks Item blocks.
         */
        public PageBlockListItem(String label, PageBlock[] pageBlocks) {
            this.label = label;
            this.pageBlocks = pageBlocks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 323186259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a related article.
     */
    public static class PageBlockRelatedArticle extends Object {
        /**
         * Related article URL.
         */
        public String url;
        /**
         * Article title; may be empty.
         */
        public String title;
        /**
         * Article description; may be empty.
         */
        public String description;
        /**
         * Article photo; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Article author; may be empty.
         */
        public String author;
        /**
         * Point in time (Unix timestamp) when the article was published; 0 if unknown.
         */
        public int publishDate;

        /**
         * Contains information about a related article.
         */
        public PageBlockRelatedArticle() {
        }

        /**
         * Contains information about a related article.
         *
         * @param url Related article URL.
         * @param title Article title; may be empty.
         * @param description Article description; may be empty.
         * @param photo Article photo; may be null.
         * @param author Article author; may be empty.
         * @param publishDate Point in time (Unix timestamp) when the article was published; 0 if unknown.
         */
        public PageBlockRelatedArticle(String url, String title, String description, Photo photo, String author, int publishDate) {
            this.url = url;
            this.title = title;
            this.description = description;
            this.photo = photo;
            this.author = author;
            this.publishDate = publishDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 481199251;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a cell of a table.
     */
    public static class PageBlockTableCell extends Object {
        /**
         * Cell text; may be null. If the text is null, then the cell must be invisible.
         */
        @Nullable public RichText text;
        /**
         * True, if it is a header cell.
         */
        public boolean isHeader;
        /**
         * The number of columns the cell spans.
         */
        public int colspan;
        /**
         * The number of rows the cell spans.
         */
        public int rowspan;
        /**
         * Horizontal cell content alignment.
         */
        public PageBlockHorizontalAlignment align;
        /**
         * Vertical cell content alignment.
         */
        public PageBlockVerticalAlignment valign;

        /**
         * Represents a cell of a table.
         */
        public PageBlockTableCell() {
        }

        /**
         * Represents a cell of a table.
         *
         * @param text Cell text; may be null. If the text is null, then the cell must be invisible.
         * @param isHeader True, if it is a header cell.
         * @param colspan The number of columns the cell spans.
         * @param rowspan The number of rows the cell spans.
         * @param align Horizontal cell content alignment.
         * @param valign Vertical cell content alignment.
         */
        public PageBlockTableCell(RichText text, boolean isHeader, int colspan, int rowspan, PageBlockHorizontalAlignment align, PageBlockVerticalAlignment valign) {
            this.text = text;
            this.isHeader = isHeader;
            this.colspan = colspan;
            this.rowspan = rowspan;
            this.align = align;
            this.valign = valign;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1417658214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a Vertical alignment of a table cell content.
     */
    public abstract static class PageBlockVerticalAlignment extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PageBlockVerticalAlignmentTop.CONSTRUCTOR,
            PageBlockVerticalAlignmentMiddle.CONSTRUCTOR,
            PageBlockVerticalAlignmentBottom.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PageBlockVerticalAlignment() {
        }
    }

    /**
     * The content must be top-aligned.
     */
    public static class PageBlockVerticalAlignmentTop extends PageBlockVerticalAlignment {

        /**
         * The content must be top-aligned.
         */
        public PageBlockVerticalAlignmentTop() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 195500454;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The content must be middle-aligned.
     */
    public static class PageBlockVerticalAlignmentMiddle extends PageBlockVerticalAlignment {

        /**
         * The content must be middle-aligned.
         */
        public PageBlockVerticalAlignmentMiddle() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2123096587;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The content must be bottom-aligned.
     */
    public static class PageBlockVerticalAlignmentBottom extends PageBlockVerticalAlignment {

        /**
         * The content must be bottom-aligned.
         */
        public PageBlockVerticalAlignmentBottom() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2092531158;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a paid media.
     */
    public abstract static class PaidMedia extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaidMediaPreview.CONSTRUCTOR,
            PaidMediaPhoto.CONSTRUCTOR,
            PaidMediaVideo.CONSTRUCTOR,
            PaidMediaUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaidMedia() {
        }
    }

    /**
     * The media is hidden until the invoice is paid.
     */
    public static class PaidMediaPreview extends PaidMedia {
        /**
         * Media width; 0 if unknown.
         */
        public int width;
        /**
         * Media height; 0 if unknown.
         */
        public int height;
        /**
         * Media duration, in seconds; 0 if unknown.
         */
        public int duration;
        /**
         * Media minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;

        /**
         * The media is hidden until the invoice is paid.
         */
        public PaidMediaPreview() {
        }

        /**
         * The media is hidden until the invoice is paid.
         *
         * @param width Media width; 0 if unknown.
         * @param height Media height; 0 if unknown.
         * @param duration Media duration, in seconds; 0 if unknown.
         * @param minithumbnail Media minithumbnail; may be null.
         */
        public PaidMediaPreview(int width, int height, int duration, Minithumbnail minithumbnail) {
            this.width = width;
            this.height = height;
            this.duration = duration;
            this.minithumbnail = minithumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1128151948;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is a photo.
     */
    public static class PaidMediaPhoto extends PaidMedia {
        /**
         * The photo.
         */
        public Photo photo;

        /**
         * The media is a photo.
         */
        public PaidMediaPhoto() {
        }

        /**
         * The media is a photo.
         *
         * @param photo The photo.
         */
        public PaidMediaPhoto(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1165863654;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is a video.
     */
    public static class PaidMediaVideo extends PaidMedia {
        /**
         * The video.
         */
        public Video video;

        /**
         * The media is a video.
         */
        public PaidMediaVideo() {
        }

        /**
         * The media is a video.
         *
         * @param video The video.
         */
        public PaidMediaVideo(Video video) {
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 464858633;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is unsupported.
     */
    public static class PaidMediaUnsupported extends PaidMedia {

        /**
         * The media is unsupported.
         */
        public PaidMediaUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 112999974;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Passport authorization form that was requested.
     */
    public static class PassportAuthorizationForm extends Object {
        /**
         * Unique identifier of the authorization form.
         */
        public int id;
        /**
         * Telegram Passport elements that must be provided to complete the form.
         */
        public PassportRequiredElement[] requiredElements;
        /**
         * URL for the privacy policy of the service; may be empty.
         */
        public String privacyPolicyUrl;

        /**
         * Contains information about a Telegram Passport authorization form that was requested.
         */
        public PassportAuthorizationForm() {
        }

        /**
         * Contains information about a Telegram Passport authorization form that was requested.
         *
         * @param id Unique identifier of the authorization form.
         * @param requiredElements Telegram Passport elements that must be provided to complete the form.
         * @param privacyPolicyUrl URL for the privacy policy of the service; may be empty.
         */
        public PassportAuthorizationForm(int id, PassportRequiredElement[] requiredElements, String privacyPolicyUrl) {
            this.id = id;
            this.requiredElements = requiredElements;
            this.privacyPolicyUrl = privacyPolicyUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1070673218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a Telegram Passport element.
     */
    public abstract static class PassportElement extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PassportElementPersonalDetails.CONSTRUCTOR,
            PassportElementPassport.CONSTRUCTOR,
            PassportElementDriverLicense.CONSTRUCTOR,
            PassportElementIdentityCard.CONSTRUCTOR,
            PassportElementInternalPassport.CONSTRUCTOR,
            PassportElementAddress.CONSTRUCTOR,
            PassportElementUtilityBill.CONSTRUCTOR,
            PassportElementBankStatement.CONSTRUCTOR,
            PassportElementRentalAgreement.CONSTRUCTOR,
            PassportElementPassportRegistration.CONSTRUCTOR,
            PassportElementTemporaryRegistration.CONSTRUCTOR,
            PassportElementPhoneNumber.CONSTRUCTOR,
            PassportElementEmailAddress.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PassportElement() {
        }
    }

    /**
     * A Telegram Passport element containing the user's personal details.
     */
    public static class PassportElementPersonalDetails extends PassportElement {
        /**
         * Personal details of the user.
         */
        public PersonalDetails personalDetails;

        /**
         * A Telegram Passport element containing the user's personal details.
         */
        public PassportElementPersonalDetails() {
        }

        /**
         * A Telegram Passport element containing the user's personal details.
         *
         * @param personalDetails Personal details of the user.
         */
        public PassportElementPersonalDetails(PersonalDetails personalDetails) {
            this.personalDetails = personalDetails;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1217724035;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's passport.
     */
    public static class PassportElementPassport extends PassportElement {
        /**
         * Passport.
         */
        public IdentityDocument passport;

        /**
         * A Telegram Passport element containing the user's passport.
         */
        public PassportElementPassport() {
        }

        /**
         * A Telegram Passport element containing the user's passport.
         *
         * @param passport Passport.
         */
        public PassportElementPassport(IdentityDocument passport) {
            this.passport = passport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -263985373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's driver license.
     */
    public static class PassportElementDriverLicense extends PassportElement {
        /**
         * Driver license.
         */
        public IdentityDocument driverLicense;

        /**
         * A Telegram Passport element containing the user's driver license.
         */
        public PassportElementDriverLicense() {
        }

        /**
         * A Telegram Passport element containing the user's driver license.
         *
         * @param driverLicense Driver license.
         */
        public PassportElementDriverLicense(IdentityDocument driverLicense) {
            this.driverLicense = driverLicense;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1643580589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's identity card.
     */
    public static class PassportElementIdentityCard extends PassportElement {
        /**
         * Identity card.
         */
        public IdentityDocument identityCard;

        /**
         * A Telegram Passport element containing the user's identity card.
         */
        public PassportElementIdentityCard() {
        }

        /**
         * A Telegram Passport element containing the user's identity card.
         *
         * @param identityCard Identity card.
         */
        public PassportElementIdentityCard(IdentityDocument identityCard) {
            this.identityCard = identityCard;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2083775797;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's internal passport.
     */
    public static class PassportElementInternalPassport extends PassportElement {
        /**
         * Internal passport.
         */
        public IdentityDocument internalPassport;

        /**
         * A Telegram Passport element containing the user's internal passport.
         */
        public PassportElementInternalPassport() {
        }

        /**
         * A Telegram Passport element containing the user's internal passport.
         *
         * @param internalPassport Internal passport.
         */
        public PassportElementInternalPassport(IdentityDocument internalPassport) {
            this.internalPassport = internalPassport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 36220295;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's address.
     */
    public static class PassportElementAddress extends PassportElement {
        /**
         * Address.
         */
        public Address address;

        /**
         * A Telegram Passport element containing the user's address.
         */
        public PassportElementAddress() {
        }

        /**
         * A Telegram Passport element containing the user's address.
         *
         * @param address Address.
         */
        public PassportElementAddress(Address address) {
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -782625232;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's utility bill.
     */
    public static class PassportElementUtilityBill extends PassportElement {
        /**
         * Utility bill.
         */
        public PersonalDocument utilityBill;

        /**
         * A Telegram Passport element containing the user's utility bill.
         */
        public PassportElementUtilityBill() {
        }

        /**
         * A Telegram Passport element containing the user's utility bill.
         *
         * @param utilityBill Utility bill.
         */
        public PassportElementUtilityBill(PersonalDocument utilityBill) {
            this.utilityBill = utilityBill;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -234611246;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's bank statement.
     */
    public static class PassportElementBankStatement extends PassportElement {
        /**
         * Bank statement.
         */
        public PersonalDocument bankStatement;

        /**
         * A Telegram Passport element containing the user's bank statement.
         */
        public PassportElementBankStatement() {
        }

        /**
         * A Telegram Passport element containing the user's bank statement.
         *
         * @param bankStatement Bank statement.
         */
        public PassportElementBankStatement(PersonalDocument bankStatement) {
            this.bankStatement = bankStatement;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -366464408;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's rental agreement.
     */
    public static class PassportElementRentalAgreement extends PassportElement {
        /**
         * Rental agreement.
         */
        public PersonalDocument rentalAgreement;

        /**
         * A Telegram Passport element containing the user's rental agreement.
         */
        public PassportElementRentalAgreement() {
        }

        /**
         * A Telegram Passport element containing the user's rental agreement.
         *
         * @param rentalAgreement Rental agreement.
         */
        public PassportElementRentalAgreement(PersonalDocument rentalAgreement) {
            this.rentalAgreement = rentalAgreement;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -290141400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's passport registration pages.
     */
    public static class PassportElementPassportRegistration extends PassportElement {
        /**
         * Passport registration pages.
         */
        public PersonalDocument passportRegistration;

        /**
         * A Telegram Passport element containing the user's passport registration pages.
         */
        public PassportElementPassportRegistration() {
        }

        /**
         * A Telegram Passport element containing the user's passport registration pages.
         *
         * @param passportRegistration Passport registration pages.
         */
        public PassportElementPassportRegistration(PersonalDocument passportRegistration) {
            this.passportRegistration = passportRegistration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 618323071;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's temporary registration.
     */
    public static class PassportElementTemporaryRegistration extends PassportElement {
        /**
         * Temporary registration.
         */
        public PersonalDocument temporaryRegistration;

        /**
         * A Telegram Passport element containing the user's temporary registration.
         */
        public PassportElementTemporaryRegistration() {
        }

        /**
         * A Telegram Passport element containing the user's temporary registration.
         *
         * @param temporaryRegistration Temporary registration.
         */
        public PassportElementTemporaryRegistration(PersonalDocument temporaryRegistration) {
            this.temporaryRegistration = temporaryRegistration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1237626864;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's phone number.
     */
    public static class PassportElementPhoneNumber extends PassportElement {
        /**
         * Phone number.
         */
        public String phoneNumber;

        /**
         * A Telegram Passport element containing the user's phone number.
         */
        public PassportElementPhoneNumber() {
        }

        /**
         * A Telegram Passport element containing the user's phone number.
         *
         * @param phoneNumber Phone number.
         */
        public PassportElementPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1320118375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's email address.
     */
    public static class PassportElementEmailAddress extends PassportElement {
        /**
         * Email address.
         */
        public String emailAddress;

        /**
         * A Telegram Passport element containing the user's email address.
         */
        public PassportElementEmailAddress() {
        }

        /**
         * A Telegram Passport element containing the user's email address.
         *
         * @param emailAddress Email address.
         */
        public PassportElementEmailAddress(String emailAddress) {
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1528129531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the description of an error in a Telegram Passport element.
     */
    public static class PassportElementError extends Object {
        /**
         * Type of the Telegram Passport element which has the error.
         */
        public PassportElementType type;
        /**
         * Error message.
         */
        public String message;
        /**
         * Error source.
         */
        public PassportElementErrorSource source;

        /**
         * Contains the description of an error in a Telegram Passport element.
         */
        public PassportElementError() {
        }

        /**
         * Contains the description of an error in a Telegram Passport element.
         *
         * @param type Type of the Telegram Passport element which has the error.
         * @param message Error message.
         * @param source Error source.
         */
        public PassportElementError(PassportElementType type, String message, PassportElementErrorSource source) {
            this.type = type;
            this.message = message;
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1861902395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the description of an error in a Telegram Passport element.
     */
    public abstract static class PassportElementErrorSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PassportElementErrorSourceUnspecified.CONSTRUCTOR,
            PassportElementErrorSourceDataField.CONSTRUCTOR,
            PassportElementErrorSourceFrontSide.CONSTRUCTOR,
            PassportElementErrorSourceReverseSide.CONSTRUCTOR,
            PassportElementErrorSourceSelfie.CONSTRUCTOR,
            PassportElementErrorSourceTranslationFile.CONSTRUCTOR,
            PassportElementErrorSourceTranslationFiles.CONSTRUCTOR,
            PassportElementErrorSourceFile.CONSTRUCTOR,
            PassportElementErrorSourceFiles.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PassportElementErrorSource() {
        }
    }

    /**
     * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
     */
    public static class PassportElementErrorSourceUnspecified extends PassportElementErrorSource {

        /**
         * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
         */
        public PassportElementErrorSourceUnspecified() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -378320830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * One of the data fields contains an error. The error will be considered resolved when the value of the field changes.
     */
    public static class PassportElementErrorSourceDataField extends PassportElementErrorSource {
        /**
         * Field name.
         */
        public String fieldName;

        /**
         * One of the data fields contains an error. The error will be considered resolved when the value of the field changes.
         */
        public PassportElementErrorSourceDataField() {
        }

        /**
         * One of the data fields contains an error. The error will be considered resolved when the value of the field changes.
         *
         * @param fieldName Field name.
         */
        public PassportElementErrorSourceDataField(String fieldName) {
            this.fieldName = fieldName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -308650776;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The front side of the document contains an error. The error will be considered resolved when the file with the front side changes.
     */
    public static class PassportElementErrorSourceFrontSide extends PassportElementErrorSource {

        /**
         * The front side of the document contains an error. The error will be considered resolved when the file with the front side changes.
         */
        public PassportElementErrorSourceFrontSide() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1895658292;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The reverse side of the document contains an error. The error will be considered resolved when the file with the reverse side changes.
     */
    public static class PassportElementErrorSourceReverseSide extends PassportElementErrorSource {

        /**
         * The reverse side of the document contains an error. The error will be considered resolved when the file with the reverse side changes.
         */
        public PassportElementErrorSourceReverseSide() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1918630391;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The selfie with the document contains an error. The error will be considered resolved when the file with the selfie changes.
     */
    public static class PassportElementErrorSourceSelfie extends PassportElementErrorSource {

        /**
         * The selfie with the document contains an error. The error will be considered resolved when the file with the selfie changes.
         */
        public PassportElementErrorSourceSelfie() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -797043672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * One of files with the translation of the document contains an error. The error will be considered resolved when the file changes.
     */
    public static class PassportElementErrorSourceTranslationFile extends PassportElementErrorSource {
        /**
         * Index of a file with the error.
         */
        public int fileIndex;

        /**
         * One of files with the translation of the document contains an error. The error will be considered resolved when the file changes.
         */
        public PassportElementErrorSourceTranslationFile() {
        }

        /**
         * One of files with the translation of the document contains an error. The error will be considered resolved when the file changes.
         *
         * @param fileIndex Index of a file with the error.
         */
        public PassportElementErrorSourceTranslationFile(int fileIndex) {
            this.fileIndex = fileIndex;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -689621228;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The translation of the document contains an error. The error will be considered resolved when the list of translation files changes.
     */
    public static class PassportElementErrorSourceTranslationFiles extends PassportElementErrorSource {

        /**
         * The translation of the document contains an error. The error will be considered resolved when the list of translation files changes.
         */
        public PassportElementErrorSourceTranslationFiles() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 581280796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file contains an error. The error will be considered resolved when the file changes.
     */
    public static class PassportElementErrorSourceFile extends PassportElementErrorSource {
        /**
         * Index of a file with the error.
         */
        public int fileIndex;

        /**
         * The file contains an error. The error will be considered resolved when the file changes.
         */
        public PassportElementErrorSourceFile() {
        }

        /**
         * The file contains an error. The error will be considered resolved when the file changes.
         *
         * @param fileIndex Index of a file with the error.
         */
        public PassportElementErrorSourceFile(int fileIndex) {
            this.fileIndex = fileIndex;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2020358960;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of attached files contains an error. The error will be considered resolved when the list of files changes.
     */
    public static class PassportElementErrorSourceFiles extends PassportElementErrorSource {

        /**
         * The list of attached files contains an error. The error will be considered resolved when the list of files changes.
         */
        public PassportElementErrorSourceFiles() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1894164178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the type of Telegram Passport element.
     */
    public abstract static class PassportElementType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PassportElementTypePersonalDetails.CONSTRUCTOR,
            PassportElementTypePassport.CONSTRUCTOR,
            PassportElementTypeDriverLicense.CONSTRUCTOR,
            PassportElementTypeIdentityCard.CONSTRUCTOR,
            PassportElementTypeInternalPassport.CONSTRUCTOR,
            PassportElementTypeAddress.CONSTRUCTOR,
            PassportElementTypeUtilityBill.CONSTRUCTOR,
            PassportElementTypeBankStatement.CONSTRUCTOR,
            PassportElementTypeRentalAgreement.CONSTRUCTOR,
            PassportElementTypePassportRegistration.CONSTRUCTOR,
            PassportElementTypeTemporaryRegistration.CONSTRUCTOR,
            PassportElementTypePhoneNumber.CONSTRUCTOR,
            PassportElementTypeEmailAddress.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PassportElementType() {
        }
    }

    /**
     * A Telegram Passport element containing the user's personal details.
     */
    public static class PassportElementTypePersonalDetails extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's personal details.
         */
        public PassportElementTypePersonalDetails() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1032136365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's passport.
     */
    public static class PassportElementTypePassport extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's passport.
         */
        public PassportElementTypePassport() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -436360376;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's driver license.
     */
    public static class PassportElementTypeDriverLicense extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's driver license.
         */
        public PassportElementTypeDriverLicense() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1827298379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's identity card.
     */
    public static class PassportElementTypeIdentityCard extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's identity card.
         */
        public PassportElementTypeIdentityCard() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -502356132;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's internal passport.
     */
    public static class PassportElementTypeInternalPassport extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's internal passport.
         */
        public PassportElementTypeInternalPassport() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -793781959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's address.
     */
    public static class PassportElementTypeAddress extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's address.
         */
        public PassportElementTypeAddress() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 496327874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's utility bill.
     */
    public static class PassportElementTypeUtilityBill extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's utility bill.
         */
        public PassportElementTypeUtilityBill() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 627084906;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's bank statement.
     */
    public static class PassportElementTypeBankStatement extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's bank statement.
         */
        public PassportElementTypeBankStatement() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 574095667;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's rental agreement.
     */
    public static class PassportElementTypeRentalAgreement extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's rental agreement.
         */
        public PassportElementTypeRentalAgreement() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2060583280;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the registration page of the user's passport.
     */
    public static class PassportElementTypePassportRegistration extends PassportElementType {

        /**
         * A Telegram Passport element containing the registration page of the user's passport.
         */
        public PassportElementTypePassportRegistration() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -159478209;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's temporary registration.
     */
    public static class PassportElementTypeTemporaryRegistration extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's temporary registration.
         */
        public PassportElementTypeTemporaryRegistration() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1092498527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's phone number.
     */
    public static class PassportElementTypePhoneNumber extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's phone number.
         */
        public PassportElementTypePhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -995361172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's email address.
     */
    public static class PassportElementTypeEmailAddress extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's email address.
         */
        public PassportElementTypeEmailAddress() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -79321405;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about saved Telegram Passport elements.
     */
    public static class PassportElements extends Object {
        /**
         * Telegram Passport elements.
         */
        public PassportElement[] elements;

        /**
         * Contains information about saved Telegram Passport elements.
         */
        public PassportElements() {
        }

        /**
         * Contains information about saved Telegram Passport elements.
         *
         * @param elements Telegram Passport elements.
         */
        public PassportElements(PassportElement[] elements) {
            this.elements = elements;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1264617556;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Passport elements and corresponding errors.
     */
    public static class PassportElementsWithErrors extends Object {
        /**
         * Telegram Passport elements.
         */
        public PassportElement[] elements;
        /**
         * Errors in the elements that are already available.
         */
        public PassportElementError[] errors;

        /**
         * Contains information about a Telegram Passport elements and corresponding errors.
         */
        public PassportElementsWithErrors() {
        }

        /**
         * Contains information about a Telegram Passport elements and corresponding errors.
         *
         * @param elements Telegram Passport elements.
         * @param errors Errors in the elements that are already available.
         */
        public PassportElementsWithErrors(PassportElement[] elements, PassportElementError[] errors) {
            this.elements = elements;
            this.errors = errors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1308923044;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a description of the required Telegram Passport element that was requested by a service.
     */
    public static class PassportRequiredElement extends Object {
        /**
         * List of Telegram Passport elements any of which is enough to provide.
         */
        public PassportSuitableElement[] suitableElements;

        /**
         * Contains a description of the required Telegram Passport element that was requested by a service.
         */
        public PassportRequiredElement() {
        }

        /**
         * Contains a description of the required Telegram Passport element that was requested by a service.
         *
         * @param suitableElements List of Telegram Passport elements any of which is enough to provide.
         */
        public PassportRequiredElement(PassportSuitableElement[] suitableElements) {
            this.suitableElements = suitableElements;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1983641651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Passport element that was requested by a service.
     */
    public static class PassportSuitableElement extends Object {
        /**
         * Type of the element.
         */
        public PassportElementType type;
        /**
         * True, if a selfie is required with the identity document.
         */
        public boolean isSelfieRequired;
        /**
         * True, if a certified English translation is required with the document.
         */
        public boolean isTranslationRequired;
        /**
         * True, if personal details must include the user's name in the language of their country of residence.
         */
        public boolean isNativeNameRequired;

        /**
         * Contains information about a Telegram Passport element that was requested by a service.
         */
        public PassportSuitableElement() {
        }

        /**
         * Contains information about a Telegram Passport element that was requested by a service.
         *
         * @param type Type of the element.
         * @param isSelfieRequired True, if a selfie is required with the identity document.
         * @param isTranslationRequired True, if a certified English translation is required with the document.
         * @param isNativeNameRequired True, if personal details must include the user's name in the language of their country of residence.
         */
        public PassportSuitableElement(PassportElementType type, boolean isSelfieRequired, boolean isTranslationRequired, boolean isNativeNameRequired) {
            this.type = type;
            this.isSelfieRequired = isSelfieRequired;
            this.isTranslationRequired = isTranslationRequired;
            this.isNativeNameRequired = isNativeNameRequired;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -789019876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents the current state of 2-step verification.
     */
    public static class PasswordState extends Object {
        /**
         * True, if a 2-step verification password is set.
         */
        public boolean hasPassword;
        /**
         * Hint for the password; may be empty.
         */
        public String passwordHint;
        /**
         * True, if a recovery email is set.
         */
        public boolean hasRecoveryEmailAddress;
        /**
         * True, if some Telegram Passport elements were saved.
         */
        public boolean hasPassportData;
        /**
         * Information about the recovery email address to which the confirmation email was sent; may be null.
         */
        @Nullable public EmailAddressAuthenticationCodeInfo recoveryEmailAddressCodeInfo;
        /**
         * Pattern of the email address set up for logging in.
         */
        public String loginEmailAddressPattern;
        /**
         * If not 0, point in time (Unix timestamp) after which the 2-step verification password can be reset immediately using resetPassword.
         */
        public int pendingResetDate;

        /**
         * Represents the current state of 2-step verification.
         */
        public PasswordState() {
        }

        /**
         * Represents the current state of 2-step verification.
         *
         * @param hasPassword True, if a 2-step verification password is set.
         * @param passwordHint Hint for the password; may be empty.
         * @param hasRecoveryEmailAddress True, if a recovery email is set.
         * @param hasPassportData True, if some Telegram Passport elements were saved.
         * @param recoveryEmailAddressCodeInfo Information about the recovery email address to which the confirmation email was sent; may be null.
         * @param loginEmailAddressPattern Pattern of the email address set up for logging in.
         * @param pendingResetDate If not 0, point in time (Unix timestamp) after which the 2-step verification password can be reset immediately using resetPassword.
         */
        public PasswordState(boolean hasPassword, String passwordHint, boolean hasRecoveryEmailAddress, boolean hasPassportData, EmailAddressAuthenticationCodeInfo recoveryEmailAddressCodeInfo, String loginEmailAddressPattern, int pendingResetDate) {
            this.hasPassword = hasPassword;
            this.passwordHint = passwordHint;
            this.hasRecoveryEmailAddress = hasRecoveryEmailAddress;
            this.hasPassportData = hasPassportData;
            this.recoveryEmailAddressCodeInfo = recoveryEmailAddressCodeInfo;
            this.loginEmailAddressPattern = loginEmailAddressPattern;
            this.pendingResetDate = pendingResetDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 483801128;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an invoice payment form.
     */
    public static class PaymentForm extends Object {
        /**
         * The payment form identifier.
         */
        public long id;
        /**
         * Type of the payment form.
         */
        public PaymentFormType type;
        /**
         * User identifier of the seller bot.
         */
        public long sellerBotUserId;
        /**
         * Information about the product.
         */
        public ProductInfo productInfo;

        /**
         * Contains information about an invoice payment form.
         */
        public PaymentForm() {
        }

        /**
         * Contains information about an invoice payment form.
         *
         * @param id The payment form identifier.
         * @param type Type of the payment form.
         * @param sellerBotUserId User identifier of the seller bot.
         * @param productInfo Information about the product.
         */
        public PaymentForm(long id, PaymentFormType type, long sellerBotUserId, ProductInfo productInfo) {
            this.id = id;
            this.type = type;
            this.sellerBotUserId = sellerBotUserId;
            this.productInfo = productInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1998651315;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of payment form.
     */
    public abstract static class PaymentFormType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaymentFormTypeRegular.CONSTRUCTOR,
            PaymentFormTypeStars.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaymentFormType() {
        }
    }

    /**
     * The payment form is for a regular payment.
     */
    public static class PaymentFormTypeRegular extends PaymentFormType {
        /**
         * Full information about the invoice.
         */
        public Invoice invoice;
        /**
         * User identifier of the payment provider bot.
         */
        public long paymentProviderUserId;
        /**
         * Information about the payment provider.
         */
        public PaymentProvider paymentProvider;
        /**
         * The list of additional payment options.
         */
        public PaymentOption[] additionalPaymentOptions;
        /**
         * Saved server-side order information; may be null.
         */
        @Nullable public OrderInfo savedOrderInfo;
        /**
         * The list of saved payment credentials.
         */
        public SavedCredentials[] savedCredentials;
        /**
         * True, if the user can choose to save credentials.
         */
        public boolean canSaveCredentials;
        /**
         * True, if the user will be able to save credentials, if sets up a 2-step verification password.
         */
        public boolean needPassword;

        /**
         * The payment form is for a regular payment.
         */
        public PaymentFormTypeRegular() {
        }

        /**
         * The payment form is for a regular payment.
         *
         * @param invoice Full information about the invoice.
         * @param paymentProviderUserId User identifier of the payment provider bot.
         * @param paymentProvider Information about the payment provider.
         * @param additionalPaymentOptions The list of additional payment options.
         * @param savedOrderInfo Saved server-side order information; may be null.
         * @param savedCredentials The list of saved payment credentials.
         * @param canSaveCredentials True, if the user can choose to save credentials.
         * @param needPassword True, if the user will be able to save credentials, if sets up a 2-step verification password.
         */
        public PaymentFormTypeRegular(Invoice invoice, long paymentProviderUserId, PaymentProvider paymentProvider, PaymentOption[] additionalPaymentOptions, OrderInfo savedOrderInfo, SavedCredentials[] savedCredentials, boolean canSaveCredentials, boolean needPassword) {
            this.invoice = invoice;
            this.paymentProviderUserId = paymentProviderUserId;
            this.paymentProvider = paymentProvider;
            this.additionalPaymentOptions = additionalPaymentOptions;
            this.savedOrderInfo = savedOrderInfo;
            this.savedCredentials = savedCredentials;
            this.canSaveCredentials = canSaveCredentials;
            this.needPassword = needPassword;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -615089778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payment form is for a payment in Telegram stars.
     */
    public static class PaymentFormTypeStars extends PaymentFormType {
        /**
         * Number of Telegram stars that will be paid.
         */
        public long starCount;

        /**
         * The payment form is for a payment in Telegram stars.
         */
        public PaymentFormTypeStars() {
        }

        /**
         * The payment form is for a payment in Telegram stars.
         *
         * @param starCount Number of Telegram stars that will be paid.
         */
        public PaymentFormTypeStars(long starCount) {
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 90938685;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an additional payment option.
     */
    public static class PaymentOption extends Object {
        /**
         * Title for the payment option.
         */
        public String title;
        /**
         * Payment form URL to be opened in a web view.
         */
        public String url;

        /**
         * Describes an additional payment option.
         */
        public PaymentOption() {
        }

        /**
         * Describes an additional payment option.
         *
         * @param title Title for the payment option.
         * @param url Payment form URL to be opened in a web view.
         */
        public PaymentOption(String title, String url) {
            this.title = title;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -294020965;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a payment provider.
     */
    public abstract static class PaymentProvider extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaymentProviderSmartGlocal.CONSTRUCTOR,
            PaymentProviderStripe.CONSTRUCTOR,
            PaymentProviderOther.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaymentProvider() {
        }
    }

    /**
     * Smart Glocal payment provider.
     */
    public static class PaymentProviderSmartGlocal extends PaymentProvider {
        /**
         * Public payment token.
         */
        public String publicToken;
        /**
         * URL for sending card tokenization requests.
         */
        public String tokenizeUrl;

        /**
         * Smart Glocal payment provider.
         */
        public PaymentProviderSmartGlocal() {
        }

        /**
         * Smart Glocal payment provider.
         *
         * @param publicToken Public payment token.
         * @param tokenizeUrl URL for sending card tokenization requests.
         */
        public PaymentProviderSmartGlocal(String publicToken, String tokenizeUrl) {
            this.publicToken = publicToken;
            this.tokenizeUrl = tokenizeUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1174112396;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stripe payment provider.
     */
    public static class PaymentProviderStripe extends PaymentProvider {
        /**
         * Stripe API publishable key.
         */
        public String publishableKey;
        /**
         * True, if the user country must be provided.
         */
        public boolean needCountry;
        /**
         * True, if the user ZIP/postal code must be provided.
         */
        public boolean needPostalCode;
        /**
         * True, if the cardholder name must be provided.
         */
        public boolean needCardholderName;

        /**
         * Stripe payment provider.
         */
        public PaymentProviderStripe() {
        }

        /**
         * Stripe payment provider.
         *
         * @param publishableKey Stripe API publishable key.
         * @param needCountry True, if the user country must be provided.
         * @param needPostalCode True, if the user ZIP/postal code must be provided.
         * @param needCardholderName True, if the cardholder name must be provided.
         */
        public PaymentProviderStripe(String publishableKey, boolean needCountry, boolean needPostalCode, boolean needCardholderName) {
            this.publishableKey = publishableKey;
            this.needCountry = needCountry;
            this.needPostalCode = needPostalCode;
            this.needCardholderName = needCardholderName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 370467227;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some other payment provider, for which a web payment form must be shown.
     */
    public static class PaymentProviderOther extends PaymentProvider {
        /**
         * Payment form URL.
         */
        public String url;

        /**
         * Some other payment provider, for which a web payment form must be shown.
         */
        public PaymentProviderOther() {
        }

        /**
         * Some other payment provider, for which a web payment form must be shown.
         *
         * @param url Payment form URL.
         */
        public PaymentProviderOther(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1336876828;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a successful payment.
     */
    public static class PaymentReceipt extends Object {
        /**
         * Information about the product.
         */
        public ProductInfo productInfo;
        /**
         * Point in time (Unix timestamp) when the payment was made.
         */
        public int date;
        /**
         * User identifier of the seller bot.
         */
        public long sellerBotUserId;
        /**
         * Type of the payment receipt.
         */
        public PaymentReceiptType type;

        /**
         * Contains information about a successful payment.
         */
        public PaymentReceipt() {
        }

        /**
         * Contains information about a successful payment.
         *
         * @param productInfo Information about the product.
         * @param date Point in time (Unix timestamp) when the payment was made.
         * @param sellerBotUserId User identifier of the seller bot.
         * @param type Type of the payment receipt.
         */
        public PaymentReceipt(ProductInfo productInfo, int date, long sellerBotUserId, PaymentReceiptType type) {
            this.productInfo = productInfo;
            this.date = date;
            this.sellerBotUserId = sellerBotUserId;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 758199186;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of successful payment.
     */
    public abstract static class PaymentReceiptType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaymentReceiptTypeRegular.CONSTRUCTOR,
            PaymentReceiptTypeStars.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaymentReceiptType() {
        }
    }

    /**
     * The payment was done using a third-party payment provider.
     */
    public static class PaymentReceiptTypeRegular extends PaymentReceiptType {
        /**
         * User identifier of the payment provider bot.
         */
        public long paymentProviderUserId;
        /**
         * Information about the invoice.
         */
        public Invoice invoice;
        /**
         * Order information; may be null.
         */
        @Nullable public OrderInfo orderInfo;
        /**
         * Chosen shipping option; may be null.
         */
        @Nullable public ShippingOption shippingOption;
        /**
         * Title of the saved credentials chosen by the buyer.
         */
        public String credentialsTitle;
        /**
         * The amount of tip chosen by the buyer in the smallest units of the currency.
         */
        public long tipAmount;

        /**
         * The payment was done using a third-party payment provider.
         */
        public PaymentReceiptTypeRegular() {
        }

        /**
         * The payment was done using a third-party payment provider.
         *
         * @param paymentProviderUserId User identifier of the payment provider bot.
         * @param invoice Information about the invoice.
         * @param orderInfo Order information; may be null.
         * @param shippingOption Chosen shipping option; may be null.
         * @param credentialsTitle Title of the saved credentials chosen by the buyer.
         * @param tipAmount The amount of tip chosen by the buyer in the smallest units of the currency.
         */
        public PaymentReceiptTypeRegular(long paymentProviderUserId, Invoice invoice, OrderInfo orderInfo, ShippingOption shippingOption, String credentialsTitle, long tipAmount) {
            this.paymentProviderUserId = paymentProviderUserId;
            this.invoice = invoice;
            this.orderInfo = orderInfo;
            this.shippingOption = shippingOption;
            this.credentialsTitle = credentialsTitle;
            this.tipAmount = tipAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1636362826;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payment was done using Telegram stars.
     */
    public static class PaymentReceiptTypeStars extends PaymentReceiptType {
        /**
         * Number of Telegram stars that were paid.
         */
        public long starCount;
        /**
         * Unique identifier of the transaction that can be used to dispute it.
         */
        public String transactionId;

        /**
         * The payment was done using Telegram stars.
         */
        public PaymentReceiptTypeStars() {
        }

        /**
         * The payment was done using Telegram stars.
         *
         * @param starCount Number of Telegram stars that were paid.
         * @param transactionId Unique identifier of the transaction that can be used to dispute it.
         */
        public PaymentReceiptTypeStars(long starCount, String transactionId) {
            this.starCount = starCount;
            this.transactionId = transactionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 294913868;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the result of a payment request.
     */
    public static class PaymentResult extends Object {
        /**
         * True, if the payment request was successful; otherwise, the verificationUrl will be non-empty.
         */
        public boolean success;
        /**
         * URL for additional payment credentials verification.
         */
        public String verificationUrl;

        /**
         * Contains the result of a payment request.
         */
        public PaymentResult() {
        }

        /**
         * Contains the result of a payment request.
         *
         * @param success True, if the payment request was successful; otherwise, the verificationUrl will be non-empty.
         * @param verificationUrl URL for additional payment credentials verification.
         */
        public PaymentResult(boolean success, String verificationUrl) {
            this.success = success;
            this.verificationUrl = verificationUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -804263843;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the user's personal details.
     */
    public static class PersonalDetails extends Object {
        /**
         * First name of the user written in English; 1-255 characters.
         */
        public String firstName;
        /**
         * Middle name of the user written in English; 0-255 characters.
         */
        public String middleName;
        /**
         * Last name of the user written in English; 1-255 characters.
         */
        public String lastName;
        /**
         * Native first name of the user; 1-255 characters.
         */
        public String nativeFirstName;
        /**
         * Native middle name of the user; 0-255 characters.
         */
        public String nativeMiddleName;
        /**
         * Native last name of the user; 1-255 characters.
         */
        public String nativeLastName;
        /**
         * Birthdate of the user.
         */
        public Date birthdate;
        /**
         * Gender of the user, &quot;male&quot; or &quot;female&quot;.
         */
        public String gender;
        /**
         * A two-letter ISO 3166-1 alpha-2 country code of the user's country.
         */
        public String countryCode;
        /**
         * A two-letter ISO 3166-1 alpha-2 country code of the user's residence country.
         */
        public String residenceCountryCode;

        /**
         * Contains the user's personal details.
         */
        public PersonalDetails() {
        }

        /**
         * Contains the user's personal details.
         *
         * @param firstName First name of the user written in English; 1-255 characters.
         * @param middleName Middle name of the user written in English; 0-255 characters.
         * @param lastName Last name of the user written in English; 1-255 characters.
         * @param nativeFirstName Native first name of the user; 1-255 characters.
         * @param nativeMiddleName Native middle name of the user; 0-255 characters.
         * @param nativeLastName Native last name of the user; 1-255 characters.
         * @param birthdate Birthdate of the user.
         * @param gender Gender of the user, &quot;male&quot; or &quot;female&quot;.
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code of the user's country.
         * @param residenceCountryCode A two-letter ISO 3166-1 alpha-2 country code of the user's residence country.
         */
        public PersonalDetails(String firstName, String middleName, String lastName, String nativeFirstName, String nativeMiddleName, String nativeLastName, Date birthdate, String gender, String countryCode, String residenceCountryCode) {
            this.firstName = firstName;
            this.middleName = middleName;
            this.lastName = lastName;
            this.nativeFirstName = nativeFirstName;
            this.nativeMiddleName = nativeMiddleName;
            this.nativeLastName = nativeLastName;
            this.birthdate = birthdate;
            this.gender = gender;
            this.countryCode = countryCode;
            this.residenceCountryCode = residenceCountryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1061656137;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A personal document, containing some information about a user.
     */
    public static class PersonalDocument extends Object {
        /**
         * List of files containing the pages of the document.
         */
        public DatedFile[] files;
        /**
         * List of files containing a certified English translation of the document.
         */
        public DatedFile[] translation;

        /**
         * A personal document, containing some information about a user.
         */
        public PersonalDocument() {
        }

        /**
         * A personal document, containing some information about a user.
         *
         * @param files List of files containing the pages of the document.
         * @param translation List of files containing a certified English translation of the document.
         */
        public PersonalDocument(DatedFile[] files, DatedFile[] translation) {
            this.files = files;
            this.translation = translation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1011634661;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains settings for the authentication of the user's phone number.
     */
    public static class PhoneNumberAuthenticationSettings extends Object {
        /**
         * Pass true if the authentication code may be sent via a flash call to the specified phone number.
         */
        public boolean allowFlashCall;
        /**
         * Pass true if the authentication code may be sent via a missed call to the specified phone number.
         */
        public boolean allowMissedCall;
        /**
         * Pass true if the authenticated phone number is used on the current device.
         */
        public boolean isCurrentPhoneNumber;
        /**
         * Pass true if there is a SIM card in the current device, but it is not possible to check whether phone number matches.
         */
        public boolean hasUnknownPhoneNumber;
        /**
         * For official applications only. True, if the application can use Android SMS Retriever API (requires Google Play Services &gt;= 10.2) to automatically receive the authentication code from the SMS. See https://developers.google.com/identity/sms-retriever/ for more details.
         */
        public boolean allowSmsRetrieverApi;
        /**
         * For official Android and iOS applications only; pass null otherwise. Settings for Firebase Authentication.
         */
        public FirebaseAuthenticationSettings firebaseAuthenticationSettings;
        /**
         * List of up to 20 authentication tokens, recently received in updateOption(&quot;authentication_token&quot;) in previously logged out sessions.
         */
        public String[] authenticationTokens;

        /**
         * Contains settings for the authentication of the user's phone number.
         */
        public PhoneNumberAuthenticationSettings() {
        }

        /**
         * Contains settings for the authentication of the user's phone number.
         *
         * @param allowFlashCall Pass true if the authentication code may be sent via a flash call to the specified phone number.
         * @param allowMissedCall Pass true if the authentication code may be sent via a missed call to the specified phone number.
         * @param isCurrentPhoneNumber Pass true if the authenticated phone number is used on the current device.
         * @param hasUnknownPhoneNumber Pass true if there is a SIM card in the current device, but it is not possible to check whether phone number matches.
         * @param allowSmsRetrieverApi For official applications only. True, if the application can use Android SMS Retriever API (requires Google Play Services &gt;= 10.2) to automatically receive the authentication code from the SMS. See https://developers.google.com/identity/sms-retriever/ for more details.
         * @param firebaseAuthenticationSettings For official Android and iOS applications only; pass null otherwise. Settings for Firebase Authentication.
         * @param authenticationTokens List of up to 20 authentication tokens, recently received in updateOption(&quot;authentication_token&quot;) in previously logged out sessions.
         */
        public PhoneNumberAuthenticationSettings(boolean allowFlashCall, boolean allowMissedCall, boolean isCurrentPhoneNumber, boolean hasUnknownPhoneNumber, boolean allowSmsRetrieverApi, FirebaseAuthenticationSettings firebaseAuthenticationSettings, String[] authenticationTokens) {
            this.allowFlashCall = allowFlashCall;
            this.allowMissedCall = allowMissedCall;
            this.isCurrentPhoneNumber = isCurrentPhoneNumber;
            this.hasUnknownPhoneNumber = hasUnknownPhoneNumber;
            this.allowSmsRetrieverApi = allowSmsRetrieverApi;
            this.firebaseAuthenticationSettings = firebaseAuthenticationSettings;
            this.authenticationTokens = authenticationTokens;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1881885547;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of the request for which a code is sent to a phone number.
     */
    public abstract static class PhoneNumberCodeType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PhoneNumberCodeTypeChange.CONSTRUCTOR,
            PhoneNumberCodeTypeVerify.CONSTRUCTOR,
            PhoneNumberCodeTypeConfirmOwnership.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PhoneNumberCodeType() {
        }
    }

    /**
     * Checks ownership of a new phone number to change the user's authentication phone number; for official Android and iOS applications only.
     */
    public static class PhoneNumberCodeTypeChange extends PhoneNumberCodeType {

        /**
         * Checks ownership of a new phone number to change the user's authentication phone number; for official Android and iOS applications only.
         */
        public PhoneNumberCodeTypeChange() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 87144986;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Verifies ownership of a phone number to be added to the user's Telegram Passport.
     */
    public static class PhoneNumberCodeTypeVerify extends PhoneNumberCodeType {

        /**
         * Verifies ownership of a phone number to be added to the user's Telegram Passport.
         */
        public PhoneNumberCodeTypeVerify() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1029402661;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Confirms ownership of a phone number to prevent account deletion while handling links of the type internalLinkTypePhoneNumberConfirmation.
     */
    public static class PhoneNumberCodeTypeConfirmOwnership extends PhoneNumberCodeType {
        /**
         * Hash value from the link.
         */
        public String hash;

        /**
         * Confirms ownership of a phone number to prevent account deletion while handling links of the type internalLinkTypePhoneNumberConfirmation.
         */
        public PhoneNumberCodeTypeConfirmOwnership() {
        }

        /**
         * Confirms ownership of a phone number to prevent account deletion while handling links of the type internalLinkTypePhoneNumberConfirmation.
         *
         * @param hash Hash value from the link.
         */
        public PhoneNumberCodeTypeConfirmOwnership(String hash) {
            this.hash = hash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -485404696;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a phone number.
     */
    public static class PhoneNumberInfo extends Object {
        /**
         * Information about the country to which the phone number belongs; may be null.
         */
        @Nullable public CountryInfo country;
        /**
         * The part of the phone number denoting country calling code or its part.
         */
        public String countryCallingCode;
        /**
         * The phone number without country calling code formatted accordingly to local rules. Expected digits are returned as '-', but even more digits might be entered by the user.
         */
        public String formattedPhoneNumber;
        /**
         * True, if the phone number was bought at https://fragment.com and isn't tied to a SIM card. Information about the phone number can be received using getCollectibleItemInfo.
         */
        public boolean isAnonymous;

        /**
         * Contains information about a phone number.
         */
        public PhoneNumberInfo() {
        }

        /**
         * Contains information about a phone number.
         *
         * @param country Information about the country to which the phone number belongs; may be null.
         * @param countryCallingCode The part of the phone number denoting country calling code or its part.
         * @param formattedPhoneNumber The phone number without country calling code formatted accordingly to local rules. Expected digits are returned as '-', but even more digits might be entered by the user.
         * @param isAnonymous True, if the phone number was bought at https://fragment.com and isn't tied to a SIM card. Information about the phone number can be received using getCollectibleItemInfo.
         */
        public PhoneNumberInfo(CountryInfo country, String countryCallingCode, String formattedPhoneNumber, boolean isAnonymous) {
            this.country = country;
            this.countryCallingCode = countryCallingCode;
            this.formattedPhoneNumber = formattedPhoneNumber;
            this.isAnonymous = isAnonymous;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -758933343;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a photo.
     */
    public static class Photo extends Object {
        /**
         * True, if stickers were added to the photo. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         */
        public boolean hasStickers;
        /**
         * Photo minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Available variants of the photo, in different sizes.
         */
        public PhotoSize[] sizes;

        /**
         * Describes a photo.
         */
        public Photo() {
        }

        /**
         * Describes a photo.
         *
         * @param hasStickers True, if stickers were added to the photo. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         * @param minithumbnail Photo minithumbnail; may be null.
         * @param sizes Available variants of the photo, in different sizes.
         */
        public Photo(boolean hasStickers, Minithumbnail minithumbnail, PhotoSize[] sizes) {
            this.hasStickers = hasStickers;
            this.minithumbnail = minithumbnail;
            this.sizes = sizes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2022871583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an image in JPEG format.
     */
    public static class PhotoSize extends Object {
        /**
         * Image type (see https://core.telegram.org/constructor/photoSize).
         */
        public String type;
        /**
         * Information about the image file.
         */
        public File photo;
        /**
         * Image width.
         */
        public int width;
        /**
         * Image height.
         */
        public int height;
        /**
         * Sizes of progressive JPEG file prefixes, which can be used to preliminarily show the image; in bytes.
         */
        public int[] progressiveSizes;

        /**
         * Describes an image in JPEG format.
         */
        public PhotoSize() {
        }

        /**
         * Describes an image in JPEG format.
         *
         * @param type Image type (see https://core.telegram.org/constructor/photoSize).
         * @param photo Information about the image file.
         * @param width Image width.
         * @param height Image height.
         * @param progressiveSizes Sizes of progressive JPEG file prefixes, which can be used to preliminarily show the image; in bytes.
         */
        public PhotoSize(String type, File photo, int width, int height, int[] progressiveSizes) {
            this.type = type;
            this.photo = photo;
            this.width = width;
            this.height = height;
            this.progressiveSizes = progressiveSizes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1609182352;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A point on a Cartesian plane.
     */
    public static class Point extends Object {
        /**
         * The point's first coordinate.
         */
        public double x;
        /**
         * The point's second coordinate.
         */
        public double y;

        /**
         * A point on a Cartesian plane.
         */
        public Point() {
        }

        /**
         * A point on a Cartesian plane.
         *
         * @param x The point's first coordinate.
         * @param y The point's second coordinate.
         */
        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 437515705;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a poll.
     */
    public static class Poll extends Object {
        /**
         * Unique poll identifier.
         */
        public long id;
        /**
         * Poll question; 1-300 characters. Only custom emoji entities are allowed.
         */
        public FormattedText question;
        /**
         * List of poll answer options.
         */
        public PollOption[] options;
        /**
         * Total number of voters, participating in the poll.
         */
        public int totalVoterCount;
        /**
         * Identifiers of recent voters, if the poll is non-anonymous.
         */
        public MessageSender[] recentVoterIds;
        /**
         * True, if the poll is anonymous.
         */
        public boolean isAnonymous;
        /**
         * Type of the poll.
         */
        public PollType type;
        /**
         * Amount of time the poll will be active after creation, in seconds.
         */
        public int openPeriod;
        /**
         * Point in time (Unix timestamp) when the poll will automatically be closed.
         */
        public int closeDate;
        /**
         * True, if the poll is closed.
         */
        public boolean isClosed;

        /**
         * Describes a poll.
         */
        public Poll() {
        }

        /**
         * Describes a poll.
         *
         * @param id Unique poll identifier.
         * @param question Poll question; 1-300 characters. Only custom emoji entities are allowed.
         * @param options List of poll answer options.
         * @param totalVoterCount Total number of voters, participating in the poll.
         * @param recentVoterIds Identifiers of recent voters, if the poll is non-anonymous.
         * @param isAnonymous True, if the poll is anonymous.
         * @param type Type of the poll.
         * @param openPeriod Amount of time the poll will be active after creation, in seconds.
         * @param closeDate Point in time (Unix timestamp) when the poll will automatically be closed.
         * @param isClosed True, if the poll is closed.
         */
        public Poll(long id, FormattedText question, PollOption[] options, int totalVoterCount, MessageSender[] recentVoterIds, boolean isAnonymous, PollType type, int openPeriod, int closeDate, boolean isClosed) {
            this.id = id;
            this.question = question;
            this.options = options;
            this.totalVoterCount = totalVoterCount;
            this.recentVoterIds = recentVoterIds;
            this.isAnonymous = isAnonymous;
            this.type = type;
            this.openPeriod = openPeriod;
            this.closeDate = closeDate;
            this.isClosed = isClosed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1913016502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes one answer option of a poll.
     */
    public static class PollOption extends Object {
        /**
         * Option text; 1-100 characters. Only custom emoji entities are allowed.
         */
        public FormattedText text;
        /**
         * Number of voters for this option, available only for closed or voted polls.
         */
        public int voterCount;
        /**
         * The percentage of votes for this option; 0-100.
         */
        public int votePercentage;
        /**
         * True, if the option was chosen by the user.
         */
        public boolean isChosen;
        /**
         * True, if the option is being chosen by a pending setPollAnswer request.
         */
        public boolean isBeingChosen;

        /**
         * Describes one answer option of a poll.
         */
        public PollOption() {
        }

        /**
         * Describes one answer option of a poll.
         *
         * @param text Option text; 1-100 characters. Only custom emoji entities are allowed.
         * @param voterCount Number of voters for this option, available only for closed or voted polls.
         * @param votePercentage The percentage of votes for this option; 0-100.
         * @param isChosen True, if the option was chosen by the user.
         * @param isBeingChosen True, if the option is being chosen by a pending setPollAnswer request.
         */
        public PollOption(FormattedText text, int voterCount, int votePercentage, boolean isChosen, boolean isBeingChosen) {
            this.text = text;
            this.voterCount = voterCount;
            this.votePercentage = votePercentage;
            this.isChosen = isChosen;
            this.isBeingChosen = isBeingChosen;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1676243088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of poll.
     */
    public abstract static class PollType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PollTypeRegular.CONSTRUCTOR,
            PollTypeQuiz.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PollType() {
        }
    }

    /**
     * A regular poll.
     */
    public static class PollTypeRegular extends PollType {
        /**
         * True, if multiple answer options can be chosen simultaneously.
         */
        public boolean allowMultipleAnswers;

        /**
         * A regular poll.
         */
        public PollTypeRegular() {
        }

        /**
         * A regular poll.
         *
         * @param allowMultipleAnswers True, if multiple answer options can be chosen simultaneously.
         */
        public PollTypeRegular(boolean allowMultipleAnswers) {
            this.allowMultipleAnswers = allowMultipleAnswers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 641265698;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A poll in quiz mode, which has exactly one correct answer option and can be answered only once.
     */
    public static class PollTypeQuiz extends PollType {
        /**
         * 0-based identifier of the correct answer option; -1 for a yet unanswered poll.
         */
        public int correctOptionId;
        /**
         * Text that is shown when the user chooses an incorrect answer or taps on the lamp icon; 0-200 characters with at most 2 line feeds; empty for a yet unanswered poll.
         */
        public FormattedText explanation;

        /**
         * A poll in quiz mode, which has exactly one correct answer option and can be answered only once.
         */
        public PollTypeQuiz() {
        }

        /**
         * A poll in quiz mode, which has exactly one correct answer option and can be answered only once.
         *
         * @param correctOptionId 0-based identifier of the correct answer option; -1 for a yet unanswered poll.
         * @param explanation Text that is shown when the user chooses an incorrect answer or taps on the lamp icon; 0-200 characters with at most 2 line feeds; empty for a yet unanswered poll.
         */
        public PollTypeQuiz(int correctOptionId, FormattedText explanation) {
            this.correctOptionId = correctOptionId;
            this.explanation = explanation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 657013913;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a feature available to Premium users.
     */
    public abstract static class PremiumFeature extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumFeatureIncreasedLimits.CONSTRUCTOR,
            PremiumFeatureIncreasedUploadFileSize.CONSTRUCTOR,
            PremiumFeatureImprovedDownloadSpeed.CONSTRUCTOR,
            PremiumFeatureVoiceRecognition.CONSTRUCTOR,
            PremiumFeatureDisabledAds.CONSTRUCTOR,
            PremiumFeatureUniqueReactions.CONSTRUCTOR,
            PremiumFeatureUniqueStickers.CONSTRUCTOR,
            PremiumFeatureCustomEmoji.CONSTRUCTOR,
            PremiumFeatureAdvancedChatManagement.CONSTRUCTOR,
            PremiumFeatureProfileBadge.CONSTRUCTOR,
            PremiumFeatureEmojiStatus.CONSTRUCTOR,
            PremiumFeatureAnimatedProfilePhoto.CONSTRUCTOR,
            PremiumFeatureForumTopicIcon.CONSTRUCTOR,
            PremiumFeatureAppIcons.CONSTRUCTOR,
            PremiumFeatureRealTimeChatTranslation.CONSTRUCTOR,
            PremiumFeatureUpgradedStories.CONSTRUCTOR,
            PremiumFeatureChatBoost.CONSTRUCTOR,
            PremiumFeatureAccentColor.CONSTRUCTOR,
            PremiumFeatureBackgroundForBoth.CONSTRUCTOR,
            PremiumFeatureSavedMessagesTags.CONSTRUCTOR,
            PremiumFeatureMessagePrivacy.CONSTRUCTOR,
            PremiumFeatureLastSeenTimes.CONSTRUCTOR,
            PremiumFeatureBusiness.CONSTRUCTOR,
            PremiumFeatureMessageEffects.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumFeature() {
        }
    }

    /**
     * Increased limits.
     */
    public static class PremiumFeatureIncreasedLimits extends PremiumFeature {

        /**
         * Increased limits.
         */
        public PremiumFeatureIncreasedLimits() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1785455031;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Increased maximum upload file size.
     */
    public static class PremiumFeatureIncreasedUploadFileSize extends PremiumFeature {

        /**
         * Increased maximum upload file size.
         */
        public PremiumFeatureIncreasedUploadFileSize() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1825367155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Improved download speed.
     */
    public static class PremiumFeatureImprovedDownloadSpeed extends PremiumFeature {

        /**
         * Improved download speed.
         */
        public PremiumFeatureImprovedDownloadSpeed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -267695554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to convert voice notes to text.
     */
    public static class PremiumFeatureVoiceRecognition extends PremiumFeature {

        /**
         * The ability to convert voice notes to text.
         */
        public PremiumFeatureVoiceRecognition() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1288216542;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disabled ads.
     */
    public static class PremiumFeatureDisabledAds extends PremiumFeature {

        /**
         * Disabled ads.
         */
        public PremiumFeatureDisabledAds() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2008587702;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use more reactions.
     */
    public static class PremiumFeatureUniqueReactions extends PremiumFeature {

        /**
         * Allowed to use more reactions.
         */
        public PremiumFeatureUniqueReactions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 766750743;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use premium stickers with unique effects.
     */
    public static class PremiumFeatureUniqueStickers extends PremiumFeature {

        /**
         * Allowed to use premium stickers with unique effects.
         */
        public PremiumFeatureUniqueStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2101773312;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use custom emoji stickers in message texts and captions.
     */
    public static class PremiumFeatureCustomEmoji extends PremiumFeature {

        /**
         * Allowed to use custom emoji stickers in message texts and captions.
         */
        public PremiumFeatureCustomEmoji() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1332599628;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Ability to change position of the main chat list, archive and mute all new chats from non-contacts, and completely disable notifications about the user's contacts joined Telegram.
     */
    public static class PremiumFeatureAdvancedChatManagement extends PremiumFeature {

        /**
         * Ability to change position of the main chat list, archive and mute all new chats from non-contacts, and completely disable notifications about the user's contacts joined Telegram.
         */
        public PremiumFeatureAdvancedChatManagement() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 796347674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A badge in the user's profile.
     */
    public static class PremiumFeatureProfileBadge extends PremiumFeature {

        /**
         * A badge in the user's profile.
         */
        public PremiumFeatureProfileBadge() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 233648322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to show an emoji status along with the user's name.
     */
    public static class PremiumFeatureEmojiStatus extends PremiumFeature {

        /**
         * The ability to show an emoji status along with the user's name.
         */
        public PremiumFeatureEmojiStatus() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -36516639;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Profile photo animation on message and chat screens.
     */
    public static class PremiumFeatureAnimatedProfilePhoto extends PremiumFeature {

        /**
         * Profile photo animation on message and chat screens.
         */
        public PremiumFeatureAnimatedProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -100741914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set a custom emoji as a forum topic icon.
     */
    public static class PremiumFeatureForumTopicIcon extends PremiumFeature {

        /**
         * The ability to set a custom emoji as a forum topic icon.
         */
        public PremiumFeatureForumTopicIcon() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -823172286;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to set a premium application icons.
     */
    public static class PremiumFeatureAppIcons extends PremiumFeature {

        /**
         * Allowed to set a premium application icons.
         */
        public PremiumFeatureAppIcons() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1585050761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to translate chat messages real-time.
     */
    public static class PremiumFeatureRealTimeChatTranslation extends PremiumFeature {

        /**
         * Allowed to translate chat messages real-time.
         */
        public PremiumFeatureRealTimeChatTranslation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1143471488;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use many additional features for stories.
     */
    public static class PremiumFeatureUpgradedStories extends PremiumFeature {

        /**
         * Allowed to use many additional features for stories.
         */
        public PremiumFeatureUpgradedStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1878522597;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to boost chats.
     */
    public static class PremiumFeatureChatBoost extends PremiumFeature {

        /**
         * The ability to boost chats.
         */
        public PremiumFeatureChatBoost() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1576574747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to choose accent color for replies and user profile.
     */
    public static class PremiumFeatureAccentColor extends PremiumFeature {

        /**
         * The ability to choose accent color for replies and user profile.
         */
        public PremiumFeatureAccentColor() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 907724190;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set private chat background for both users.
     */
    public static class PremiumFeatureBackgroundForBoth extends PremiumFeature {

        /**
         * The ability to set private chat background for both users.
         */
        public PremiumFeatureBackgroundForBoth() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 575074042;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use tags in Saved Messages.
     */
    public static class PremiumFeatureSavedMessagesTags extends PremiumFeature {

        /**
         * The ability to use tags in Saved Messages.
         */
        public PremiumFeatureSavedMessagesTags() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1003219334;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to disallow incoming voice and video note messages in private chats using setUserPrivacySettingRules with userPrivacySettingAllowPrivateVoiceAndVideoNoteMessages and to restrict incoming messages from non-contacts using setNewChatPrivacySettings.
     */
    public static class PremiumFeatureMessagePrivacy extends PremiumFeature {

        /**
         * The ability to disallow incoming voice and video note messages in private chats using setUserPrivacySettingRules with userPrivacySettingAllowPrivateVoiceAndVideoNoteMessages and to restrict incoming messages from non-contacts using setNewChatPrivacySettings.
         */
        public PremiumFeatureMessagePrivacy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 802322678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to view last seen and read times of other users even they can't view last seen or read time for the current user.
     */
    public static class PremiumFeatureLastSeenTimes extends PremiumFeature {

        /**
         * The ability to view last seen and read times of other users even they can't view last seen or read time for the current user.
         */
        public PremiumFeatureLastSeenTimes() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -762230129;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use Business features.
     */
    public static class PremiumFeatureBusiness extends PremiumFeature {

        /**
         * The ability to use Business features.
         */
        public PremiumFeatureBusiness() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1503619324;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use all available message effects.
     */
    public static class PremiumFeatureMessageEffects extends PremiumFeature {

        /**
         * The ability to use all available message effects.
         */
        public PremiumFeatureMessageEffects() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -723300255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a promotion animation for a Premium feature.
     */
    public static class PremiumFeaturePromotionAnimation extends Object {
        /**
         * Premium feature.
         */
        public PremiumFeature feature;
        /**
         * Promotion animation for the feature.
         */
        public Animation animation;

        /**
         * Describes a promotion animation for a Premium feature.
         */
        public PremiumFeaturePromotionAnimation() {
        }

        /**
         * Describes a promotion animation for a Premium feature.
         *
         * @param feature Premium feature.
         * @param animation Promotion animation for the feature.
         */
        public PremiumFeaturePromotionAnimation(PremiumFeature feature, Animation animation) {
            this.feature = feature;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1986155748;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about features, available to Premium users.
     */
    public static class PremiumFeatures extends Object {
        /**
         * The list of available features.
         */
        public PremiumFeature[] features;
        /**
         * The list of limits, increased for Premium users.
         */
        public PremiumLimit[] limits;
        /**
         * An internal link to be opened to pay for Telegram Premium if store payment isn't possible; may be null if direct payment isn't available.
         */
        @Nullable public InternalLinkType paymentLink;

        /**
         * Contains information about features, available to Premium users.
         */
        public PremiumFeatures() {
        }

        /**
         * Contains information about features, available to Premium users.
         *
         * @param features The list of available features.
         * @param limits The list of limits, increased for Premium users.
         * @param paymentLink An internal link to be opened to pay for Telegram Premium if store payment isn't possible; may be null if direct payment isn't available.
         */
        public PremiumFeatures(PremiumFeature[] features, PremiumLimit[] limits, InternalLinkType paymentLink) {
            this.features = features;
            this.limits = limits;
            this.paymentLink = paymentLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1875162172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Premium gift code.
     */
    public static class PremiumGiftCodeInfo extends Object {
        /**
         * Identifier of a chat or a user that created the gift code; may be null if unknown. If null and the code is from messagePremiumGiftCode message, then creatorId from the message can be used.
         */
        @Nullable public MessageSender creatorId;
        /**
         * Point in time (Unix timestamp) when the code was created.
         */
        public int creationDate;
        /**
         * True, if the gift code was created for a giveaway.
         */
        public boolean isFromGiveaway;
        /**
         * Identifier of the corresponding giveaway message in the creatorId chat; can be 0 or an identifier of a deleted message.
         */
        public long giveawayMessageId;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation.
         */
        public int monthCount;
        /**
         * Identifier of a user for which the code was created; 0 if none.
         */
        public long userId;
        /**
         * Point in time (Unix timestamp) when the code was activated; 0 if none.
         */
        public int useDate;

        /**
         * Contains information about a Telegram Premium gift code.
         */
        public PremiumGiftCodeInfo() {
        }

        /**
         * Contains information about a Telegram Premium gift code.
         *
         * @param creatorId Identifier of a chat or a user that created the gift code; may be null if unknown. If null and the code is from messagePremiumGiftCode message, then creatorId from the message can be used.
         * @param creationDate Point in time (Unix timestamp) when the code was created.
         * @param isFromGiveaway True, if the gift code was created for a giveaway.
         * @param giveawayMessageId Identifier of the corresponding giveaway message in the creatorId chat; can be 0 or an identifier of a deleted message.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation.
         * @param userId Identifier of a user for which the code was created; 0 if none.
         * @param useDate Point in time (Unix timestamp) when the code was activated; 0 if none.
         */
        public PremiumGiftCodeInfo(MessageSender creatorId, int creationDate, boolean isFromGiveaway, long giveawayMessageId, int monthCount, long userId, int useDate) {
            this.creatorId = creatorId;
            this.creationDate = creationDate;
            this.isFromGiveaway = isFromGiveaway;
            this.giveawayMessageId = giveawayMessageId;
            this.monthCount = monthCount;
            this.userId = userId;
            this.useDate = useDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1198544674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for creating Telegram Premium gift codes. Use telegramPaymentPurposePremiumGiftCodes for out-of-store payments.
     */
    public static class PremiumGiftCodePaymentOption extends Object {
        /**
         * ISO 4217 currency code for Telegram Premium gift code payment.
         */
        public String currency;
        /**
         * The amount to pay, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of users which will be able to activate the gift codes.
         */
        public int userCount;
        /**
         * Number of months the Telegram Premium subscription will be active.
         */
        public int monthCount;
        /**
         * Identifier of the store product associated with the option; may be empty if none.
         */
        public String storeProductId;
        /**
         * Number of times the store product must be paid.
         */
        public int storeProductQuantity;

        /**
         * Describes an option for creating Telegram Premium gift codes. Use telegramPaymentPurposePremiumGiftCodes for out-of-store payments.
         */
        public PremiumGiftCodePaymentOption() {
        }

        /**
         * Describes an option for creating Telegram Premium gift codes. Use telegramPaymentPurposePremiumGiftCodes for out-of-store payments.
         *
         * @param currency ISO 4217 currency code for Telegram Premium gift code payment.
         * @param amount The amount to pay, in the smallest units of the currency.
         * @param userCount Number of users which will be able to activate the gift codes.
         * @param monthCount Number of months the Telegram Premium subscription will be active.
         * @param storeProductId Identifier of the store product associated with the option; may be empty if none.
         * @param storeProductQuantity Number of times the store product must be paid.
         */
        public PremiumGiftCodePaymentOption(String currency, long amount, int userCount, int monthCount, String storeProductId, int storeProductQuantity) {
            this.currency = currency;
            this.amount = amount;
            this.userCount = userCount;
            this.monthCount = monthCount;
            this.storeProductId = storeProductId;
            this.storeProductQuantity = storeProductQuantity;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -487321617;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of options for creating Telegram Premium gift codes.
     */
    public static class PremiumGiftCodePaymentOptions extends Object {
        /**
         * The list of options.
         */
        public PremiumGiftCodePaymentOption[] options;

        /**
         * Contains a list of options for creating Telegram Premium gift codes.
         */
        public PremiumGiftCodePaymentOptions() {
        }

        /**
         * Contains a list of options for creating Telegram Premium gift codes.
         *
         * @param options The list of options.
         */
        public PremiumGiftCodePaymentOptions(PremiumGiftCodePaymentOption[] options) {
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1141866719;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about Telegram Premium giveaway.
     */
    public abstract static class PremiumGiveawayInfo extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumGiveawayInfoOngoing.CONSTRUCTOR,
            PremiumGiveawayInfoCompleted.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumGiveawayInfo() {
        }
    }

    /**
     * Describes an ongoing giveaway.
     */
    public static class PremiumGiveawayInfoOngoing extends PremiumGiveawayInfo {
        /**
         * Point in time (Unix timestamp) when the giveaway was created.
         */
        public int creationDate;
        /**
         * Status of the current user in the giveaway.
         */
        public PremiumGiveawayParticipantStatus status;
        /**
         * True, if the giveaway has ended and results are being prepared.
         */
        public boolean isEnded;

        /**
         * Describes an ongoing giveaway.
         */
        public PremiumGiveawayInfoOngoing() {
        }

        /**
         * Describes an ongoing giveaway.
         *
         * @param creationDate Point in time (Unix timestamp) when the giveaway was created.
         * @param status Status of the current user in the giveaway.
         * @param isEnded True, if the giveaway has ended and results are being prepared.
         */
        public PremiumGiveawayInfoOngoing(int creationDate, PremiumGiveawayParticipantStatus status, boolean isEnded) {
            this.creationDate = creationDate;
            this.status = status;
            this.isEnded = isEnded;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1221840495;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a completed giveaway.
     */
    public static class PremiumGiveawayInfoCompleted extends PremiumGiveawayInfo {
        /**
         * Point in time (Unix timestamp) when the giveaway was created.
         */
        public int creationDate;
        /**
         * Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in parameters of the giveaway.
         */
        public int actualWinnersSelectionDate;
        /**
         * True, if the giveaway was canceled and was fully refunded.
         */
        public boolean wasRefunded;
        /**
         * Number of winners in the giveaway.
         */
        public int winnerCount;
        /**
         * Number of winners, which activated their gift codes.
         */
        public int activationCount;
        /**
         * Telegram Premium gift code that was received by the current user; empty if the user isn't a winner in the giveaway.
         */
        public String giftCode;

        /**
         * Describes a completed giveaway.
         */
        public PremiumGiveawayInfoCompleted() {
        }

        /**
         * Describes a completed giveaway.
         *
         * @param creationDate Point in time (Unix timestamp) when the giveaway was created.
         * @param actualWinnersSelectionDate Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in parameters of the giveaway.
         * @param wasRefunded True, if the giveaway was canceled and was fully refunded.
         * @param winnerCount Number of winners in the giveaway.
         * @param activationCount Number of winners, which activated their gift codes.
         * @param giftCode Telegram Premium gift code that was received by the current user; empty if the user isn't a winner in the giveaway.
         */
        public PremiumGiveawayInfoCompleted(int creationDate, int actualWinnersSelectionDate, boolean wasRefunded, int winnerCount, int activationCount, String giftCode) {
            this.creationDate = creationDate;
            this.actualWinnersSelectionDate = actualWinnersSelectionDate;
            this.wasRefunded = wasRefunded;
            this.winnerCount = winnerCount;
            this.activationCount = activationCount;
            this.giftCode = giftCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -57978853;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes parameters of a Telegram Premium giveaway.
     */
    public static class PremiumGiveawayParameters extends Object {
        /**
         * Identifier of the supergroup or channel chat, which will be automatically boosted by the winners of the giveaway for duration of the Premium subscription. If the chat is a channel, then canPostMessages right is required in the channel, otherwise, the user must be an administrator in the supergroup.
         */
        public long boostedChatId;
        /**
         * Identifiers of other supergroup or channel chats that must be subscribed by the users to be eligible for the giveaway. There can be up to getOption(&quot;giveaway_additional_chat_count_max&quot;) additional chats.
         */
        public long[] additionalChatIds;
        /**
         * Point in time (Unix timestamp) when the giveaway is expected to be performed; must be 60-getOption(&quot;giveaway_duration_max&quot;) seconds in the future in scheduled giveaways.
         */
        public int winnersSelectionDate;
        /**
         * True, if only new members of the chats will be eligible for the giveaway.
         */
        public boolean onlyNewMembers;
        /**
         * True, if the list of winners of the giveaway will be available to everyone.
         */
        public boolean hasPublicWinners;
        /**
         * The list of two-letter ISO 3166-1 alpha-2 codes of countries, users from which will be eligible for the giveaway. If empty, then all users can participate in the giveaway. There can be up to getOption(&quot;giveaway_country_count_max&quot;) chosen countries. Users with phone number that was bought at https://fragment.com can participate in any giveaway and the country code &quot;FT&quot; must not be specified in the list.
         */
        public String[] countryCodes;
        /**
         * Additional description of the giveaway prize; 0-128 characters.
         */
        public String prizeDescription;

        /**
         * Describes parameters of a Telegram Premium giveaway.
         */
        public PremiumGiveawayParameters() {
        }

        /**
         * Describes parameters of a Telegram Premium giveaway.
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which will be automatically boosted by the winners of the giveaway for duration of the Premium subscription. If the chat is a channel, then canPostMessages right is required in the channel, otherwise, the user must be an administrator in the supergroup.
         * @param additionalChatIds Identifiers of other supergroup or channel chats that must be subscribed by the users to be eligible for the giveaway. There can be up to getOption(&quot;giveaway_additional_chat_count_max&quot;) additional chats.
         * @param winnersSelectionDate Point in time (Unix timestamp) when the giveaway is expected to be performed; must be 60-getOption(&quot;giveaway_duration_max&quot;) seconds in the future in scheduled giveaways.
         * @param onlyNewMembers True, if only new members of the chats will be eligible for the giveaway.
         * @param hasPublicWinners True, if the list of winners of the giveaway will be available to everyone.
         * @param countryCodes The list of two-letter ISO 3166-1 alpha-2 codes of countries, users from which will be eligible for the giveaway. If empty, then all users can participate in the giveaway. There can be up to getOption(&quot;giveaway_country_count_max&quot;) chosen countries. Users with phone number that was bought at https://fragment.com can participate in any giveaway and the country code &quot;FT&quot; must not be specified in the list.
         * @param prizeDescription Additional description of the giveaway prize; 0-128 characters.
         */
        public PremiumGiveawayParameters(long boostedChatId, long[] additionalChatIds, int winnersSelectionDate, boolean onlyNewMembers, boolean hasPublicWinners, String[] countryCodes, String prizeDescription) {
            this.boostedChatId = boostedChatId;
            this.additionalChatIds = additionalChatIds;
            this.winnersSelectionDate = winnersSelectionDate;
            this.onlyNewMembers = onlyNewMembers;
            this.hasPublicWinners = hasPublicWinners;
            this.countryCodes = countryCodes;
            this.prizeDescription = prizeDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1168346872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about status of a user in a Telegram Premium giveaway.
     */
    public abstract static class PremiumGiveawayParticipantStatus extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumGiveawayParticipantStatusEligible.CONSTRUCTOR,
            PremiumGiveawayParticipantStatusParticipating.CONSTRUCTOR,
            PremiumGiveawayParticipantStatusAlreadyWasMember.CONSTRUCTOR,
            PremiumGiveawayParticipantStatusAdministrator.CONSTRUCTOR,
            PremiumGiveawayParticipantStatusDisallowedCountry.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumGiveawayParticipantStatus() {
        }
    }

    /**
     * The user is eligible for the giveaway.
     */
    public static class PremiumGiveawayParticipantStatusEligible extends PremiumGiveawayParticipantStatus {

        /**
         * The user is eligible for the giveaway.
         */
        public PremiumGiveawayParticipantStatusEligible() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2128773568;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user participates in the giveaway.
     */
    public static class PremiumGiveawayParticipantStatusParticipating extends PremiumGiveawayParticipantStatus {

        /**
         * The user participates in the giveaway.
         */
        public PremiumGiveawayParticipantStatusParticipating() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1946420945;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't participate in the giveaway, because they have already been member of the chat.
     */
    public static class PremiumGiveawayParticipantStatusAlreadyWasMember extends PremiumGiveawayParticipantStatus {
        /**
         * Point in time (Unix timestamp) when the user joined the chat.
         */
        public int joinedChatDate;

        /**
         * The user can't participate in the giveaway, because they have already been member of the chat.
         */
        public PremiumGiveawayParticipantStatusAlreadyWasMember() {
        }

        /**
         * The user can't participate in the giveaway, because they have already been member of the chat.
         *
         * @param joinedChatDate Point in time (Unix timestamp) when the user joined the chat.
         */
        public PremiumGiveawayParticipantStatusAlreadyWasMember(int joinedChatDate) {
            this.joinedChatDate = joinedChatDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1926216285;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't participate in the giveaway, because they are an administrator in one of the chats that created the giveaway.
     */
    public static class PremiumGiveawayParticipantStatusAdministrator extends PremiumGiveawayParticipantStatus {
        /**
         * Identifier of the chat administered by the user.
         */
        public long chatId;

        /**
         * The user can't participate in the giveaway, because they are an administrator in one of the chats that created the giveaway.
         */
        public PremiumGiveawayParticipantStatusAdministrator() {
        }

        /**
         * The user can't participate in the giveaway, because they are an administrator in one of the chats that created the giveaway.
         *
         * @param chatId Identifier of the chat administered by the user.
         */
        public PremiumGiveawayParticipantStatusAdministrator(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1917115086;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't participate in the giveaway, because they phone number is from a disallowed country.
     */
    public static class PremiumGiveawayParticipantStatusDisallowedCountry extends PremiumGiveawayParticipantStatus {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code of the user's country.
         */
        public String userCountryCode;

        /**
         * The user can't participate in the giveaway, because they phone number is from a disallowed country.
         */
        public PremiumGiveawayParticipantStatusDisallowedCountry() {
        }

        /**
         * The user can't participate in the giveaway, because they phone number is from a disallowed country.
         *
         * @param userCountryCode A two-letter ISO 3166-1 alpha-2 country code of the user's country.
         */
        public PremiumGiveawayParticipantStatusDisallowedCountry(String userCountryCode) {
            this.userCountryCode = userCountryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1989656432;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a limit, increased for Premium users.
     */
    public static class PremiumLimit extends Object {
        /**
         * The type of the limit.
         */
        public PremiumLimitType type;
        /**
         * Default value of the limit.
         */
        public int defaultValue;
        /**
         * Value of the limit for Premium users.
         */
        public int premiumValue;

        /**
         * Contains information about a limit, increased for Premium users.
         */
        public PremiumLimit() {
        }

        /**
         * Contains information about a limit, increased for Premium users.
         *
         * @param type The type of the limit.
         * @param defaultValue Default value of the limit.
         * @param premiumValue Value of the limit for Premium users.
         */
        public PremiumLimit(PremiumLimitType type, int defaultValue, int premiumValue) {
            this.type = type;
            this.defaultValue = defaultValue;
            this.premiumValue = premiumValue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2127786726;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of limit, increased for Premium users.
     */
    public abstract static class PremiumLimitType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumLimitTypeSupergroupCount.CONSTRUCTOR,
            PremiumLimitTypePinnedChatCount.CONSTRUCTOR,
            PremiumLimitTypeCreatedPublicChatCount.CONSTRUCTOR,
            PremiumLimitTypeSavedAnimationCount.CONSTRUCTOR,
            PremiumLimitTypeFavoriteStickerCount.CONSTRUCTOR,
            PremiumLimitTypeChatFolderCount.CONSTRUCTOR,
            PremiumLimitTypeChatFolderChosenChatCount.CONSTRUCTOR,
            PremiumLimitTypePinnedArchivedChatCount.CONSTRUCTOR,
            PremiumLimitTypePinnedSavedMessagesTopicCount.CONSTRUCTOR,
            PremiumLimitTypeCaptionLength.CONSTRUCTOR,
            PremiumLimitTypeBioLength.CONSTRUCTOR,
            PremiumLimitTypeChatFolderInviteLinkCount.CONSTRUCTOR,
            PremiumLimitTypeShareableChatFolderCount.CONSTRUCTOR,
            PremiumLimitTypeActiveStoryCount.CONSTRUCTOR,
            PremiumLimitTypeWeeklySentStoryCount.CONSTRUCTOR,
            PremiumLimitTypeMonthlySentStoryCount.CONSTRUCTOR,
            PremiumLimitTypeStoryCaptionLength.CONSTRUCTOR,
            PremiumLimitTypeStorySuggestedReactionAreaCount.CONSTRUCTOR,
            PremiumLimitTypeSimilarChatCount.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumLimitType() {
        }
    }

    /**
     * The maximum number of joined supergroups and channels.
     */
    public static class PremiumLimitTypeSupergroupCount extends PremiumLimitType {

        /**
         * The maximum number of joined supergroups and channels.
         */
        public PremiumLimitTypeSupergroupCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -247467131;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of pinned chats in the main chat list.
     */
    public static class PremiumLimitTypePinnedChatCount extends PremiumLimitType {

        /**
         * The maximum number of pinned chats in the main chat list.
         */
        public PremiumLimitTypePinnedChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -998947871;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of created public chats.
     */
    public static class PremiumLimitTypeCreatedPublicChatCount extends PremiumLimitType {

        /**
         * The maximum number of created public chats.
         */
        public PremiumLimitTypeCreatedPublicChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 446086841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of saved animations.
     */
    public static class PremiumLimitTypeSavedAnimationCount extends PremiumLimitType {

        /**
         * The maximum number of saved animations.
         */
        public PremiumLimitTypeSavedAnimationCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -19759735;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of favorite stickers.
     */
    public static class PremiumLimitTypeFavoriteStickerCount extends PremiumLimitType {

        /**
         * The maximum number of favorite stickers.
         */
        public PremiumLimitTypeFavoriteStickerCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 639754787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of chat folders.
     */
    public static class PremiumLimitTypeChatFolderCount extends PremiumLimitType {

        /**
         * The maximum number of chat folders.
         */
        public PremiumLimitTypeChatFolderCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 377489774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of pinned and always included, or always excluded chats in a chat folder.
     */
    public static class PremiumLimitTypeChatFolderChosenChatCount extends PremiumLimitType {

        /**
         * The maximum number of pinned and always included, or always excluded chats in a chat folder.
         */
        public PremiumLimitTypeChatFolderChosenChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1691435861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of pinned chats in the archive chat list.
     */
    public static class PremiumLimitTypePinnedArchivedChatCount extends PremiumLimitType {

        /**
         * The maximum number of pinned chats in the archive chat list.
         */
        public PremiumLimitTypePinnedArchivedChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1485515276;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of pinned Saved Messages topics.
     */
    public static class PremiumLimitTypePinnedSavedMessagesTopicCount extends PremiumLimitType {

        /**
         * The maximum number of pinned Saved Messages topics.
         */
        public PremiumLimitTypePinnedSavedMessagesTopicCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1544854305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum length of sent media caption.
     */
    public static class PremiumLimitTypeCaptionLength extends PremiumLimitType {

        /**
         * The maximum length of sent media caption.
         */
        public PremiumLimitTypeCaptionLength() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 293984314;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum length of the user's bio.
     */
    public static class PremiumLimitTypeBioLength extends PremiumLimitType {

        /**
         * The maximum length of the user's bio.
         */
        public PremiumLimitTypeBioLength() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1146976765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of invite links for a chat folder.
     */
    public static class PremiumLimitTypeChatFolderInviteLinkCount extends PremiumLimitType {

        /**
         * The maximum number of invite links for a chat folder.
         */
        public PremiumLimitTypeChatFolderInviteLinkCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -128702950;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of added shareable chat folders.
     */
    public static class PremiumLimitTypeShareableChatFolderCount extends PremiumLimitType {

        /**
         * The maximum number of added shareable chat folders.
         */
        public PremiumLimitTypeShareableChatFolderCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1612625095;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of active stories.
     */
    public static class PremiumLimitTypeActiveStoryCount extends PremiumLimitType {

        /**
         * The maximum number of active stories.
         */
        public PremiumLimitTypeActiveStoryCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1926486372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of stories sent per week.
     */
    public static class PremiumLimitTypeWeeklySentStoryCount extends PremiumLimitType {

        /**
         * The maximum number of stories sent per week.
         */
        public PremiumLimitTypeWeeklySentStoryCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 40485707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of stories sent per month.
     */
    public static class PremiumLimitTypeMonthlySentStoryCount extends PremiumLimitType {

        /**
         * The maximum number of stories sent per month.
         */
        public PremiumLimitTypeMonthlySentStoryCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 819481475;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum length of captions of sent stories.
     */
    public static class PremiumLimitTypeStoryCaptionLength extends PremiumLimitType {

        /**
         * The maximum length of captions of sent stories.
         */
        public PremiumLimitTypeStoryCaptionLength() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1093324030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of suggested reaction areas on a story.
     */
    public static class PremiumLimitTypeStorySuggestedReactionAreaCount extends PremiumLimitType {

        /**
         * The maximum number of suggested reaction areas on a story.
         */
        public PremiumLimitTypeStorySuggestedReactionAreaCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1170032633;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of received similar chats.
     */
    public static class PremiumLimitTypeSimilarChatCount extends PremiumLimitType {

        /**
         * The maximum number of received similar chats.
         */
        public PremiumLimitTypeSimilarChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1563549935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for buying Telegram Premium to a user.
     */
    public static class PremiumPaymentOption extends Object {
        /**
         * ISO 4217 currency code for Telegram Premium subscription payment.
         */
        public String currency;
        /**
         * The amount to pay, in the smallest units of the currency.
         */
        public long amount;
        /**
         * The discount associated with this option, as a percentage.
         */
        public int discountPercentage;
        /**
         * Number of months the Telegram Premium subscription will be active.
         */
        public int monthCount;
        /**
         * Identifier of the store product associated with the option.
         */
        public String storeProductId;
        /**
         * An internal link to be opened for buying Telegram Premium to the user if store payment isn't possible; may be null if direct payment isn't available.
         */
        @Nullable public InternalLinkType paymentLink;

        /**
         * Describes an option for buying Telegram Premium to a user.
         */
        public PremiumPaymentOption() {
        }

        /**
         * Describes an option for buying Telegram Premium to a user.
         *
         * @param currency ISO 4217 currency code for Telegram Premium subscription payment.
         * @param amount The amount to pay, in the smallest units of the currency.
         * @param discountPercentage The discount associated with this option, as a percentage.
         * @param monthCount Number of months the Telegram Premium subscription will be active.
         * @param storeProductId Identifier of the store product associated with the option.
         * @param paymentLink An internal link to be opened for buying Telegram Premium to the user if store payment isn't possible; may be null if direct payment isn't available.
         */
        public PremiumPaymentOption(String currency, long amount, int discountPercentage, int monthCount, String storeProductId, InternalLinkType paymentLink) {
            this.currency = currency;
            this.amount = amount;
            this.discountPercentage = discountPercentage;
            this.monthCount = monthCount;
            this.storeProductId = storeProductId;
            this.paymentLink = paymentLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1945346126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a source from which the Premium features screen is opened.
     */
    public abstract static class PremiumSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumSourceLimitExceeded.CONSTRUCTOR,
            PremiumSourceFeature.CONSTRUCTOR,
            PremiumSourceBusinessFeature.CONSTRUCTOR,
            PremiumSourceStoryFeature.CONSTRUCTOR,
            PremiumSourceLink.CONSTRUCTOR,
            PremiumSourceSettings.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumSource() {
        }
    }

    /**
     * A limit was exceeded.
     */
    public static class PremiumSourceLimitExceeded extends PremiumSource {
        /**
         * Type of the exceeded limit.
         */
        public PremiumLimitType limitType;

        /**
         * A limit was exceeded.
         */
        public PremiumSourceLimitExceeded() {
        }

        /**
         * A limit was exceeded.
         *
         * @param limitType Type of the exceeded limit.
         */
        public PremiumSourceLimitExceeded(PremiumLimitType limitType) {
            this.limitType = limitType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2052159742;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user tried to use a Premium feature.
     */
    public static class PremiumSourceFeature extends PremiumSource {
        /**
         * The used feature.
         */
        public PremiumFeature feature;

        /**
         * A user tried to use a Premium feature.
         */
        public PremiumSourceFeature() {
        }

        /**
         * A user tried to use a Premium feature.
         *
         * @param feature The used feature.
         */
        public PremiumSourceFeature(PremiumFeature feature) {
            this.feature = feature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 445813541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user tried to use a Business feature.
     */
    public static class PremiumSourceBusinessFeature extends PremiumSource {
        /**
         * The used feature; pass null if none specific feature was used.
         */
        public BusinessFeature feature;

        /**
         * A user tried to use a Business feature.
         */
        public PremiumSourceBusinessFeature() {
        }

        /**
         * A user tried to use a Business feature.
         *
         * @param feature The used feature; pass null if none specific feature was used.
         */
        public PremiumSourceBusinessFeature(BusinessFeature feature) {
            this.feature = feature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1492946340;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user tried to use a Premium story feature.
     */
    public static class PremiumSourceStoryFeature extends PremiumSource {
        /**
         * The used feature.
         */
        public PremiumStoryFeature feature;

        /**
         * A user tried to use a Premium story feature.
         */
        public PremiumSourceStoryFeature() {
        }

        /**
         * A user tried to use a Premium story feature.
         *
         * @param feature The used feature.
         */
        public PremiumSourceStoryFeature(PremiumStoryFeature feature) {
            this.feature = feature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1030737556;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user opened an internal link of the type internalLinkTypePremiumFeatures.
     */
    public static class PremiumSourceLink extends PremiumSource {
        /**
         * The referrer from the link.
         */
        public String referrer;

        /**
         * A user opened an internal link of the type internalLinkTypePremiumFeatures.
         */
        public PremiumSourceLink() {
        }

        /**
         * A user opened an internal link of the type internalLinkTypePremiumFeatures.
         *
         * @param referrer The referrer from the link.
         */
        public PremiumSourceLink(String referrer) {
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2135071132;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user opened the Premium features screen from settings.
     */
    public static class PremiumSourceSettings extends PremiumSource {

        /**
         * A user opened the Premium features screen from settings.
         */
        public PremiumSourceSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -285702859;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains state of Telegram Premium subscription and promotion videos for Premium features.
     */
    public static class PremiumState extends Object {
        /**
         * Text description of the state of the current Premium subscription; may be empty if the current user has no Telegram Premium subscription.
         */
        public FormattedText state;
        /**
         * The list of available options for buying Telegram Premium.
         */
        public PremiumStatePaymentOption[] paymentOptions;
        /**
         * The list of available promotion animations for Premium features.
         */
        public PremiumFeaturePromotionAnimation[] animations;
        /**
         * The list of available promotion animations for Business features.
         */
        public BusinessFeaturePromotionAnimation[] businessAnimations;

        /**
         * Contains state of Telegram Premium subscription and promotion videos for Premium features.
         */
        public PremiumState() {
        }

        /**
         * Contains state of Telegram Premium subscription and promotion videos for Premium features.
         *
         * @param state Text description of the state of the current Premium subscription; may be empty if the current user has no Telegram Premium subscription.
         * @param paymentOptions The list of available options for buying Telegram Premium.
         * @param animations The list of available promotion animations for Premium features.
         * @param businessAnimations The list of available promotion animations for Business features.
         */
        public PremiumState(FormattedText state, PremiumStatePaymentOption[] paymentOptions, PremiumFeaturePromotionAnimation[] animations, BusinessFeaturePromotionAnimation[] businessAnimations) {
            this.state = state;
            this.paymentOptions = paymentOptions;
            this.animations = animations;
            this.businessAnimations = businessAnimations;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1772082178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for buying or upgrading Telegram Premium for self.
     */
    public static class PremiumStatePaymentOption extends Object {
        /**
         * Information about the payment option.
         */
        public PremiumPaymentOption paymentOption;
        /**
         * True, if this is the currently used Telegram Premium subscription option.
         */
        public boolean isCurrent;
        /**
         * True, if the payment option can be used to upgrade the existing Telegram Premium subscription.
         */
        public boolean isUpgrade;
        /**
         * Identifier of the last in-store transaction for the currently used option.
         */
        public String lastTransactionId;

        /**
         * Describes an option for buying or upgrading Telegram Premium for self.
         */
        public PremiumStatePaymentOption() {
        }

        /**
         * Describes an option for buying or upgrading Telegram Premium for self.
         *
         * @param paymentOption Information about the payment option.
         * @param isCurrent True, if this is the currently used Telegram Premium subscription option.
         * @param isUpgrade True, if the payment option can be used to upgrade the existing Telegram Premium subscription.
         * @param lastTransactionId Identifier of the last in-store transaction for the currently used option.
         */
        public PremiumStatePaymentOption(PremiumPaymentOption paymentOption, boolean isCurrent, boolean isUpgrade, String lastTransactionId) {
            this.paymentOption = paymentOption;
            this.isCurrent = isCurrent;
            this.isUpgrade = isUpgrade;
            this.lastTransactionId = lastTransactionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2097591673;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a story feature available to Premium users.
     */
    public abstract static class PremiumStoryFeature extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumStoryFeaturePriorityOrder.CONSTRUCTOR,
            PremiumStoryFeatureStealthMode.CONSTRUCTOR,
            PremiumStoryFeaturePermanentViewsHistory.CONSTRUCTOR,
            PremiumStoryFeatureCustomExpirationDuration.CONSTRUCTOR,
            PremiumStoryFeatureSaveStories.CONSTRUCTOR,
            PremiumStoryFeatureLinksAndFormatting.CONSTRUCTOR,
            PremiumStoryFeatureVideoQuality.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumStoryFeature() {
        }
    }

    /**
     * Stories of the current user are displayed before stories of non-Premium contacts, supergroups, and channels.
     */
    public static class PremiumStoryFeaturePriorityOrder extends PremiumStoryFeature {

        /**
         * Stories of the current user are displayed before stories of non-Premium contacts, supergroups, and channels.
         */
        public PremiumStoryFeaturePriorityOrder() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1880001849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to hide the fact that the user viewed other's stories.
     */
    public static class PremiumStoryFeatureStealthMode extends PremiumStoryFeature {

        /**
         * The ability to hide the fact that the user viewed other's stories.
         */
        public PremiumStoryFeatureStealthMode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1194605988;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to check who opened the current user's stories after they expire.
     */
    public static class PremiumStoryFeaturePermanentViewsHistory extends PremiumStoryFeature {

        /**
         * The ability to check who opened the current user's stories after they expire.
         */
        public PremiumStoryFeaturePermanentViewsHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1029683296;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set custom expiration duration for stories.
     */
    public static class PremiumStoryFeatureCustomExpirationDuration extends PremiumStoryFeature {

        /**
         * The ability to set custom expiration duration for stories.
         */
        public PremiumStoryFeatureCustomExpirationDuration() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -593229162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to save other's unprotected stories.
     */
    public static class PremiumStoryFeatureSaveStories extends PremiumStoryFeature {

        /**
         * The ability to save other's unprotected stories.
         */
        public PremiumStoryFeatureSaveStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1501286467;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use links and formatting in story caption, and use inputStoryAreaTypeLink areas.
     */
    public static class PremiumStoryFeatureLinksAndFormatting extends PremiumStoryFeature {

        /**
         * The ability to use links and formatting in story caption, and use inputStoryAreaTypeLink areas.
         */
        public PremiumStoryFeatureLinksAndFormatting() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -622623753;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to choose better quality for viewed stories.
     */
    public static class PremiumStoryFeatureVideoQuality extends PremiumStoryFeature {

        /**
         * The ability to choose better quality for viewed stories.
         */
        public PremiumStoryFeatureVideoQuality() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1162887511;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a prepaid Telegram Premium giveaway.
     */
    public static class PrepaidPremiumGiveaway extends Object {
        /**
         * Unique identifier of the prepaid giveaway.
         */
        public long id;
        /**
         * Number of users which will receive Telegram Premium subscription gift codes.
         */
        public int winnerCount;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation.
         */
        public int monthCount;
        /**
         * Point in time (Unix timestamp) when the giveaway was paid.
         */
        public int paymentDate;

        /**
         * Describes a prepaid Telegram Premium giveaway.
         */
        public PrepaidPremiumGiveaway() {
        }

        /**
         * Describes a prepaid Telegram Premium giveaway.
         *
         * @param id Unique identifier of the prepaid giveaway.
         * @param winnerCount Number of users which will receive Telegram Premium subscription gift codes.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation.
         * @param paymentDate Point in time (Unix timestamp) when the giveaway was paid.
         */
        public PrepaidPremiumGiveaway(long id, int winnerCount, int monthCount, int paymentDate) {
            this.id = id;
            this.winnerCount = winnerCount;
            this.monthCount = monthCount;
            this.paymentDate = paymentDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1809133888;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a product that can be paid with invoice.
     */
    public static class ProductInfo extends Object {
        /**
         * Product title.
         */
        public String title;
        /**
         * Product description.
         */
        public FormattedText description;
        /**
         * Product photo; may be null.
         */
        @Nullable public Photo photo;

        /**
         * Contains information about a product that can be paid with invoice.
         */
        public ProductInfo() {
        }

        /**
         * Contains information about a product that can be paid with invoice.
         *
         * @param title Product title.
         * @param description Product description.
         * @param photo Product photo; may be null.
         */
        public ProductInfo(String title, FormattedText description, Photo photo) {
            this.title = title;
            this.description = description;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2015069020;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about supported accent color for user profile photo background.
     */
    public static class ProfileAccentColor extends Object {
        /**
         * Profile accent color identifier.
         */
        public int id;
        /**
         * Accent colors expected to be used in light themes.
         */
        public ProfileAccentColors lightThemeColors;
        /**
         * Accent colors expected to be used in dark themes.
         */
        public ProfileAccentColors darkThemeColors;
        /**
         * The minimum chat boost level required to use the color in a supergroup chat.
         */
        public int minSupergroupChatBoostLevel;
        /**
         * The minimum chat boost level required to use the color in a channel chat.
         */
        public int minChannelChatBoostLevel;

        /**
         * Contains information about supported accent color for user profile photo background.
         */
        public ProfileAccentColor() {
        }

        /**
         * Contains information about supported accent color for user profile photo background.
         *
         * @param id Profile accent color identifier.
         * @param lightThemeColors Accent colors expected to be used in light themes.
         * @param darkThemeColors Accent colors expected to be used in dark themes.
         * @param minSupergroupChatBoostLevel The minimum chat boost level required to use the color in a supergroup chat.
         * @param minChannelChatBoostLevel The minimum chat boost level required to use the color in a channel chat.
         */
        public ProfileAccentColor(int id, ProfileAccentColors lightThemeColors, ProfileAccentColors darkThemeColors, int minSupergroupChatBoostLevel, int minChannelChatBoostLevel) {
            this.id = id;
            this.lightThemeColors = lightThemeColors;
            this.darkThemeColors = darkThemeColors;
            this.minSupergroupChatBoostLevel = minSupergroupChatBoostLevel;
            this.minChannelChatBoostLevel = minChannelChatBoostLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 557679253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about supported accent colors for user profile photo background in RGB format.
     */
    public static class ProfileAccentColors extends Object {
        /**
         * The list of 1-2 colors in RGB format, describing the colors, as expected to be shown in the color palette settings.
         */
        public int[] paletteColors;
        /**
         * The list of 1-2 colors in RGB format, describing the colors, as expected to be used for the profile photo background.
         */
        public int[] backgroundColors;
        /**
         * The list of 2 colors in RGB format, describing the colors of the gradient to be used for the unread active story indicator around profile photo.
         */
        public int[] storyColors;

        /**
         * Contains information about supported accent colors for user profile photo background in RGB format.
         */
        public ProfileAccentColors() {
        }

        /**
         * Contains information about supported accent colors for user profile photo background in RGB format.
         *
         * @param paletteColors The list of 1-2 colors in RGB format, describing the colors, as expected to be shown in the color palette settings.
         * @param backgroundColors The list of 1-2 colors in RGB format, describing the colors, as expected to be used for the profile photo background.
         * @param storyColors The list of 2 colors in RGB format, describing the colors of the gradient to be used for the unread active story indicator around profile photo.
         */
        public ProfileAccentColors(int[] paletteColors, int[] backgroundColors, int[] storyColors) {
            this.paletteColors = paletteColors;
            this.backgroundColors = backgroundColors;
            this.storyColors = storyColors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -596042431;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user profile photo.
     */
    public static class ProfilePhoto extends Object {
        /**
         * Photo identifier; 0 for an empty photo. Can be used to find a photo in a list of user profile photos.
         */
        public long id;
        /**
         * A small (160x160) user profile photo. The file can be downloaded only before the photo is changed.
         */
        public File small;
        /**
         * A big (640x640) user profile photo. The file can be downloaded only before the photo is changed.
         */
        public File big;
        /**
         * User profile photo minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * True, if the photo has animated variant.
         */
        public boolean hasAnimation;
        /**
         * True, if the photo is visible only for the current user.
         */
        public boolean isPersonal;

        /**
         * Describes a user profile photo.
         */
        public ProfilePhoto() {
        }

        /**
         * Describes a user profile photo.
         *
         * @param id Photo identifier; 0 for an empty photo. Can be used to find a photo in a list of user profile photos.
         * @param small A small (160x160) user profile photo. The file can be downloaded only before the photo is changed.
         * @param big A big (640x640) user profile photo. The file can be downloaded only before the photo is changed.
         * @param minithumbnail User profile photo minithumbnail; may be null.
         * @param hasAnimation True, if the photo has animated variant.
         * @param isPersonal True, if the photo is visible only for the current user.
         */
        public ProfilePhoto(long id, File small, File big, Minithumbnail minithumbnail, boolean hasAnimation, boolean isPersonal) {
            this.id = id;
            this.small = small;
            this.big = big;
            this.minithumbnail = minithumbnail;
            this.hasAnimation = hasAnimation;
            this.isPersonal = isPersonal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1025754018;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of proxy servers.
     */
    public static class Proxies extends Object {
        /**
         * List of proxy servers.
         */
        public Proxy[] proxies;

        /**
         * Represents a list of proxy servers.
         */
        public Proxies() {
        }

        /**
         * Represents a list of proxy servers.
         *
         * @param proxies List of proxy servers.
         */
        public Proxies(Proxy[] proxies) {
            this.proxies = proxies;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1200447205;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a proxy server.
     */
    public static class Proxy extends Object {
        /**
         * Unique identifier of the proxy.
         */
        public int id;
        /**
         * Proxy server domain or IP address.
         */
        public String server;
        /**
         * Proxy server port.
         */
        public int port;
        /**
         * Point in time (Unix timestamp) when the proxy was last used; 0 if never.
         */
        public int lastUsedDate;
        /**
         * True, if the proxy is enabled now.
         */
        public boolean isEnabled;
        /**
         * Type of the proxy.
         */
        public ProxyType type;

        /**
         * Contains information about a proxy server.
         */
        public Proxy() {
        }

        /**
         * Contains information about a proxy server.
         *
         * @param id Unique identifier of the proxy.
         * @param server Proxy server domain or IP address.
         * @param port Proxy server port.
         * @param lastUsedDate Point in time (Unix timestamp) when the proxy was last used; 0 if never.
         * @param isEnabled True, if the proxy is enabled now.
         * @param type Type of the proxy.
         */
        public Proxy(int id, String server, int port, int lastUsedDate, boolean isEnabled, ProxyType type) {
            this.id = id;
            this.server = server;
            this.port = port;
            this.lastUsedDate = lastUsedDate;
            this.isEnabled = isEnabled;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 196049779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of proxy server.
     */
    public abstract static class ProxyType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ProxyTypeSocks5.CONSTRUCTOR,
            ProxyTypeHttp.CONSTRUCTOR,
            ProxyTypeMtproto.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ProxyType() {
        }
    }

    /**
     * A SOCKS5 proxy server.
     */
    public static class ProxyTypeSocks5 extends ProxyType {
        /**
         * Username for logging in; may be empty.
         */
        public String username;
        /**
         * Password for logging in; may be empty.
         */
        public String password;

        /**
         * A SOCKS5 proxy server.
         */
        public ProxyTypeSocks5() {
        }

        /**
         * A SOCKS5 proxy server.
         *
         * @param username Username for logging in; may be empty.
         * @param password Password for logging in; may be empty.
         */
        public ProxyTypeSocks5(String username, String password) {
            this.username = username;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -890027341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A HTTP transparent proxy server.
     */
    public static class ProxyTypeHttp extends ProxyType {
        /**
         * Username for logging in; may be empty.
         */
        public String username;
        /**
         * Password for logging in; may be empty.
         */
        public String password;
        /**
         * Pass true if the proxy supports only HTTP requests and doesn't support transparent TCP connections via HTTP CONNECT method.
         */
        public boolean httpOnly;

        /**
         * A HTTP transparent proxy server.
         */
        public ProxyTypeHttp() {
        }

        /**
         * A HTTP transparent proxy server.
         *
         * @param username Username for logging in; may be empty.
         * @param password Password for logging in; may be empty.
         * @param httpOnly Pass true if the proxy supports only HTTP requests and doesn't support transparent TCP connections via HTTP CONNECT method.
         */
        public ProxyTypeHttp(String username, String password, boolean httpOnly) {
            this.username = username;
            this.password = password;
            this.httpOnly = httpOnly;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1547188361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An MTProto proxy server.
     */
    public static class ProxyTypeMtproto extends ProxyType {
        /**
         * The proxy's secret in hexadecimal encoding.
         */
        public String secret;

        /**
         * An MTProto proxy server.
         */
        public ProxyTypeMtproto() {
        }

        /**
         * An MTProto proxy server.
         *
         * @param secret The proxy's secret in hexadecimal encoding.
         */
        public ProxyTypeMtproto(String secret) {
            this.secret = secret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1964826627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of public chat.
     */
    public abstract static class PublicChatType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PublicChatTypeHasUsername.CONSTRUCTOR,
            PublicChatTypeIsLocationBased.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PublicChatType() {
        }
    }

    /**
     * The chat is public, because it has an active username.
     */
    public static class PublicChatTypeHasUsername extends PublicChatType {

        /**
         * The chat is public, because it has an active username.
         */
        public PublicChatTypeHasUsername() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 350789758;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is public, because it is a location-based supergroup.
     */
    public static class PublicChatTypeIsLocationBased extends PublicChatType {

        /**
         * The chat is public, because it is a location-based supergroup.
         */
        public PublicChatTypeIsLocationBased() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1183735952;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a public forward or repost of a story.
     */
    public abstract static class PublicForward extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PublicForwardMessage.CONSTRUCTOR,
            PublicForwardStory.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PublicForward() {
        }
    }

    /**
     * Contains a public forward as a message.
     */
    public static class PublicForwardMessage extends PublicForward {
        /**
         * Information about the message.
         */
        public Message message;

        /**
         * Contains a public forward as a message.
         */
        public PublicForwardMessage() {
        }

        /**
         * Contains a public forward as a message.
         *
         * @param message Information about the message.
         */
        public PublicForwardMessage(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 51885010;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a public repost to a story.
     */
    public static class PublicForwardStory extends PublicForward {
        /**
         * Information about the story.
         */
        public Story story;

        /**
         * Contains a public repost to a story.
         */
        public PublicForwardStory() {
        }

        /**
         * Contains a public repost to a story.
         *
         * @param story Information about the story.
         */
        public PublicForwardStory(Story story) {
            this.story = story;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2145330863;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of public forwards and reposts as a story of a message or a story.
     */
    public static class PublicForwards extends Object {
        /**
         * Approximate total number of messages and stories found.
         */
        public int totalCount;
        /**
         * List of found public forwards and reposts.
         */
        public PublicForward[] forwards;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of public forwards and reposts as a story of a message or a story.
         */
        public PublicForwards() {
        }

        /**
         * Represents a list of public forwards and reposts as a story of a message or a story.
         *
         * @param totalCount Approximate total number of messages and stories found.
         * @param forwards List of found public forwards and reposts.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public PublicForwards(int totalCount, PublicForward[] forwards, String nextOffset) {
            this.totalCount = totalCount;
            this.forwards = forwards;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2011272719;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains content of a push message notification.
     */
    public abstract static class PushMessageContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PushMessageContentHidden.CONSTRUCTOR,
            PushMessageContentAnimation.CONSTRUCTOR,
            PushMessageContentAudio.CONSTRUCTOR,
            PushMessageContentContact.CONSTRUCTOR,
            PushMessageContentContactRegistered.CONSTRUCTOR,
            PushMessageContentDocument.CONSTRUCTOR,
            PushMessageContentGame.CONSTRUCTOR,
            PushMessageContentGameScore.CONSTRUCTOR,
            PushMessageContentInvoice.CONSTRUCTOR,
            PushMessageContentLocation.CONSTRUCTOR,
            PushMessageContentPaidMedia.CONSTRUCTOR,
            PushMessageContentPhoto.CONSTRUCTOR,
            PushMessageContentPoll.CONSTRUCTOR,
            PushMessageContentPremiumGiftCode.CONSTRUCTOR,
            PushMessageContentPremiumGiveaway.CONSTRUCTOR,
            PushMessageContentScreenshotTaken.CONSTRUCTOR,
            PushMessageContentSticker.CONSTRUCTOR,
            PushMessageContentStory.CONSTRUCTOR,
            PushMessageContentText.CONSTRUCTOR,
            PushMessageContentVideo.CONSTRUCTOR,
            PushMessageContentVideoNote.CONSTRUCTOR,
            PushMessageContentVoiceNote.CONSTRUCTOR,
            PushMessageContentBasicGroupChatCreate.CONSTRUCTOR,
            PushMessageContentChatAddMembers.CONSTRUCTOR,
            PushMessageContentChatChangePhoto.CONSTRUCTOR,
            PushMessageContentChatChangeTitle.CONSTRUCTOR,
            PushMessageContentChatSetBackground.CONSTRUCTOR,
            PushMessageContentChatSetTheme.CONSTRUCTOR,
            PushMessageContentChatDeleteMember.CONSTRUCTOR,
            PushMessageContentChatJoinByLink.CONSTRUCTOR,
            PushMessageContentChatJoinByRequest.CONSTRUCTOR,
            PushMessageContentRecurringPayment.CONSTRUCTOR,
            PushMessageContentSuggestProfilePhoto.CONSTRUCTOR,
            PushMessageContentMessageForwards.CONSTRUCTOR,
            PushMessageContentMediaAlbum.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PushMessageContent() {
        }
    }

    /**
     * A general message with hidden content.
     */
    public static class PushMessageContentHidden extends PushMessageContent {
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A general message with hidden content.
         */
        public PushMessageContentHidden() {
        }

        /**
         * A general message with hidden content.
         *
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentHidden(boolean isPinned) {
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -316950436;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation message (GIF-style).
     */
    public static class PushMessageContentAnimation extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Animation animation;
        /**
         * Animation caption.
         */
        public String caption;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * An animation message (GIF-style).
         */
        public PushMessageContentAnimation() {
        }

        /**
         * An animation message (GIF-style).
         *
         * @param animation Message content; may be null.
         * @param caption Animation caption.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentAnimation(Animation animation, String caption, boolean isPinned) {
            this.animation = animation;
            this.caption = caption;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1034215396;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An audio message.
     */
    public static class PushMessageContentAudio extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Audio audio;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * An audio message.
         */
        public PushMessageContentAudio() {
        }

        /**
         * An audio message.
         *
         * @param audio Message content; may be null.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentAudio(Audio audio, boolean isPinned) {
            this.audio = audio;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 381581426;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a user contact.
     */
    public static class PushMessageContentContact extends PushMessageContent {
        /**
         * Contact's name.
         */
        public String name;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a user contact.
         */
        public PushMessageContentContact() {
        }

        /**
         * A message with a user contact.
         *
         * @param name Contact's name.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentContact(String name, boolean isPinned) {
            this.name = name;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -12219820;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A contact has registered with Telegram.
     */
    public static class PushMessageContentContactRegistered extends PushMessageContent {

        /**
         * A contact has registered with Telegram.
         */
        public PushMessageContentContactRegistered() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -303962720;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A document message (a general file).
     */
    public static class PushMessageContentDocument extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Document document;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A document message (a general file).
         */
        public PushMessageContentDocument() {
        }

        /**
         * A document message (a general file).
         *
         * @param document Message content; may be null.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentDocument(Document document, boolean isPinned) {
            this.document = document;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -458379775;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a game.
     */
    public static class PushMessageContentGame extends PushMessageContent {
        /**
         * Game title, empty for pinned game message.
         */
        public String title;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a game.
         */
        public PushMessageContentGame() {
        }

        /**
         * A message with a game.
         *
         * @param title Game title, empty for pinned game message.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentGame(String title, boolean isPinned) {
            this.title = title;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -515131109;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new high score was achieved in a game.
     */
    public static class PushMessageContentGameScore extends PushMessageContent {
        /**
         * Game title, empty for pinned message.
         */
        public String title;
        /**
         * New score, 0 for pinned message.
         */
        public int score;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A new high score was achieved in a game.
         */
        public PushMessageContentGameScore() {
        }

        /**
         * A new high score was achieved in a game.
         *
         * @param title Game title, empty for pinned message.
         * @param score New score, 0 for pinned message.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentGameScore(String title, int score, boolean isPinned) {
            this.title = title;
            this.score = score;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 901303688;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an invoice from a bot.
     */
    public static class PushMessageContentInvoice extends PushMessageContent {
        /**
         * Product price.
         */
        public String price;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with an invoice from a bot.
         */
        public PushMessageContentInvoice() {
        }

        /**
         * A message with an invoice from a bot.
         *
         * @param price Product price.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentInvoice(String price, boolean isPinned) {
            this.price = price;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1731687492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a location.
     */
    public static class PushMessageContentLocation extends PushMessageContent {
        /**
         * True, if the location is live.
         */
        public boolean isLive;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a location.
         */
        public PushMessageContentLocation() {
        }

        /**
         * A message with a location.
         *
         * @param isLive True, if the location is live.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentLocation(boolean isLive, boolean isPinned) {
            this.isLive = isLive;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1288005709;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with paid media.
     */
    public static class PushMessageContentPaidMedia extends PushMessageContent {
        /**
         * Number of stars needed to buy access to the media in the message; 0 for pinned message.
         */
        public long starCount;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with paid media.
         */
        public PushMessageContentPaidMedia() {
        }

        /**
         * A message with paid media.
         *
         * @param starCount Number of stars needed to buy access to the media in the message; 0 for pinned message.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentPaidMedia(long starCount, boolean isPinned) {
            this.starCount = starCount;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1252595894;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A photo message.
     */
    public static class PushMessageContentPhoto extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Photo caption.
         */
        public String caption;
        /**
         * True, if the photo is secret.
         */
        public boolean isSecret;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A photo message.
         */
        public PushMessageContentPhoto() {
        }

        /**
         * A photo message.
         *
         * @param photo Message content; may be null.
         * @param caption Photo caption.
         * @param isSecret True, if the photo is secret.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentPhoto(Photo photo, String caption, boolean isSecret, boolean isPinned) {
            this.photo = photo;
            this.caption = caption;
            this.isSecret = isSecret;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 140631122;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a poll.
     */
    public static class PushMessageContentPoll extends PushMessageContent {
        /**
         * Poll question.
         */
        public String question;
        /**
         * True, if the poll is regular and not in quiz mode.
         */
        public boolean isRegular;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a poll.
         */
        public PushMessageContentPoll() {
        }

        /**
         * A message with a poll.
         *
         * @param question Poll question.
         * @param isRegular True, if the poll is regular and not in quiz mode.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentPoll(String question, boolean isRegular, boolean isPinned) {
            this.question = question;
            this.isRegular = isRegular;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -44403654;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a Telegram Premium gift code created for the user.
     */
    public static class PushMessageContentPremiumGiftCode extends PushMessageContent {
        /**
         * Number of months the Telegram Premium subscription will be active after code activation.
         */
        public int monthCount;

        /**
         * A message with a Telegram Premium gift code created for the user.
         */
        public PushMessageContentPremiumGiftCode() {
        }

        /**
         * A message with a Telegram Premium gift code created for the user.
         *
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation.
         */
        public PushMessageContentPremiumGiftCode(int monthCount) {
            this.monthCount = monthCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 413224997;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a Telegram Premium giveaway.
     */
    public static class PushMessageContentPremiumGiveaway extends PushMessageContent {
        /**
         * Number of users which will receive Telegram Premium subscription gift codes; 0 for pinned message.
         */
        public int winnerCount;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation; 0 for pinned message.
         */
        public int monthCount;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a Telegram Premium giveaway.
         */
        public PushMessageContentPremiumGiveaway() {
        }

        /**
         * A message with a Telegram Premium giveaway.
         *
         * @param winnerCount Number of users which will receive Telegram Premium subscription gift codes; 0 for pinned message.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation; 0 for pinned message.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentPremiumGiveaway(int winnerCount, int monthCount, boolean isPinned) {
            this.winnerCount = winnerCount;
            this.monthCount = monthCount;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1473408497;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A screenshot of a message in the chat has been taken.
     */
    public static class PushMessageContentScreenshotTaken extends PushMessageContent {

        /**
         * A screenshot of a message in the chat has been taken.
         */
        public PushMessageContentScreenshotTaken() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 214245369;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a sticker.
     */
    public static class PushMessageContentSticker extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Sticker sticker;
        /**
         * Emoji corresponding to the sticker; may be empty.
         */
        public String emoji;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a sticker.
         */
        public PushMessageContentSticker() {
        }

        /**
         * A message with a sticker.
         *
         * @param sticker Message content; may be null.
         * @param emoji Emoji corresponding to the sticker; may be empty.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentSticker(Sticker sticker, String emoji, boolean isPinned) {
            this.sticker = sticker;
            this.emoji = emoji;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1553513939;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a story.
     */
    public static class PushMessageContentStory extends PushMessageContent {
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a story.
         */
        public PushMessageContentStory() {
        }

        /**
         * A message with a story.
         *
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentStory(boolean isPinned) {
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1721470519;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text message.
     */
    public static class PushMessageContentText extends PushMessageContent {
        /**
         * Message text.
         */
        public String text;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A text message.
         */
        public PushMessageContentText() {
        }

        /**
         * A text message.
         *
         * @param text Message text.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentText(String text, boolean isPinned) {
            this.text = text;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 274587305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video message.
     */
    public static class PushMessageContentVideo extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Video video;
        /**
         * Video caption.
         */
        public String caption;
        /**
         * True, if the video is secret.
         */
        public boolean isSecret;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A video message.
         */
        public PushMessageContentVideo() {
        }

        /**
         * A video message.
         *
         * @param video Message content; may be null.
         * @param caption Video caption.
         * @param isSecret True, if the video is secret.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentVideo(Video video, String caption, boolean isSecret, boolean isPinned) {
            this.video = video;
            this.caption = caption;
            this.isSecret = isSecret;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 310038831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video note message.
     */
    public static class PushMessageContentVideoNote extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public VideoNote videoNote;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A video note message.
         */
        public PushMessageContentVideoNote() {
        }

        /**
         * A video note message.
         *
         * @param videoNote Message content; may be null.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentVideoNote(VideoNote videoNote, boolean isPinned) {
            this.videoNote = videoNote;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1122764417;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A voice note message.
     */
    public static class PushMessageContentVoiceNote extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public VoiceNote voiceNote;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A voice note message.
         */
        public PushMessageContentVoiceNote() {
        }

        /**
         * A voice note message.
         *
         * @param voiceNote Message content; may be null.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentVoiceNote(VoiceNote voiceNote, boolean isPinned) {
            this.voiceNote = voiceNote;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 88910987;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A newly created basic group.
     */
    public static class PushMessageContentBasicGroupChatCreate extends PushMessageContent {

        /**
         * A newly created basic group.
         */
        public PushMessageContentBasicGroupChatCreate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2114855172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New chat members were invited to a group.
     */
    public static class PushMessageContentChatAddMembers extends PushMessageContent {
        /**
         * Name of the added member.
         */
        public String memberName;
        /**
         * True, if the current user was added to the group.
         */
        public boolean isCurrentUser;
        /**
         * True, if the user has returned to the group themselves.
         */
        public boolean isReturned;

        /**
         * New chat members were invited to a group.
         */
        public PushMessageContentChatAddMembers() {
        }

        /**
         * New chat members were invited to a group.
         *
         * @param memberName Name of the added member.
         * @param isCurrentUser True, if the current user was added to the group.
         * @param isReturned True, if the user has returned to the group themselves.
         */
        public PushMessageContentChatAddMembers(String memberName, boolean isCurrentUser, boolean isReturned) {
            this.memberName = memberName;
            this.isCurrentUser = isCurrentUser;
            this.isReturned = isReturned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1087145158;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat photo was edited.
     */
    public static class PushMessageContentChatChangePhoto extends PushMessageContent {

        /**
         * A chat photo was edited.
         */
        public PushMessageContentChatChangePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1114222051;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat title was edited.
     */
    public static class PushMessageContentChatChangeTitle extends PushMessageContent {
        /**
         * New chat title.
         */
        public String title;

        /**
         * A chat title was edited.
         */
        public PushMessageContentChatChangeTitle() {
        }

        /**
         * A chat title was edited.
         *
         * @param title New chat title.
         */
        public PushMessageContentChatChangeTitle(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1964902749;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat background was edited.
     */
    public static class PushMessageContentChatSetBackground extends PushMessageContent {
        /**
         * True, if the set background is the same as the background of the current user.
         */
        public boolean isSame;

        /**
         * A chat background was edited.
         */
        public PushMessageContentChatSetBackground() {
        }

        /**
         * A chat background was edited.
         *
         * @param isSame True, if the set background is the same as the background of the current user.
         */
        public PushMessageContentChatSetBackground(boolean isSame) {
            this.isSame = isSame;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1490331933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat theme was edited.
     */
    public static class PushMessageContentChatSetTheme extends PushMessageContent {
        /**
         * If non-empty, name of a new theme, set for the chat. Otherwise, the chat theme was reset to the default one.
         */
        public String themeName;

        /**
         * A chat theme was edited.
         */
        public PushMessageContentChatSetTheme() {
        }

        /**
         * A chat theme was edited.
         *
         * @param themeName If non-empty, name of a new theme, set for the chat. Otherwise, the chat theme was reset to the default one.
         */
        public PushMessageContentChatSetTheme(String themeName) {
            this.themeName = themeName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 173882216;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member was deleted.
     */
    public static class PushMessageContentChatDeleteMember extends PushMessageContent {
        /**
         * Name of the deleted member.
         */
        public String memberName;
        /**
         * True, if the current user was deleted from the group.
         */
        public boolean isCurrentUser;
        /**
         * True, if the user has left the group themselves.
         */
        public boolean isLeft;

        /**
         * A chat member was deleted.
         */
        public PushMessageContentChatDeleteMember() {
        }

        /**
         * A chat member was deleted.
         *
         * @param memberName Name of the deleted member.
         * @param isCurrentUser True, if the current user was deleted from the group.
         * @param isLeft True, if the user has left the group themselves.
         */
        public PushMessageContentChatDeleteMember(String memberName, boolean isCurrentUser, boolean isLeft) {
            this.memberName = memberName;
            this.isCurrentUser = isCurrentUser;
            this.isLeft = isLeft;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 598714783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member joined the chat via an invite link.
     */
    public static class PushMessageContentChatJoinByLink extends PushMessageContent {

        /**
         * A new member joined the chat via an invite link.
         */
        public PushMessageContentChatJoinByLink() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1553719113;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member was accepted to the chat by an administrator.
     */
    public static class PushMessageContentChatJoinByRequest extends PushMessageContent {

        /**
         * A new member was accepted to the chat by an administrator.
         */
        public PushMessageContentChatJoinByRequest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -205823627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new recurring payment was made by the current user.
     */
    public static class PushMessageContentRecurringPayment extends PushMessageContent {
        /**
         * The paid amount.
         */
        public String amount;

        /**
         * A new recurring payment was made by the current user.
         */
        public PushMessageContentRecurringPayment() {
        }

        /**
         * A new recurring payment was made by the current user.
         *
         * @param amount The paid amount.
         */
        public PushMessageContentRecurringPayment(String amount) {
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1619211802;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A profile photo was suggested to the user.
     */
    public static class PushMessageContentSuggestProfilePhoto extends PushMessageContent {

        /**
         * A profile photo was suggested to the user.
         */
        public PushMessageContentSuggestProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2104225963;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forwarded messages.
     */
    public static class PushMessageContentMessageForwards extends PushMessageContent {
        /**
         * Number of forwarded messages.
         */
        public int totalCount;

        /**
         * A forwarded messages.
         */
        public PushMessageContentMessageForwards() {
        }

        /**
         * A forwarded messages.
         *
         * @param totalCount Number of forwarded messages.
         */
        public PushMessageContentMessageForwards(int totalCount) {
            this.totalCount = totalCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1913083876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A media album.
     */
    public static class PushMessageContentMediaAlbum extends PushMessageContent {
        /**
         * Number of messages in the album.
         */
        public int totalCount;
        /**
         * True, if the album has at least one photo.
         */
        public boolean hasPhotos;
        /**
         * True, if the album has at least one video file.
         */
        public boolean hasVideos;
        /**
         * True, if the album has at least one audio file.
         */
        public boolean hasAudios;
        /**
         * True, if the album has at least one document.
         */
        public boolean hasDocuments;

        /**
         * A media album.
         */
        public PushMessageContentMediaAlbum() {
        }

        /**
         * A media album.
         *
         * @param totalCount Number of messages in the album.
         * @param hasPhotos True, if the album has at least one photo.
         * @param hasVideos True, if the album has at least one video file.
         * @param hasAudios True, if the album has at least one audio file.
         * @param hasDocuments True, if the album has at least one document.
         */
        public PushMessageContentMediaAlbum(int totalCount, boolean hasPhotos, boolean hasVideos, boolean hasAudios, boolean hasDocuments) {
            this.totalCount = totalCount;
            this.hasPhotos = hasPhotos;
            this.hasVideos = hasVideos;
            this.hasAudios = hasAudios;
            this.hasDocuments = hasDocuments;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -748426897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a globally unique push receiver identifier, which can be used to identify which account has received a push notification.
     */
    public static class PushReceiverId extends Object {
        /**
         * The globally unique identifier of push notification subscription.
         */
        public long id;

        /**
         * Contains a globally unique push receiver identifier, which can be used to identify which account has received a push notification.
         */
        public PushReceiverId() {
        }

        /**
         * Contains a globally unique push receiver identifier, which can be used to identify which account has received a push notification.
         *
         * @param id The globally unique identifier of push notification subscription.
         */
        public PushReceiverId(long id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 371056428;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a message that can be used for quick reply.
     */
    public static class QuickReplyMessage extends Object {
        /**
         * Unique message identifier among all quick replies.
         */
        public long id;
        /**
         * The sending state of the message; may be null if the message isn't being sent and didn't fail to be sent.
         */
        @Nullable public MessageSendingState sendingState;
        /**
         * True, if the message can be edited.
         */
        public boolean canBeEdited;
        /**
         * The identifier of the quick reply message to which the message replies; 0 if none.
         */
        public long replyToMessageId;
        /**
         * If non-zero, the user identifier of the bot through which this message was sent.
         */
        public long viaBotUserId;
        /**
         * Unique identifier of an album this message belongs to; 0 if none. Only audios, documents, photos and videos can be grouped together in albums.
         */
        public long mediaAlbumId;
        /**
         * Content of the message.
         */
        public MessageContent content;
        /**
         * Inline keyboard reply markup for the message; may be null if none.
         */
        @Nullable public ReplyMarkup replyMarkup;

        /**
         * Describes a message that can be used for quick reply.
         */
        public QuickReplyMessage() {
        }

        /**
         * Describes a message that can be used for quick reply.
         *
         * @param id Unique message identifier among all quick replies.
         * @param sendingState The sending state of the message; may be null if the message isn't being sent and didn't fail to be sent.
         * @param canBeEdited True, if the message can be edited.
         * @param replyToMessageId The identifier of the quick reply message to which the message replies; 0 if none.
         * @param viaBotUserId If non-zero, the user identifier of the bot through which this message was sent.
         * @param mediaAlbumId Unique identifier of an album this message belongs to; 0 if none. Only audios, documents, photos and videos can be grouped together in albums.
         * @param content Content of the message.
         * @param replyMarkup Inline keyboard reply markup for the message; may be null if none.
         */
        public QuickReplyMessage(long id, MessageSendingState sendingState, boolean canBeEdited, long replyToMessageId, long viaBotUserId, long mediaAlbumId, MessageContent content, ReplyMarkup replyMarkup) {
            this.id = id;
            this.sendingState = sendingState;
            this.canBeEdited = canBeEdited;
            this.replyToMessageId = replyToMessageId;
            this.viaBotUserId = viaBotUserId;
            this.mediaAlbumId = mediaAlbumId;
            this.content = content;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1090965757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of quick reply messages.
     */
    public static class QuickReplyMessages extends Object {
        /**
         * List of quick reply messages; messages may be null.
         */
        public QuickReplyMessage[] messages;

        /**
         * Contains a list of quick reply messages.
         */
        public QuickReplyMessages() {
        }

        /**
         * Contains a list of quick reply messages.
         *
         * @param messages List of quick reply messages; messages may be null.
         */
        public QuickReplyMessages(QuickReplyMessage[] messages) {
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 743214375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a shortcut that can be used for a quick reply.
     */
    public static class QuickReplyShortcut extends Object {
        /**
         * Unique shortcut identifier.
         */
        public int id;
        /**
         * The name of the shortcut that can be used to use the shortcut.
         */
        public String name;
        /**
         * The first shortcut message.
         */
        public QuickReplyMessage firstMessage;
        /**
         * The total number of messages in the shortcut.
         */
        public int messageCount;

        /**
         * Describes a shortcut that can be used for a quick reply.
         */
        public QuickReplyShortcut() {
        }

        /**
         * Describes a shortcut that can be used for a quick reply.
         *
         * @param id Unique shortcut identifier.
         * @param name The name of the shortcut that can be used to use the shortcut.
         * @param firstMessage The first shortcut message.
         * @param messageCount The total number of messages in the shortcut.
         */
        public QuickReplyShortcut(int id, String name, QuickReplyMessage firstMessage, int messageCount) {
            this.id = id;
            this.name = name;
            this.firstMessage = firstMessage;
            this.messageCount = messageCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1107453291;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about notification settings for reactions.
     */
    public static class ReactionNotificationSettings extends Object {
        /**
         * Source of message reactions for which notifications are shown.
         */
        public ReactionNotificationSource messageReactionSource;
        /**
         * Source of story reactions for which notifications are shown.
         */
        public ReactionNotificationSource storyReactionSource;
        /**
         * Identifier of the notification sound to be played; 0 if sound is disabled.
         */
        public long soundId;
        /**
         * True, if reaction sender and emoji must be displayed in notifications.
         */
        public boolean showPreview;

        /**
         * Contains information about notification settings for reactions.
         */
        public ReactionNotificationSettings() {
        }

        /**
         * Contains information about notification settings for reactions.
         *
         * @param messageReactionSource Source of message reactions for which notifications are shown.
         * @param storyReactionSource Source of story reactions for which notifications are shown.
         * @param soundId Identifier of the notification sound to be played; 0 if sound is disabled.
         * @param showPreview True, if reaction sender and emoji must be displayed in notifications.
         */
        public ReactionNotificationSettings(ReactionNotificationSource messageReactionSource, ReactionNotificationSource storyReactionSource, long soundId, boolean showPreview) {
            this.messageReactionSource = messageReactionSource;
            this.storyReactionSource = storyReactionSource;
            this.soundId = soundId;
            this.showPreview = showPreview;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 733017684;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes sources of reactions for which notifications will be shown.
     */
    public abstract static class ReactionNotificationSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReactionNotificationSourceNone.CONSTRUCTOR,
            ReactionNotificationSourceContacts.CONSTRUCTOR,
            ReactionNotificationSourceAll.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReactionNotificationSource() {
        }
    }

    /**
     * Notifications for reactions are disabled.
     */
    public static class ReactionNotificationSourceNone extends ReactionNotificationSource {

        /**
         * Notifications for reactions are disabled.
         */
        public ReactionNotificationSourceNone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 366374940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notifications for reactions are shown only for reactions from contacts.
     */
    public static class ReactionNotificationSourceContacts extends ReactionNotificationSource {

        /**
         * Notifications for reactions are shown only for reactions from contacts.
         */
        public ReactionNotificationSourceContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 555501621;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notifications for reactions are shown for all reactions.
     */
    public static class ReactionNotificationSourceAll extends ReactionNotificationSource {

        /**
         * Notifications for reactions are shown for all reactions.
         */
        public ReactionNotificationSourceAll() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1241689234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of message reaction.
     */
    public abstract static class ReactionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReactionTypeEmoji.CONSTRUCTOR,
            ReactionTypeCustomEmoji.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReactionType() {
        }
    }

    /**
     * A reaction with an emoji.
     */
    public static class ReactionTypeEmoji extends ReactionType {
        /**
         * Text representation of the reaction.
         */
        public String emoji;

        /**
         * A reaction with an emoji.
         */
        public ReactionTypeEmoji() {
        }

        /**
         * A reaction with an emoji.
         *
         * @param emoji Text representation of the reaction.
         */
        public ReactionTypeEmoji(String emoji) {
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1942084920;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A reaction with a custom emoji.
     */
    public static class ReactionTypeCustomEmoji extends ReactionType {
        /**
         * Unique identifier of the custom emoji.
         */
        public long customEmojiId;

        /**
         * A reaction with a custom emoji.
         */
        public ReactionTypeCustomEmoji() {
        }

        /**
         * A reaction with a custom emoji.
         *
         * @param customEmojiId Unique identifier of the custom emoji.
         */
        public ReactionTypeCustomEmoji(long customEmojiId) {
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -989117709;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes why the current user can't add reactions to the message, despite some other users can.
     */
    public abstract static class ReactionUnavailabilityReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReactionUnavailabilityReasonAnonymousAdministrator.CONSTRUCTOR,
            ReactionUnavailabilityReasonGuest.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReactionUnavailabilityReason() {
        }
    }

    /**
     * The user is an anonymous administrator in the supergroup, but isn't a creator of it, so they can't vote on behalf of the supergroup.
     */
    public static class ReactionUnavailabilityReasonAnonymousAdministrator extends ReactionUnavailabilityReason {

        /**
         * The user is an anonymous administrator in the supergroup, but isn't a creator of it, so they can't vote on behalf of the supergroup.
         */
        public ReactionUnavailabilityReasonAnonymousAdministrator() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -499612677;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user isn't a member of the supergroup and can't send messages and reactions there without joining.
     */
    public static class ReactionUnavailabilityReasonGuest extends ReactionUnavailabilityReason {

        /**
         * The user isn't a member of the supergroup and can't send messages and reactions there without joining.
         */
        public ReactionUnavailabilityReasonGuest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1357861444;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains privacy settings for message read date in private chats. Read dates are always shown to the users that can see online status of the current user regardless of this setting.
     */
    public static class ReadDatePrivacySettings extends Object {
        /**
         * True, if message read date is shown to other users in private chats. If false and the current user isn't a Telegram Premium user, then they will not be able to see other's message read date.
         */
        public boolean showReadDate;

        /**
         * Contains privacy settings for message read date in private chats. Read dates are always shown to the users that can see online status of the current user regardless of this setting.
         */
        public ReadDatePrivacySettings() {
        }

        /**
         * Contains privacy settings for message read date in private chats. Read dates are always shown to the users that can see online status of the current user regardless of this setting.
         *
         * @param showReadDate True, if message read date is shown to other users in private chats. If false and the current user isn't a Telegram Premium user, then they will not be able to see other's message read date.
         */
        public ReadDatePrivacySettings(boolean showReadDate) {
            this.showReadDate = showReadDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1654842920;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a recommended chat folder.
     */
    public static class RecommendedChatFolder extends Object {
        /**
         * The chat folder.
         */
        public ChatFolder folder;
        /**
         * Chat folder description.
         */
        public String description;

        /**
         * Describes a recommended chat folder.
         */
        public RecommendedChatFolder() {
        }

        /**
         * Describes a recommended chat folder.
         *
         * @param folder The chat folder.
         * @param description Chat folder description.
         */
        public RecommendedChatFolder(ChatFolder folder, String description) {
            this.folder = folder;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2116569930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of recommended chat folders.
     */
    public static class RecommendedChatFolders extends Object {
        /**
         * List of recommended chat folders.
         */
        public RecommendedChatFolder[] chatFolders;

        /**
         * Contains a list of recommended chat folders.
         */
        public RecommendedChatFolders() {
        }

        /**
         * Contains a list of recommended chat folders.
         *
         * @param chatFolders List of recommended chat folders.
         */
        public RecommendedChatFolders(RecommendedChatFolder[] chatFolders) {
            this.chatFolders = chatFolders;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -739217656;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the current recovery email address.
     */
    public static class RecoveryEmailAddress extends Object {
        /**
         * Recovery email address.
         */
        public String recoveryEmailAddress;

        /**
         * Contains information about the current recovery email address.
         */
        public RecoveryEmailAddress() {
        }

        /**
         * Contains information about the current recovery email address.
         *
         * @param recoveryEmailAddress Recovery email address.
         */
        public RecoveryEmailAddress(String recoveryEmailAddress) {
            this.recoveryEmailAddress = recoveryEmailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1290526187;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a remote file.
     */
    public static class RemoteFile extends Object {
        /**
         * Remote file identifier; may be empty. Can be used by the current user across application restarts or even from other devices. Uniquely identifies a file, but a file can have a lot of different valid identifiers. If the identifier starts with &quot;http://&quot; or &quot;https://&quot;, it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known. If downloadFile/addFileToDownloads is called on such a file or if it is sent to a secret chat, TDLib starts a file generation process by sending updateFileGenerationStart to the application with the HTTP URL in the originalPath and &quot;#url#&quot; as the conversion string. Application must generate the file by downloading it to the specified location.
         */
        public String id;
        /**
         * Unique file identifier; may be empty if unknown. The unique file identifier which is the same for the same file even for different users and is persistent over time.
         */
        public String uniqueId;
        /**
         * True, if the file is currently being uploaded (or a remote copy is being generated by some other means).
         */
        public boolean isUploadingActive;
        /**
         * True, if a remote copy is fully available.
         */
        public boolean isUploadingCompleted;
        /**
         * Size of the remote available part of the file, in bytes; 0 if unknown.
         */
        public long uploadedSize;

        /**
         * Represents a remote file.
         */
        public RemoteFile() {
        }

        /**
         * Represents a remote file.
         *
         * @param id Remote file identifier; may be empty. Can be used by the current user across application restarts or even from other devices. Uniquely identifies a file, but a file can have a lot of different valid identifiers. If the identifier starts with &quot;http://&quot; or &quot;https://&quot;, it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known. If downloadFile/addFileToDownloads is called on such a file or if it is sent to a secret chat, TDLib starts a file generation process by sending updateFileGenerationStart to the application with the HTTP URL in the originalPath and &quot;#url#&quot; as the conversion string. Application must generate the file by downloading it to the specified location.
         * @param uniqueId Unique file identifier; may be empty if unknown. The unique file identifier which is the same for the same file even for different users and is persistent over time.
         * @param isUploadingActive True, if the file is currently being uploaded (or a remote copy is being generated by some other means).
         * @param isUploadingCompleted True, if a remote copy is fully available.
         * @param uploadedSize Size of the remote available part of the file, in bytes; 0 if unknown.
         */
        public RemoteFile(String id, String uniqueId, boolean isUploadingActive, boolean isUploadingCompleted, long uploadedSize) {
            this.id = id;
            this.uniqueId = uniqueId;
            this.isUploadingActive = isUploadingActive;
            this.isUploadingCompleted = isUploadingCompleted;
            this.uploadedSize = uploadedSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 747731030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains a description of a custom keyboard and actions that can be done with it to quickly reply to bots.
     */
    public abstract static class ReplyMarkup extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReplyMarkupRemoveKeyboard.CONSTRUCTOR,
            ReplyMarkupForceReply.CONSTRUCTOR,
            ReplyMarkupShowKeyboard.CONSTRUCTOR,
            ReplyMarkupInlineKeyboard.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReplyMarkup() {
        }
    }

    /**
     * Instructs application to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, updateChatReplyMarkup with messageId == 0 will be sent.
     */
    public static class ReplyMarkupRemoveKeyboard extends ReplyMarkup {
        /**
         * True, if the keyboard is removed only for the mentioned users or the target user of a reply.
         */
        public boolean isPersonal;

        /**
         * Instructs application to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, updateChatReplyMarkup with messageId == 0 will be sent.
         */
        public ReplyMarkupRemoveKeyboard() {
        }

        /**
         * Instructs application to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, updateChatReplyMarkup with messageId == 0 will be sent.
         *
         * @param isPersonal True, if the keyboard is removed only for the mentioned users or the target user of a reply.
         */
        public ReplyMarkupRemoveKeyboard(boolean isPersonal) {
            this.isPersonal = isPersonal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -691252879;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Instructs application to force a reply to this message.
     */
    public static class ReplyMarkupForceReply extends ReplyMarkup {
        /**
         * True, if a forced reply must automatically be shown to the current user. For outgoing messages, specify true to show the forced reply only for the mentioned users and for the target user of a reply.
         */
        public boolean isPersonal;
        /**
         * If non-empty, the placeholder to be shown in the input field when the reply is active; 0-64 characters.
         */
        public String inputFieldPlaceholder;

        /**
         * Instructs application to force a reply to this message.
         */
        public ReplyMarkupForceReply() {
        }

        /**
         * Instructs application to force a reply to this message.
         *
         * @param isPersonal True, if a forced reply must automatically be shown to the current user. For outgoing messages, specify true to show the forced reply only for the mentioned users and for the target user of a reply.
         * @param inputFieldPlaceholder If non-empty, the placeholder to be shown in the input field when the reply is active; 0-64 characters.
         */
        public ReplyMarkupForceReply(boolean isPersonal, String inputFieldPlaceholder) {
            this.isPersonal = isPersonal;
            this.inputFieldPlaceholder = inputFieldPlaceholder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1101461919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a custom keyboard layout to quickly reply to bots.
     */
    public static class ReplyMarkupShowKeyboard extends ReplyMarkup {
        /**
         * A list of rows of bot keyboard buttons.
         */
        public KeyboardButton[][] rows;
        /**
         * True, if the keyboard is supposed to always be shown when the ordinary keyboard is hidden.
         */
        public boolean isPersistent;
        /**
         * True, if the application needs to resize the keyboard vertically.
         */
        public boolean resizeKeyboard;
        /**
         * True, if the application needs to hide the keyboard after use.
         */
        public boolean oneTime;
        /**
         * True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply.
         */
        public boolean isPersonal;
        /**
         * If non-empty, the placeholder to be shown in the input field when the keyboard is active; 0-64 characters.
         */
        public String inputFieldPlaceholder;

        /**
         * Contains a custom keyboard layout to quickly reply to bots.
         */
        public ReplyMarkupShowKeyboard() {
        }

        /**
         * Contains a custom keyboard layout to quickly reply to bots.
         *
         * @param rows A list of rows of bot keyboard buttons.
         * @param isPersistent True, if the keyboard is supposed to always be shown when the ordinary keyboard is hidden.
         * @param resizeKeyboard True, if the application needs to resize the keyboard vertically.
         * @param oneTime True, if the application needs to hide the keyboard after use.
         * @param isPersonal True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply.
         * @param inputFieldPlaceholder If non-empty, the placeholder to be shown in the input field when the keyboard is active; 0-64 characters.
         */
        public ReplyMarkupShowKeyboard(KeyboardButton[][] rows, boolean isPersistent, boolean resizeKeyboard, boolean oneTime, boolean isPersonal, String inputFieldPlaceholder) {
            this.rows = rows;
            this.isPersistent = isPersistent;
            this.resizeKeyboard = resizeKeyboard;
            this.oneTime = oneTime;
            this.isPersonal = isPersonal;
            this.inputFieldPlaceholder = inputFieldPlaceholder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -791495984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an inline keyboard layout.
     */
    public static class ReplyMarkupInlineKeyboard extends ReplyMarkup {
        /**
         * A list of rows of inline keyboard buttons.
         */
        public InlineKeyboardButton[][] rows;

        /**
         * Contains an inline keyboard layout.
         */
        public ReplyMarkupInlineKeyboard() {
        }

        /**
         * Contains an inline keyboard layout.
         *
         * @param rows A list of rows of inline keyboard buttons.
         */
        public ReplyMarkupInlineKeyboard(InlineKeyboardButton[][] rows) {
            this.rows = rows;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -619317658;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option to report a sponsored message.
     */
    public static class ReportChatSponsoredMessageOption extends Object {
        /**
         * Unique identifier of the option.
         */
        public byte[] id;
        /**
         * Text of the option.
         */
        public String text;

        /**
         * Describes an option to report a sponsored message.
         */
        public ReportChatSponsoredMessageOption() {
        }

        /**
         * Describes an option to report a sponsored message.
         *
         * @param id Unique identifier of the option.
         * @param text Text of the option.
         */
        public ReportChatSponsoredMessageOption(byte[] id, String text) {
            this.id = id;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1430452918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of sponsored message report.
     */
    public abstract static class ReportChatSponsoredMessageResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReportChatSponsoredMessageResultOk.CONSTRUCTOR,
            ReportChatSponsoredMessageResultFailed.CONSTRUCTOR,
            ReportChatSponsoredMessageResultOptionRequired.CONSTRUCTOR,
            ReportChatSponsoredMessageResultAdsHidden.CONSTRUCTOR,
            ReportChatSponsoredMessageResultPremiumRequired.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReportChatSponsoredMessageResult() {
        }
    }

    /**
     * The message was reported successfully.
     */
    public static class ReportChatSponsoredMessageResultOk extends ReportChatSponsoredMessageResult {

        /**
         * The message was reported successfully.
         */
        public ReportChatSponsoredMessageResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1968140831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sponsored message is too old or not found.
     */
    public static class ReportChatSponsoredMessageResultFailed extends ReportChatSponsoredMessageResult {

        /**
         * The sponsored message is too old or not found.
         */
        public ReportChatSponsoredMessageResultFailed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2132777926;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must choose an option to report the message and repeat request with the chosen option.
     */
    public static class ReportChatSponsoredMessageResultOptionRequired extends ReportChatSponsoredMessageResult {
        /**
         * Title for the option choice.
         */
        public String title;
        /**
         * List of available options.
         */
        public ReportChatSponsoredMessageOption[] options;

        /**
         * The user must choose an option to report the message and repeat request with the chosen option.
         */
        public ReportChatSponsoredMessageResultOptionRequired() {
        }

        /**
         * The user must choose an option to report the message and repeat request with the chosen option.
         *
         * @param title Title for the option choice.
         * @param options List of available options.
         */
        public ReportChatSponsoredMessageResultOptionRequired(String title, ReportChatSponsoredMessageOption[] options) {
            this.title = title;
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1838690321;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sponsored messages were hidden for the user in all chats.
     */
    public static class ReportChatSponsoredMessageResultAdsHidden extends ReportChatSponsoredMessageResult {

        /**
         * Sponsored messages were hidden for the user in all chats.
         */
        public ReportChatSponsoredMessageResultAdsHidden() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -387260898;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user asked to hide sponsored messages, but Telegram Premium is required for this.
     */
    public static class ReportChatSponsoredMessageResultPremiumRequired extends ReportChatSponsoredMessageResult {

        /**
         * The user asked to hide sponsored messages, but Telegram Premium is required for this.
         */
        public ReportChatSponsoredMessageResultPremiumRequired() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1997287120;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the reason why a chat is reported.
     */
    public abstract static class ReportReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReportReasonSpam.CONSTRUCTOR,
            ReportReasonViolence.CONSTRUCTOR,
            ReportReasonPornography.CONSTRUCTOR,
            ReportReasonChildAbuse.CONSTRUCTOR,
            ReportReasonCopyright.CONSTRUCTOR,
            ReportReasonUnrelatedLocation.CONSTRUCTOR,
            ReportReasonFake.CONSTRUCTOR,
            ReportReasonIllegalDrugs.CONSTRUCTOR,
            ReportReasonPersonalDetails.CONSTRUCTOR,
            ReportReasonCustom.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReportReason() {
        }
    }

    /**
     * The chat contains spam messages.
     */
    public static class ReportReasonSpam extends ReportReason {

        /**
         * The chat contains spam messages.
         */
        public ReportReasonSpam() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1207032897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat promotes violence.
     */
    public static class ReportReasonViolence extends ReportReason {

        /**
         * The chat promotes violence.
         */
        public ReportReasonViolence() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2038679353;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat contains pornographic messages.
     */
    public static class ReportReasonPornography extends ReportReason {

        /**
         * The chat contains pornographic messages.
         */
        public ReportReasonPornography() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1306467575;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat has child abuse related content.
     */
    public static class ReportReasonChildAbuse extends ReportReason {

        /**
         * The chat has child abuse related content.
         */
        public ReportReasonChildAbuse() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 761086718;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat contains copyrighted content.
     */
    public static class ReportReasonCopyright extends ReportReason {

        /**
         * The chat contains copyrighted content.
         */
        public ReportReasonCopyright() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1474441135;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The location-based chat is unrelated to its stated location.
     */
    public static class ReportReasonUnrelatedLocation extends ReportReason {

        /**
         * The location-based chat is unrelated to its stated location.
         */
        public ReportReasonUnrelatedLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 87562288;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat represents a fake account.
     */
    public static class ReportReasonFake extends ReportReason {

        /**
         * The chat represents a fake account.
         */
        public ReportReasonFake() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 352862176;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat has illegal drugs related content.
     */
    public static class ReportReasonIllegalDrugs extends ReportReason {

        /**
         * The chat has illegal drugs related content.
         */
        public ReportReasonIllegalDrugs() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -61599200;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat contains messages with personal details.
     */
    public static class ReportReasonPersonalDetails extends ReportReason {

        /**
         * The chat contains messages with personal details.
         */
        public ReportReasonPersonalDetails() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1588882414;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A custom reason provided by the user.
     */
    public static class ReportReasonCustom extends ReportReason {

        /**
         * A custom reason provided by the user.
         */
        public ReportReasonCustom() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1380459917;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the reason why a code needs to be re-sent.
     */
    public abstract static class ResendCodeReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ResendCodeReasonUserRequest.CONSTRUCTOR,
            ResendCodeReasonVerificationFailed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ResendCodeReason() {
        }
    }

    /**
     * The user requested to resend the code.
     */
    public static class ResendCodeReasonUserRequest extends ResendCodeReason {

        /**
         * The user requested to resend the code.
         */
        public ResendCodeReasonUserRequest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -441923456;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The code is re-sent, because device verification has failed.
     */
    public static class ResendCodeReasonVerificationFailed extends ResendCodeReason {
        /**
         * Cause of the verification failure, for example, PLAYSERVICESNOTAVAILABLE, APNSRECEIVETIMEOUT, or APNSINITFAILED.
         */
        public String errorMessage;

        /**
         * The code is re-sent, because device verification has failed.
         */
        public ResendCodeReasonVerificationFailed() {
        }

        /**
         * The code is re-sent, because device verification has failed.
         *
         * @param errorMessage Cause of the verification failure, for example, PLAYSERVICESNOTAVAILABLE, APNSRECEIVETIMEOUT, or APNSINITFAILED.
         */
        public ResendCodeReasonVerificationFailed(String errorMessage) {
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 529870273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of 2-step verification password reset.
     */
    public abstract static class ResetPasswordResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ResetPasswordResultOk.CONSTRUCTOR,
            ResetPasswordResultPending.CONSTRUCTOR,
            ResetPasswordResultDeclined.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ResetPasswordResult() {
        }
    }

    /**
     * The password was reset.
     */
    public static class ResetPasswordResultOk extends ResetPasswordResult {

        /**
         * The password was reset.
         */
        public ResetPasswordResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1397267463;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The password reset request is pending.
     */
    public static class ResetPasswordResultPending extends ResetPasswordResult {
        /**
         * Point in time (Unix timestamp) after which the password can be reset immediately using resetPassword.
         */
        public int pendingResetDate;

        /**
         * The password reset request is pending.
         */
        public ResetPasswordResultPending() {
        }

        /**
         * The password reset request is pending.
         *
         * @param pendingResetDate Point in time (Unix timestamp) after which the password can be reset immediately using resetPassword.
         */
        public ResetPasswordResultPending(int pendingResetDate) {
            this.pendingResetDate = pendingResetDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1193925721;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The password reset request was declined.
     */
    public static class ResetPasswordResultDeclined extends ResetPasswordResult {
        /**
         * Point in time (Unix timestamp) when the password reset can be retried.
         */
        public int retryDate;

        /**
         * The password reset request was declined.
         */
        public ResetPasswordResultDeclined() {
        }

        /**
         * The password reset request was declined.
         *
         * @param retryDate Point in time (Unix timestamp) when the password reset can be retried.
         */
        public ResetPasswordResultDeclined(int retryDate) {
            this.retryDate = retryDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1202200373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes state of a revenue withdrawal.
     */
    public abstract static class RevenueWithdrawalState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            RevenueWithdrawalStatePending.CONSTRUCTOR,
            RevenueWithdrawalStateSucceeded.CONSTRUCTOR,
            RevenueWithdrawalStateFailed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public RevenueWithdrawalState() {
        }
    }

    /**
     * Withdrawal is pending.
     */
    public static class RevenueWithdrawalStatePending extends RevenueWithdrawalState {

        /**
         * Withdrawal is pending.
         */
        public RevenueWithdrawalStatePending() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1563512741;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Withdrawal succeeded.
     */
    public static class RevenueWithdrawalStateSucceeded extends RevenueWithdrawalState {
        /**
         * Point in time (Unix timestamp) when the withdrawal was completed.
         */
        public int date;
        /**
         * The URL where the withdrawal transaction can be viewed.
         */
        public String url;

        /**
         * Withdrawal succeeded.
         */
        public RevenueWithdrawalStateSucceeded() {
        }

        /**
         * Withdrawal succeeded.
         *
         * @param date Point in time (Unix timestamp) when the withdrawal was completed.
         * @param url The URL where the withdrawal transaction can be viewed.
         */
        public RevenueWithdrawalStateSucceeded(int date, String url) {
            this.date = date;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 265375242;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Withdrawal failed.
     */
    public static class RevenueWithdrawalStateFailed extends RevenueWithdrawalState {

        /**
         * Withdrawal failed.
         */
        public RevenueWithdrawalStateFailed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -12504951;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a formatted text object.
     */
    public abstract static class RichText extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            RichTextPlain.CONSTRUCTOR,
            RichTextBold.CONSTRUCTOR,
            RichTextItalic.CONSTRUCTOR,
            RichTextUnderline.CONSTRUCTOR,
            RichTextStrikethrough.CONSTRUCTOR,
            RichTextFixed.CONSTRUCTOR,
            RichTextUrl.CONSTRUCTOR,
            RichTextEmailAddress.CONSTRUCTOR,
            RichTextSubscript.CONSTRUCTOR,
            RichTextSuperscript.CONSTRUCTOR,
            RichTextMarked.CONSTRUCTOR,
            RichTextPhoneNumber.CONSTRUCTOR,
            RichTextIcon.CONSTRUCTOR,
            RichTextReference.CONSTRUCTOR,
            RichTextAnchor.CONSTRUCTOR,
            RichTextAnchorLink.CONSTRUCTOR,
            RichTexts.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public RichText() {
        }
    }

    /**
     * A plain text.
     */
    public static class RichTextPlain extends RichText {
        /**
         * Text.
         */
        public String text;

        /**
         * A plain text.
         */
        public RichTextPlain() {
        }

        /**
         * A plain text.
         *
         * @param text Text.
         */
        public RichTextPlain(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 482617702;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bold rich text.
     */
    public static class RichTextBold extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A bold rich text.
         */
        public RichTextBold() {
        }

        /**
         * A bold rich text.
         *
         * @param text Text.
         */
        public RichTextBold(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1670844268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An italicized rich text.
     */
    public static class RichTextItalic extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * An italicized rich text.
         */
        public RichTextItalic() {
        }

        /**
         * An italicized rich text.
         *
         * @param text Text.
         */
        public RichTextItalic(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1853354047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An underlined rich text.
     */
    public static class RichTextUnderline extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * An underlined rich text.
         */
        public RichTextUnderline() {
        }

        /**
         * An underlined rich text.
         *
         * @param text Text.
         */
        public RichTextUnderline(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -536019572;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A strikethrough rich text.
     */
    public static class RichTextStrikethrough extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A strikethrough rich text.
         */
        public RichTextStrikethrough() {
        }

        /**
         * A strikethrough rich text.
         *
         * @param text Text.
         */
        public RichTextStrikethrough(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 723413585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A fixed-width rich text.
     */
    public static class RichTextFixed extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A fixed-width rich text.
         */
        public RichTextFixed() {
        }

        /**
         * A fixed-width rich text.
         *
         * @param text Text.
         */
        public RichTextFixed(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1271496249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rich text URL link.
     */
    public static class RichTextUrl extends RichText {
        /**
         * Text.
         */
        public RichText text;
        /**
         * URL.
         */
        public String url;
        /**
         * True, if the URL has cached instant view server-side.
         */
        public boolean isCached;

        /**
         * A rich text URL link.
         */
        public RichTextUrl() {
        }

        /**
         * A rich text URL link.
         *
         * @param text Text.
         * @param url URL.
         * @param isCached True, if the URL has cached instant view server-side.
         */
        public RichTextUrl(RichText text, String url, boolean isCached) {
            this.text = text;
            this.url = url;
            this.isCached = isCached;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 83939092;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rich text email link.
     */
    public static class RichTextEmailAddress extends RichText {
        /**
         * Text.
         */
        public RichText text;
        /**
         * Email address.
         */
        public String emailAddress;

        /**
         * A rich text email link.
         */
        public RichTextEmailAddress() {
        }

        /**
         * A rich text email link.
         *
         * @param text Text.
         * @param emailAddress Email address.
         */
        public RichTextEmailAddress(RichText text, String emailAddress) {
            this.text = text;
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 40018679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A subscript rich text.
     */
    public static class RichTextSubscript extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A subscript rich text.
         */
        public RichTextSubscript() {
        }

        /**
         * A subscript rich text.
         *
         * @param text Text.
         */
        public RichTextSubscript(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -868197812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A superscript rich text.
     */
    public static class RichTextSuperscript extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A superscript rich text.
         */
        public RichTextSuperscript() {
        }

        /**
         * A superscript rich text.
         *
         * @param text Text.
         */
        public RichTextSuperscript(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -382241437;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A marked rich text.
     */
    public static class RichTextMarked extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A marked rich text.
         */
        public RichTextMarked() {
        }

        /**
         * A marked rich text.
         *
         * @param text Text.
         */
        public RichTextMarked(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1271999614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rich text phone number.
     */
    public static class RichTextPhoneNumber extends RichText {
        /**
         * Text.
         */
        public RichText text;
        /**
         * Phone number.
         */
        public String phoneNumber;

        /**
         * A rich text phone number.
         */
        public RichTextPhoneNumber() {
        }

        /**
         * A rich text phone number.
         *
         * @param text Text.
         * @param phoneNumber Phone number.
         */
        public RichTextPhoneNumber(RichText text, String phoneNumber) {
            this.text = text;
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 128521539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A small image inside the text.
     */
    public static class RichTextIcon extends RichText {
        /**
         * The image represented as a document. The image can be in GIF, JPEG or PNG format.
         */
        public Document document;
        /**
         * Width of a bounding box in which the image must be shown; 0 if unknown.
         */
        public int width;
        /**
         * Height of a bounding box in which the image must be shown; 0 if unknown.
         */
        public int height;

        /**
         * A small image inside the text.
         */
        public RichTextIcon() {
        }

        /**
         * A small image inside the text.
         *
         * @param document The image represented as a document. The image can be in GIF, JPEG or PNG format.
         * @param width Width of a bounding box in which the image must be shown; 0 if unknown.
         * @param height Height of a bounding box in which the image must be shown; 0 if unknown.
         */
        public RichTextIcon(Document document, int width, int height) {
            this.document = document;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1480316158;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A reference to a richTexts object on the same page.
     */
    public static class RichTextReference extends RichText {
        /**
         * The text.
         */
        public RichText text;
        /**
         * The name of a richTextAnchor object, which is the first element of the target richTexts object.
         */
        public String anchorName;
        /**
         * An HTTP URL, opening the reference.
         */
        public String url;

        /**
         * A reference to a richTexts object on the same page.
         */
        public RichTextReference() {
        }

        /**
         * A reference to a richTexts object on the same page.
         *
         * @param text The text.
         * @param anchorName The name of a richTextAnchor object, which is the first element of the target richTexts object.
         * @param url An HTTP URL, opening the reference.
         */
        public RichTextReference(RichText text, String anchorName, String url) {
            this.text = text;
            this.anchorName = anchorName;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1147530634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An anchor.
     */
    public static class RichTextAnchor extends RichText {
        /**
         * Anchor name.
         */
        public String name;

        /**
         * An anchor.
         */
        public RichTextAnchor() {
        }

        /**
         * An anchor.
         *
         * @param name Anchor name.
         */
        public RichTextAnchor(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1316950068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A link to an anchor on the same page.
     */
    public static class RichTextAnchorLink extends RichText {
        /**
         * The link text.
         */
        public RichText text;
        /**
         * The anchor name. If the name is empty, the link must bring back to top.
         */
        public String anchorName;
        /**
         * An HTTP URL, opening the anchor.
         */
        public String url;

        /**
         * A link to an anchor on the same page.
         */
        public RichTextAnchorLink() {
        }

        /**
         * A link to an anchor on the same page.
         *
         * @param text The link text.
         * @param anchorName The anchor name. If the name is empty, the link must bring back to top.
         * @param url An HTTP URL, opening the anchor.
         */
        public RichTextAnchorLink(RichText text, String anchorName, String url) {
            this.text = text;
            this.anchorName = anchorName;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1541418282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A concatenation of rich texts.
     */
    public static class RichTexts extends RichText {
        /**
         * Texts.
         */
        public RichText[] texts;

        /**
         * A concatenation of rich texts.
         */
        public RichTexts() {
        }

        /**
         * A concatenation of rich texts.
         *
         * @param texts Texts.
         */
        public RichTexts(RichText[] texts) {
            this.texts = texts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1647457821;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an RTMP URL.
     */
    public static class RtmpUrl extends Object {
        /**
         * The URL.
         */
        public String url;
        /**
         * Stream key.
         */
        public String streamKey;

        /**
         * Represents an RTMP URL.
         */
        public RtmpUrl() {
        }

        /**
         * Represents an RTMP URL.
         *
         * @param url The URL.
         * @param streamKey Stream key.
         */
        public RtmpUrl(String url, String streamKey) {
            this.url = url;
            this.streamKey = streamKey;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1009302613;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about saved payment credentials.
     */
    public static class SavedCredentials extends Object {
        /**
         * Unique identifier of the saved credentials.
         */
        public String id;
        /**
         * Title of the saved credentials.
         */
        public String title;

        /**
         * Contains information about saved payment credentials.
         */
        public SavedCredentials() {
        }

        /**
         * Contains information about saved payment credentials.
         *
         * @param id Unique identifier of the saved credentials.
         * @param title Title of the saved credentials.
         */
        public SavedCredentials(String id, String title) {
            this.id = id;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -370273060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a tag used in Saved Messages or a Saved Messages topic.
     */
    public static class SavedMessagesTag extends Object {
        /**
         * The tag.
         */
        public ReactionType tag;
        /**
         * Label of the tag; 0-12 characters. Always empty if the tag is returned for a Saved Messages topic.
         */
        public String label;
        /**
         * Number of times the tag was used; may be 0 if the tag has non-empty label.
         */
        public int count;

        /**
         * Represents a tag used in Saved Messages or a Saved Messages topic.
         */
        public SavedMessagesTag() {
        }

        /**
         * Represents a tag used in Saved Messages or a Saved Messages topic.
         *
         * @param tag The tag.
         * @param label Label of the tag; 0-12 characters. Always empty if the tag is returned for a Saved Messages topic.
         * @param count Number of times the tag was used; may be 0 if the tag has non-empty label.
         */
        public SavedMessagesTag(ReactionType tag, String label, int count) {
            this.tag = tag;
            this.label = label;
            this.count = count;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1785183329;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of tags used in Saved Messages.
     */
    public static class SavedMessagesTags extends Object {
        /**
         * List of tags.
         */
        public SavedMessagesTag[] tags;

        /**
         * Contains a list of tags used in Saved Messages.
         */
        public SavedMessagesTags() {
        }

        /**
         * Contains a list of tags used in Saved Messages.
         *
         * @param tags List of tags.
         */
        public SavedMessagesTags(SavedMessagesTag[] tags) {
            this.tags = tags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1749291430;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Saved Messages topic.
     */
    public static class SavedMessagesTopic extends Object {
        /**
         * Unique topic identifier.
         */
        public long id;
        /**
         * Type of the topic.
         */
        public SavedMessagesTopicType type;
        /**
         * True, if the topic is pinned.
         */
        public boolean isPinned;
        /**
         * A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order.
         */
        public long order;
        /**
         * Last message in the topic; may be null if none or unknown.
         */
        @Nullable public Message lastMessage;
        /**
         * A draft of a message in the topic; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;

        /**
         * Contains information about a Saved Messages topic.
         */
        public SavedMessagesTopic() {
        }

        /**
         * Contains information about a Saved Messages topic.
         *
         * @param id Unique topic identifier.
         * @param type Type of the topic.
         * @param isPinned True, if the topic is pinned.
         * @param order A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order.
         * @param lastMessage Last message in the topic; may be null if none or unknown.
         * @param draftMessage A draft of a message in the topic; may be null if none.
         */
        public SavedMessagesTopic(long id, SavedMessagesTopicType type, boolean isPinned, long order, Message lastMessage, DraftMessage draftMessage) {
            this.id = id;
            this.type = type;
            this.isPinned = isPinned;
            this.order = order;
            this.lastMessage = lastMessage;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -760684124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of Saved Messages topic.
     */
    public abstract static class SavedMessagesTopicType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SavedMessagesTopicTypeMyNotes.CONSTRUCTOR,
            SavedMessagesTopicTypeAuthorHidden.CONSTRUCTOR,
            SavedMessagesTopicTypeSavedFromChat.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SavedMessagesTopicType() {
        }
    }

    /**
     * Topic containing messages sent by the current user of forwarded from an unknown chat.
     */
    public static class SavedMessagesTopicTypeMyNotes extends SavedMessagesTopicType {

        /**
         * Topic containing messages sent by the current user of forwarded from an unknown chat.
         */
        public SavedMessagesTopicTypeMyNotes() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1282784779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Topic containing messages forwarded from a user with hidden privacy.
     */
    public static class SavedMessagesTopicTypeAuthorHidden extends SavedMessagesTopicType {

        /**
         * Topic containing messages forwarded from a user with hidden privacy.
         */
        public SavedMessagesTopicTypeAuthorHidden() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1882997141;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Topic containing messages forwarded from a specific chat.
     */
    public static class SavedMessagesTopicTypeSavedFromChat extends SavedMessagesTopicType {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Topic containing messages forwarded from a specific chat.
         */
        public SavedMessagesTopicTypeSavedFromChat() {
        }

        /**
         * Topic containing messages forwarded from a specific chat.
         *
         * @param chatId Identifier of the chat.
         */
        public SavedMessagesTopicTypeSavedFromChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1723880104;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains autosave settings for an autosave settings scope.
     */
    public static class ScopeAutosaveSettings extends Object {
        /**
         * True, if photo autosave is enabled.
         */
        public boolean autosavePhotos;
        /**
         * True, if video autosave is enabled.
         */
        public boolean autosaveVideos;
        /**
         * The maximum size of a video file to be autosaved, in bytes; 512 KB - 4000 MB.
         */
        public long maxVideoFileSize;

        /**
         * Contains autosave settings for an autosave settings scope.
         */
        public ScopeAutosaveSettings() {
        }

        /**
         * Contains autosave settings for an autosave settings scope.
         *
         * @param autosavePhotos True, if photo autosave is enabled.
         * @param autosaveVideos True, if video autosave is enabled.
         * @param maxVideoFileSize The maximum size of a video file to be autosaved, in bytes; 512 KB - 4000 MB.
         */
        public ScopeAutosaveSettings(boolean autosavePhotos, boolean autosaveVideos, long maxVideoFileSize) {
            this.autosavePhotos = autosavePhotos;
            this.autosaveVideos = autosaveVideos;
            this.maxVideoFileSize = maxVideoFileSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1546821427;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about notification settings for several chats.
     */
    public static class ScopeNotificationSettings extends Object {
        /**
         * Time left before notifications will be unmuted, in seconds.
         */
        public int muteFor;
        /**
         * Identifier of the notification sound to be played; 0 if sound is disabled.
         */
        public long soundId;
        /**
         * True, if message content must be displayed in notifications.
         */
        public boolean showPreview;
        /**
         * If true, story notifications are received only for the first 5 chats from topChatCategoryUsers regardless of the value of muteStories.
         */
        public boolean useDefaultMuteStories;
        /**
         * True, if story notifications are disabled.
         */
        public boolean muteStories;
        /**
         * Identifier of the notification sound to be played for stories; 0 if sound is disabled.
         */
        public long storySoundId;
        /**
         * True, if the sender of stories must be displayed in notifications.
         */
        public boolean showStorySender;
        /**
         * True, if notifications for incoming pinned messages will be created as for an ordinary unread message.
         */
        public boolean disablePinnedMessageNotifications;
        /**
         * True, if notifications for messages with mentions will be created as for an ordinary unread message.
         */
        public boolean disableMentionNotifications;

        /**
         * Contains information about notification settings for several chats.
         */
        public ScopeNotificationSettings() {
        }

        /**
         * Contains information about notification settings for several chats.
         *
         * @param muteFor Time left before notifications will be unmuted, in seconds.
         * @param soundId Identifier of the notification sound to be played; 0 if sound is disabled.
         * @param showPreview True, if message content must be displayed in notifications.
         * @param useDefaultMuteStories If true, story notifications are received only for the first 5 chats from topChatCategoryUsers regardless of the value of muteStories.
         * @param muteStories True, if story notifications are disabled.
         * @param storySoundId Identifier of the notification sound to be played for stories; 0 if sound is disabled.
         * @param showStorySender True, if the sender of stories must be displayed in notifications.
         * @param disablePinnedMessageNotifications True, if notifications for incoming pinned messages will be created as for an ordinary unread message.
         * @param disableMentionNotifications True, if notifications for messages with mentions will be created as for an ordinary unread message.
         */
        public ScopeNotificationSettings(int muteFor, long soundId, boolean showPreview, boolean useDefaultMuteStories, boolean muteStories, long storySoundId, boolean showStorySender, boolean disablePinnedMessageNotifications, boolean disableMentionNotifications) {
            this.muteFor = muteFor;
            this.soundId = soundId;
            this.showPreview = showPreview;
            this.useDefaultMuteStories = useDefaultMuteStories;
            this.muteStories = muteStories;
            this.storySoundId = storySoundId;
            this.showStorySender = showStorySender;
            this.disablePinnedMessageNotifications = disablePinnedMessageNotifications;
            this.disableMentionNotifications = disableMentionNotifications;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -599105185;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a filter for message search results.
     */
    public abstract static class SearchMessagesFilter extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SearchMessagesFilterEmpty.CONSTRUCTOR,
            SearchMessagesFilterAnimation.CONSTRUCTOR,
            SearchMessagesFilterAudio.CONSTRUCTOR,
            SearchMessagesFilterDocument.CONSTRUCTOR,
            SearchMessagesFilterPhoto.CONSTRUCTOR,
            SearchMessagesFilterVideo.CONSTRUCTOR,
            SearchMessagesFilterVoiceNote.CONSTRUCTOR,
            SearchMessagesFilterPhotoAndVideo.CONSTRUCTOR,
            SearchMessagesFilterUrl.CONSTRUCTOR,
            SearchMessagesFilterChatPhoto.CONSTRUCTOR,
            SearchMessagesFilterVideoNote.CONSTRUCTOR,
            SearchMessagesFilterVoiceAndVideoNote.CONSTRUCTOR,
            SearchMessagesFilterMention.CONSTRUCTOR,
            SearchMessagesFilterUnreadMention.CONSTRUCTOR,
            SearchMessagesFilterUnreadReaction.CONSTRUCTOR,
            SearchMessagesFilterFailedToSend.CONSTRUCTOR,
            SearchMessagesFilterPinned.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SearchMessagesFilter() {
        }
    }

    /**
     * Returns all found messages, no filter is applied.
     */
    public static class SearchMessagesFilterEmpty extends SearchMessagesFilter {

        /**
         * Returns all found messages, no filter is applied.
         */
        public SearchMessagesFilterEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -869395657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only animation messages.
     */
    public static class SearchMessagesFilterAnimation extends SearchMessagesFilter {

        /**
         * Returns only animation messages.
         */
        public SearchMessagesFilterAnimation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -155713339;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only audio messages.
     */
    public static class SearchMessagesFilterAudio extends SearchMessagesFilter {

        /**
         * Returns only audio messages.
         */
        public SearchMessagesFilterAudio() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 867505275;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only document messages.
     */
    public static class SearchMessagesFilterDocument extends SearchMessagesFilter {

        /**
         * Returns only document messages.
         */
        public SearchMessagesFilterDocument() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1526331215;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only photo messages.
     */
    public static class SearchMessagesFilterPhoto extends SearchMessagesFilter {

        /**
         * Returns only photo messages.
         */
        public SearchMessagesFilterPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 925932293;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only video messages.
     */
    public static class SearchMessagesFilterVideo extends SearchMessagesFilter {

        /**
         * Returns only video messages.
         */
        public SearchMessagesFilterVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 115538222;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only voice note messages.
     */
    public static class SearchMessagesFilterVoiceNote extends SearchMessagesFilter {

        /**
         * Returns only voice note messages.
         */
        public SearchMessagesFilterVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1841439357;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only photo and video messages.
     */
    public static class SearchMessagesFilterPhotoAndVideo extends SearchMessagesFilter {

        /**
         * Returns only photo and video messages.
         */
        public SearchMessagesFilterPhotoAndVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1352130963;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages containing URLs.
     */
    public static class SearchMessagesFilterUrl extends SearchMessagesFilter {

        /**
         * Returns only messages containing URLs.
         */
        public SearchMessagesFilterUrl() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1828724341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages containing chat photos.
     */
    public static class SearchMessagesFilterChatPhoto extends SearchMessagesFilter {

        /**
         * Returns only messages containing chat photos.
         */
        public SearchMessagesFilterChatPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1247751329;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only video note messages.
     */
    public static class SearchMessagesFilterVideoNote extends SearchMessagesFilter {

        /**
         * Returns only video note messages.
         */
        public SearchMessagesFilterVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 564323321;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only voice and video note messages.
     */
    public static class SearchMessagesFilterVoiceAndVideoNote extends SearchMessagesFilter {

        /**
         * Returns only voice and video note messages.
         */
        public SearchMessagesFilterVoiceAndVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 664174819;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages with mentions of the current user, or messages that are replies to their messages.
     */
    public static class SearchMessagesFilterMention extends SearchMessagesFilter {

        /**
         * Returns only messages with mentions of the current user, or messages that are replies to their messages.
         */
        public SearchMessagesFilterMention() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2001258652;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages with unread mentions of the current user, or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query, a message thread or by the sending user.
     */
    public static class SearchMessagesFilterUnreadMention extends SearchMessagesFilter {

        /**
         * Returns only messages with unread mentions of the current user, or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query, a message thread or by the sending user.
         */
        public SearchMessagesFilterUnreadMention() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -95769149;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages with unread reactions for the current user. When using this filter the results can't be additionally filtered by a query, a message thread or by the sending user.
     */
    public static class SearchMessagesFilterUnreadReaction extends SearchMessagesFilter {

        /**
         * Returns only messages with unread reactions for the current user. When using this filter the results can't be additionally filtered by a query, a message thread or by the sending user.
         */
        public SearchMessagesFilterUnreadReaction() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1379651328;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only failed to send messages. This filter can be used only if the message database is used.
     */
    public static class SearchMessagesFilterFailedToSend extends SearchMessagesFilter {

        /**
         * Returns only failed to send messages. This filter can be used only if the message database is used.
         */
        public SearchMessagesFilterFailedToSend() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -596322564;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only pinned messages.
     */
    public static class SearchMessagesFilterPinned extends SearchMessagesFilter {

        /**
         * Returns only pinned messages.
         */
        public SearchMessagesFilterPinned() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 371805512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a value representing a number of seconds.
     */
    public static class Seconds extends Object {
        /**
         * Number of seconds.
         */
        public double seconds;

        /**
         * Contains a value representing a number of seconds.
         */
        public Seconds() {
        }

        /**
         * Contains a value representing a number of seconds.
         *
         * @param seconds Number of seconds.
         */
        public Seconds(double seconds) {
            this.seconds = seconds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 959899022;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a secret chat.
     */
    public static class SecretChat extends Object {
        /**
         * Secret chat identifier.
         */
        public int id;
        /**
         * Identifier of the chat partner.
         */
        public long userId;
        /**
         * State of the secret chat.
         */
        public SecretChatState state;
        /**
         * True, if the chat was created by the current user; false otherwise.
         */
        public boolean isOutbound;
        /**
         * Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 little-endian bytes, which must be split into groups of 2 bits, each denoting a pixel of one of 4 colors FFFFFF, D5E6F3, 2D5775, and 2F99C9. The pixels must be used to make a 12x12 square image filled from left to right, top to bottom. Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers.
         */
        public byte[] keyHash;
        /**
         * Secret chat layer; determines features supported by the chat partner's application. Nested text entities and underline and strikethrough entities are supported if the layer &gt;= 101, files bigger than 2000MB are supported if the layer &gt;= 143, spoiler and custom emoji text entities are supported if the layer &gt;= 144.
         */
        public int layer;

        /**
         * Represents a secret chat.
         */
        public SecretChat() {
        }

        /**
         * Represents a secret chat.
         *
         * @param id Secret chat identifier.
         * @param userId Identifier of the chat partner.
         * @param state State of the secret chat.
         * @param isOutbound True, if the chat was created by the current user; false otherwise.
         * @param keyHash Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 little-endian bytes, which must be split into groups of 2 bits, each denoting a pixel of one of 4 colors FFFFFF, D5E6F3, 2D5775, and 2F99C9. The pixels must be used to make a 12x12 square image filled from left to right, top to bottom. Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers.
         * @param layer Secret chat layer; determines features supported by the chat partner's application. Nested text entities and underline and strikethrough entities are supported if the layer &gt;= 101, files bigger than 2000MB are supported if the layer &gt;= 143, spoiler and custom emoji text entities are supported if the layer &gt;= 144.
         */
        public SecretChat(int id, long userId, SecretChatState state, boolean isOutbound, byte[] keyHash, int layer) {
            this.id = id;
            this.userId = userId;
            this.state = state;
            this.isOutbound = isOutbound;
            this.keyHash = keyHash;
            this.layer = layer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -676918325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the current secret chat state.
     */
    public abstract static class SecretChatState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SecretChatStatePending.CONSTRUCTOR,
            SecretChatStateReady.CONSTRUCTOR,
            SecretChatStateClosed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SecretChatState() {
        }
    }

    /**
     * The secret chat is not yet created; waiting for the other user to get online.
     */
    public static class SecretChatStatePending extends SecretChatState {

        /**
         * The secret chat is not yet created; waiting for the other user to get online.
         */
        public SecretChatStatePending() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1637050756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The secret chat is ready to use.
     */
    public static class SecretChatStateReady extends SecretChatState {

        /**
         * The secret chat is ready to use.
         */
        public SecretChatStateReady() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1611352087;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The secret chat is closed.
     */
    public static class SecretChatStateClosed extends SecretChatState {

        /**
         * The secret chat is closed.
         */
        public SecretChatStateClosed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1945106707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the message sent by answerWebAppQuery.
     */
    public static class SentWebAppMessage extends Object {
        /**
         * Identifier of the sent inline message, if known.
         */
        public String inlineMessageId;

        /**
         * Information about the message sent by answerWebAppQuery.
         */
        public SentWebAppMessage() {
        }

        /**
         * Information about the message sent by answerWebAppQuery.
         *
         * @param inlineMessageId Identifier of the sent inline message, if known.
         */
        public SentWebAppMessage(String inlineMessageId) {
            this.inlineMessageId = inlineMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1243934400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about one session in a Telegram application used by the current user. Sessions must be shown to the user in the returned order.
     */
    public static class Session extends Object {
        /**
         * Session identifier.
         */
        public long id;
        /**
         * True, if this session is the current session.
         */
        public boolean isCurrent;
        /**
         * True, if a 2-step verification password is needed to complete authorization of the session.
         */
        public boolean isPasswordPending;
        /**
         * True, if the session wasn't confirmed from another session.
         */
        public boolean isUnconfirmed;
        /**
         * True, if incoming secret chats can be accepted by the session.
         */
        public boolean canAcceptSecretChats;
        /**
         * True, if incoming calls can be accepted by the session.
         */
        public boolean canAcceptCalls;
        /**
         * Session type based on the system and application version, which can be used to display a corresponding icon.
         */
        public SessionType type;
        /**
         * Telegram API identifier, as provided by the application.
         */
        public int apiId;
        /**
         * Name of the application, as provided by the application.
         */
        public String applicationName;
        /**
         * The version of the application, as provided by the application.
         */
        public String applicationVersion;
        /**
         * True, if the application is an official application or uses the apiId of an official application.
         */
        public boolean isOfficialApplication;
        /**
         * Model of the device the application has been run or is running on, as provided by the application.
         */
        public String deviceModel;
        /**
         * Operating system the application has been run or is running on, as provided by the application.
         */
        public String platform;
        /**
         * Version of the operating system the application has been run or is running on, as provided by the application.
         */
        public String systemVersion;
        /**
         * Point in time (Unix timestamp) when the user has logged in.
         */
        public int logInDate;
        /**
         * Point in time (Unix timestamp) when the session was last used.
         */
        public int lastActiveDate;
        /**
         * IP address from which the session was created, in human-readable format.
         */
        public String ipAddress;
        /**
         * A human-readable description of the location from which the session was created, based on the IP address.
         */
        public String location;

        /**
         * Contains information about one session in a Telegram application used by the current user. Sessions must be shown to the user in the returned order.
         */
        public Session() {
        }

        /**
         * Contains information about one session in a Telegram application used by the current user. Sessions must be shown to the user in the returned order.
         *
         * @param id Session identifier.
         * @param isCurrent True, if this session is the current session.
         * @param isPasswordPending True, if a 2-step verification password is needed to complete authorization of the session.
         * @param isUnconfirmed True, if the session wasn't confirmed from another session.
         * @param canAcceptSecretChats True, if incoming secret chats can be accepted by the session.
         * @param canAcceptCalls True, if incoming calls can be accepted by the session.
         * @param type Session type based on the system and application version, which can be used to display a corresponding icon.
         * @param apiId Telegram API identifier, as provided by the application.
         * @param applicationName Name of the application, as provided by the application.
         * @param applicationVersion The version of the application, as provided by the application.
         * @param isOfficialApplication True, if the application is an official application or uses the apiId of an official application.
         * @param deviceModel Model of the device the application has been run or is running on, as provided by the application.
         * @param platform Operating system the application has been run or is running on, as provided by the application.
         * @param systemVersion Version of the operating system the application has been run or is running on, as provided by the application.
         * @param logInDate Point in time (Unix timestamp) when the user has logged in.
         * @param lastActiveDate Point in time (Unix timestamp) when the session was last used.
         * @param ipAddress IP address from which the session was created, in human-readable format.
         * @param location A human-readable description of the location from which the session was created, based on the IP address.
         */
        public Session(long id, boolean isCurrent, boolean isPasswordPending, boolean isUnconfirmed, boolean canAcceptSecretChats, boolean canAcceptCalls, SessionType type, int apiId, String applicationName, String applicationVersion, boolean isOfficialApplication, String deviceModel, String platform, String systemVersion, int logInDate, int lastActiveDate, String ipAddress, String location) {
            this.id = id;
            this.isCurrent = isCurrent;
            this.isPasswordPending = isPasswordPending;
            this.isUnconfirmed = isUnconfirmed;
            this.canAcceptSecretChats = canAcceptSecretChats;
            this.canAcceptCalls = canAcceptCalls;
            this.type = type;
            this.apiId = apiId;
            this.applicationName = applicationName;
            this.applicationVersion = applicationVersion;
            this.isOfficialApplication = isOfficialApplication;
            this.deviceModel = deviceModel;
            this.platform = platform;
            this.systemVersion = systemVersion;
            this.logInDate = logInDate;
            this.lastActiveDate = lastActiveDate;
            this.ipAddress = ipAddress;
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 158702140;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the type of session.
     */
    public abstract static class SessionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SessionTypeAndroid.CONSTRUCTOR,
            SessionTypeApple.CONSTRUCTOR,
            SessionTypeBrave.CONSTRUCTOR,
            SessionTypeChrome.CONSTRUCTOR,
            SessionTypeEdge.CONSTRUCTOR,
            SessionTypeFirefox.CONSTRUCTOR,
            SessionTypeIpad.CONSTRUCTOR,
            SessionTypeIphone.CONSTRUCTOR,
            SessionTypeLinux.CONSTRUCTOR,
            SessionTypeMac.CONSTRUCTOR,
            SessionTypeOpera.CONSTRUCTOR,
            SessionTypeSafari.CONSTRUCTOR,
            SessionTypeUbuntu.CONSTRUCTOR,
            SessionTypeUnknown.CONSTRUCTOR,
            SessionTypeVivaldi.CONSTRUCTOR,
            SessionTypeWindows.CONSTRUCTOR,
            SessionTypeXbox.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SessionType() {
        }
    }

    /**
     * The session is running on an Android device.
     */
    public static class SessionTypeAndroid extends SessionType {

        /**
         * The session is running on an Android device.
         */
        public SessionTypeAndroid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2071764840;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on a generic Apple device.
     */
    public static class SessionTypeApple extends SessionType {

        /**
         * The session is running on a generic Apple device.
         */
        public SessionTypeApple() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1818635701;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Brave browser.
     */
    public static class SessionTypeBrave extends SessionType {

        /**
         * The session is running on the Brave browser.
         */
        public SessionTypeBrave() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1216812563;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Chrome browser.
     */
    public static class SessionTypeChrome extends SessionType {

        /**
         * The session is running on the Chrome browser.
         */
        public SessionTypeChrome() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1573464425;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Edge browser.
     */
    public static class SessionTypeEdge extends SessionType {

        /**
         * The session is running on the Edge browser.
         */
        public SessionTypeEdge() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -538916005;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Firefox browser.
     */
    public static class SessionTypeFirefox extends SessionType {

        /**
         * The session is running on the Firefox browser.
         */
        public SessionTypeFirefox() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2122579364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an iPad device.
     */
    public static class SessionTypeIpad extends SessionType {

        /**
         * The session is running on an iPad device.
         */
        public SessionTypeIpad() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1294647023;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an iPhone device.
     */
    public static class SessionTypeIphone extends SessionType {

        /**
         * The session is running on an iPhone device.
         */
        public SessionTypeIphone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 97616573;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on a Linux device.
     */
    public static class SessionTypeLinux extends SessionType {

        /**
         * The session is running on a Linux device.
         */
        public SessionTypeLinux() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1487422871;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on a Mac device.
     */
    public static class SessionTypeMac extends SessionType {

        /**
         * The session is running on a Mac device.
         */
        public SessionTypeMac() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -612250975;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Opera browser.
     */
    public static class SessionTypeOpera extends SessionType {

        /**
         * The session is running on the Opera browser.
         */
        public SessionTypeOpera() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1463673734;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Safari browser.
     */
    public static class SessionTypeSafari extends SessionType {

        /**
         * The session is running on the Safari browser.
         */
        public SessionTypeSafari() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 710646873;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an Ubuntu device.
     */
    public static class SessionTypeUbuntu extends SessionType {

        /**
         * The session is running on an Ubuntu device.
         */
        public SessionTypeUbuntu() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1569680069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an unknown type of device.
     */
    public static class SessionTypeUnknown extends SessionType {

        /**
         * The session is running on an unknown type of device.
         */
        public SessionTypeUnknown() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 233926704;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Vivaldi browser.
     */
    public static class SessionTypeVivaldi extends SessionType {

        /**
         * The session is running on the Vivaldi browser.
         */
        public SessionTypeVivaldi() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1120503279;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on a Windows device.
     */
    public static class SessionTypeWindows extends SessionType {

        /**
         * The session is running on a Windows device.
         */
        public SessionTypeWindows() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1676512600;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an Xbox console.
     */
    public static class SessionTypeXbox extends SessionType {

        /**
         * The session is running on an Xbox console.
         */
        public SessionTypeXbox() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1856216492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of sessions.
     */
    public static class Sessions extends Object {
        /**
         * List of sessions.
         */
        public Session[] sessions;
        /**
         * Number of days of inactivity before sessions will automatically be terminated; 1-366 days.
         */
        public int inactiveSessionTtlDays;

        /**
         * Contains a list of sessions.
         */
        public Sessions() {
        }

        /**
         * Contains a list of sessions.
         *
         * @param sessions List of sessions.
         * @param inactiveSessionTtlDays Number of days of inactivity before sessions will automatically be terminated; 1-366 days.
         */
        public Sessions(Session[] sessions, int inactiveSessionTtlDays) {
            this.sessions = sessions;
            this.inactiveSessionTtlDays = inactiveSessionTtlDays;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 842912274;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a chat shared with a bot.
     */
    public static class SharedChat extends Object {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Title of the chat; for bots only.
         */
        public String title;
        /**
         * Username of the chat; for bots only.
         */
        public String username;
        /**
         * Photo of the chat; for bots only; may be null.
         */
        @Nullable public Photo photo;

        /**
         * Contains information about a chat shared with a bot.
         */
        public SharedChat() {
        }

        /**
         * Contains information about a chat shared with a bot.
         *
         * @param chatId Chat identifier.
         * @param title Title of the chat; for bots only.
         * @param username Username of the chat; for bots only.
         * @param photo Photo of the chat; for bots only; may be null.
         */
        public SharedChat(long chatId, String title, String username, Photo photo) {
            this.chatId = chatId;
            this.title = title;
            this.username = username;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1250406426;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a user shared with a bot.
     */
    public static class SharedUser extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * First name of the user; for bots only.
         */
        public String firstName;
        /**
         * Last name of the user; for bots only.
         */
        public String lastName;
        /**
         * Username of the user; for bots only.
         */
        public String username;
        /**
         * Profile photo of the user; for bots only; may be null.
         */
        @Nullable public Photo photo;

        /**
         * Contains information about a user shared with a bot.
         */
        public SharedUser() {
        }

        /**
         * Contains information about a user shared with a bot.
         *
         * @param userId User identifier.
         * @param firstName First name of the user; for bots only.
         * @param lastName Last name of the user; for bots only.
         * @param username Username of the user; for bots only.
         * @param photo Profile photo of the user; for bots only; may be null.
         */
        public SharedUser(long userId, String firstName, String lastName, String username, Photo photo) {
            this.userId = userId;
            this.firstName = firstName;
            this.lastName = lastName;
            this.username = username;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 293020919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * One shipping option.
     */
    public static class ShippingOption extends Object {
        /**
         * Shipping option identifier.
         */
        public String id;
        /**
         * Option title.
         */
        public String title;
        /**
         * A list of objects used to calculate the total shipping costs.
         */
        public LabeledPricePart[] priceParts;

        /**
         * One shipping option.
         */
        public ShippingOption() {
        }

        /**
         * One shipping option.
         *
         * @param id Shipping option identifier.
         * @param title Option title.
         * @param priceParts A list of objects used to calculate the total shipping costs.
         */
        public ShippingOption(String id, String title, LabeledPricePart[] priceParts) {
            this.id = id;
            this.title = title;
            this.priceParts = priceParts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1425690001;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of speech recognition in a voice note.
     */
    public abstract static class SpeechRecognitionResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SpeechRecognitionResultPending.CONSTRUCTOR,
            SpeechRecognitionResultText.CONSTRUCTOR,
            SpeechRecognitionResultError.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SpeechRecognitionResult() {
        }
    }

    /**
     * The speech recognition is ongoing.
     */
    public static class SpeechRecognitionResultPending extends SpeechRecognitionResult {
        /**
         * Partially recognized text.
         */
        public String partialText;

        /**
         * The speech recognition is ongoing.
         */
        public SpeechRecognitionResultPending() {
        }

        /**
         * The speech recognition is ongoing.
         *
         * @param partialText Partially recognized text.
         */
        public SpeechRecognitionResultPending(String partialText) {
            this.partialText = partialText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1631810048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The speech recognition successfully finished.
     */
    public static class SpeechRecognitionResultText extends SpeechRecognitionResult {
        /**
         * Recognized text.
         */
        public String text;

        /**
         * The speech recognition successfully finished.
         */
        public SpeechRecognitionResultText() {
        }

        /**
         * The speech recognition successfully finished.
         *
         * @param text Recognized text.
         */
        public SpeechRecognitionResultText(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2132377123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The speech recognition failed.
     */
    public static class SpeechRecognitionResultError extends SpeechRecognitionResult {
        /**
         * Recognition error. An error with a message &quot;MSG_VOICE_TOO_LONG&quot; is returned when media duration is too big to be recognized.
         */
        public Error error;

        /**
         * The speech recognition failed.
         */
        public SpeechRecognitionResultError() {
        }

        /**
         * The speech recognition failed.
         *
         * @param error Recognition error. An error with a message &quot;MSG_VOICE_TOO_LONG&quot; is returned when media duration is too big to be recognized.
         */
        public SpeechRecognitionResultError(Error error) {
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164774908;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a sponsored message.
     */
    public static class SponsoredMessage extends Object {
        /**
         * Message identifier; unique for the chat to which the sponsored message belongs among both ordinary and sponsored messages.
         */
        public long messageId;
        /**
         * True, if the message needs to be labeled as &quot;recommended&quot; instead of &quot;sponsored&quot;.
         */
        public boolean isRecommended;
        /**
         * True, if the message can be reported to Telegram moderators through reportChatSponsoredMessage.
         */
        public boolean canBeReported;
        /**
         * Content of the message. Currently, can be only of the type messageText.
         */
        public MessageContent content;
        /**
         * Information about the sponsor of the message.
         */
        public MessageSponsor sponsor;
        /**
         * Title of the sponsored message.
         */
        public String title;
        /**
         * Text for the message action button.
         */
        public String buttonText;
        /**
         * Identifier of the accent color for title, button text and message background.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the message background; 0 if none.
         */
        public long backgroundCustomEmojiId;
        /**
         * If non-empty, additional information about the sponsored message to be shown along with the message.
         */
        public String additionalInfo;

        /**
         * Describes a sponsored message.
         */
        public SponsoredMessage() {
        }

        /**
         * Describes a sponsored message.
         *
         * @param messageId Message identifier; unique for the chat to which the sponsored message belongs among both ordinary and sponsored messages.
         * @param isRecommended True, if the message needs to be labeled as &quot;recommended&quot; instead of &quot;sponsored&quot;.
         * @param canBeReported True, if the message can be reported to Telegram moderators through reportChatSponsoredMessage.
         * @param content Content of the message. Currently, can be only of the type messageText.
         * @param sponsor Information about the sponsor of the message.
         * @param title Title of the sponsored message.
         * @param buttonText Text for the message action button.
         * @param accentColorId Identifier of the accent color for title, button text and message background.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the message background; 0 if none.
         * @param additionalInfo If non-empty, additional information about the sponsored message to be shown along with the message.
         */
        public SponsoredMessage(long messageId, boolean isRecommended, boolean canBeReported, MessageContent content, MessageSponsor sponsor, String title, String buttonText, int accentColorId, long backgroundCustomEmojiId, String additionalInfo) {
            this.messageId = messageId;
            this.isRecommended = isRecommended;
            this.canBeReported = canBeReported;
            this.content = content;
            this.sponsor = sponsor;
            this.title = title;
            this.buttonText = buttonText;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
            this.additionalInfo = additionalInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1215476699;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of sponsored messages.
     */
    public static class SponsoredMessages extends Object {
        /**
         * List of sponsored messages.
         */
        public SponsoredMessage[] messages;
        /**
         * The minimum number of messages between shown sponsored messages, or 0 if only one sponsored message must be shown after all ordinary messages.
         */
        public int messagesBetween;

        /**
         * Contains a list of sponsored messages.
         */
        public SponsoredMessages() {
        }

        /**
         * Contains a list of sponsored messages.
         *
         * @param messages List of sponsored messages.
         * @param messagesBetween The minimum number of messages between shown sponsored messages, or 0 if only one sponsored message must be shown after all ordinary messages.
         */
        public SponsoredMessages(SponsoredMessage[] messages, int messagesBetween) {
            this.messages = messages;
            this.messagesBetween = messagesBetween;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -537674389;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for buying Telegram stars. Use telegramPaymentPurposeStars for out-of-store payments.
     */
    public static class StarPaymentOption extends Object {
        /**
         * ISO 4217 currency code for the payment.
         */
        public String currency;
        /**
         * The amount to pay, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of Telegram stars that will be purchased.
         */
        public long starCount;
        /**
         * Identifier of the store product associated with the option; may be empty if none.
         */
        public String storeProductId;
        /**
         * True, if the option must be shown only in the full list of payment options.
         */
        public boolean isAdditional;

        /**
         * Describes an option for buying Telegram stars. Use telegramPaymentPurposeStars for out-of-store payments.
         */
        public StarPaymentOption() {
        }

        /**
         * Describes an option for buying Telegram stars. Use telegramPaymentPurposeStars for out-of-store payments.
         *
         * @param currency ISO 4217 currency code for the payment.
         * @param amount The amount to pay, in the smallest units of the currency.
         * @param starCount Number of Telegram stars that will be purchased.
         * @param storeProductId Identifier of the store product associated with the option; may be empty if none.
         * @param isAdditional True, if the option must be shown only in the full list of payment options.
         */
        public StarPaymentOption(String currency, long amount, long starCount, String storeProductId, boolean isAdditional) {
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
            this.storeProductId = storeProductId;
            this.isAdditional = isAdditional;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1364056047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of options for buying Telegram stars.
     */
    public static class StarPaymentOptions extends Object {
        /**
         * The list of options.
         */
        public StarPaymentOption[] options;

        /**
         * Contains a list of options for buying Telegram stars.
         */
        public StarPaymentOptions() {
        }

        /**
         * Contains a list of options for buying Telegram stars.
         *
         * @param options The list of options.
         */
        public StarPaymentOptions(StarPaymentOption[] options) {
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -423720498;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about Telegram stars earned by a bot or a chat.
     */
    public static class StarRevenueStatistics extends Object {
        /**
         * A graph containing amount of revenue in a given day.
         */
        public StatisticalGraph revenueByDayGraph;
        /**
         * Telegram star revenue status.
         */
        public StarRevenueStatus status;
        /**
         * Current conversion rate of a Telegram star to USD.
         */
        public double usdRate;

        /**
         * A detailed statistics about Telegram stars earned by a bot or a chat.
         */
        public StarRevenueStatistics() {
        }

        /**
         * A detailed statistics about Telegram stars earned by a bot or a chat.
         *
         * @param revenueByDayGraph A graph containing amount of revenue in a given day.
         * @param status Telegram star revenue status.
         * @param usdRate Current conversion rate of a Telegram star to USD.
         */
        public StarRevenueStatistics(StatisticalGraph revenueByDayGraph, StarRevenueStatus status, double usdRate) {
            this.revenueByDayGraph = revenueByDayGraph;
            this.status = status;
            this.usdRate = usdRate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1121086889;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about Telegram stars earned by a bot or a chat.
     */
    public static class StarRevenueStatus extends Object {
        /**
         * Total number of the stars earned.
         */
        public long totalCount;
        /**
         * The number of Telegram stars that aren't withdrawn yet.
         */
        public long currentCount;
        /**
         * The number of Telegram stars that are available for withdrawal.
         */
        public long availableCount;
        /**
         * True, if Telegram stars can be withdrawn now or later.
         */
        public boolean withdrawalEnabled;
        /**
         * Time left before the next withdrawal can be started, in seconds; 0 if withdrawal can be started now.
         */
        public int nextWithdrawalIn;

        /**
         * Contains information about Telegram stars earned by a bot or a chat.
         */
        public StarRevenueStatus() {
        }

        /**
         * Contains information about Telegram stars earned by a bot or a chat.
         *
         * @param totalCount Total number of the stars earned.
         * @param currentCount The number of Telegram stars that aren't withdrawn yet.
         * @param availableCount The number of Telegram stars that are available for withdrawal.
         * @param withdrawalEnabled True, if Telegram stars can be withdrawn now or later.
         * @param nextWithdrawalIn Time left before the next withdrawal can be started, in seconds; 0 if withdrawal can be started now.
         */
        public StarRevenueStatus(long totalCount, long currentCount, long availableCount, boolean withdrawalEnabled, int nextWithdrawalIn) {
            this.totalCount = totalCount;
            this.currentCount = currentCount;
            this.availableCount = availableCount;
            this.withdrawalEnabled = withdrawalEnabled;
            this.nextWithdrawalIn = nextWithdrawalIn;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -396634629;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a transaction changing the amount of owned Telegram stars.
     */
    public static class StarTransaction extends Object {
        /**
         * Unique identifier of the transaction.
         */
        public String id;
        /**
         * The amount of added owned Telegram stars; negative for outgoing transactions.
         */
        public long starCount;
        /**
         * True, if the transaction is a refund of a previous transaction.
         */
        public boolean isRefund;
        /**
         * Point in time (Unix timestamp) when the transaction was completed.
         */
        public int date;
        /**
         * Source of the incoming transaction, or its recipient for outgoing transactions.
         */
        public StarTransactionPartner partner;

        /**
         * Represents a transaction changing the amount of owned Telegram stars.
         */
        public StarTransaction() {
        }

        /**
         * Represents a transaction changing the amount of owned Telegram stars.
         *
         * @param id Unique identifier of the transaction.
         * @param starCount The amount of added owned Telegram stars; negative for outgoing transactions.
         * @param isRefund True, if the transaction is a refund of a previous transaction.
         * @param date Point in time (Unix timestamp) when the transaction was completed.
         * @param partner Source of the incoming transaction, or its recipient for outgoing transactions.
         */
        public StarTransaction(String id, long starCount, boolean isRefund, int date, StarTransactionPartner partner) {
            this.id = id;
            this.starCount = starCount;
            this.isRefund = isRefund;
            this.date = date;
            this.partner = partner;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -837778264;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes direction of a transaction with Telegram stars.
     */
    public abstract static class StarTransactionDirection extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StarTransactionDirectionIncoming.CONSTRUCTOR,
            StarTransactionDirectionOutgoing.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StarTransactionDirection() {
        }
    }

    /**
     * The transaction is incoming and increases the number of owned Telegram stars.
     */
    public static class StarTransactionDirectionIncoming extends StarTransactionDirection {

        /**
         * The transaction is incoming and increases the number of owned Telegram stars.
         */
        public StarTransactionDirectionIncoming() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1295335866;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is outgoing and decreases the number of owned Telegram stars.
     */
    public static class StarTransactionDirectionOutgoing extends StarTransactionDirection {

        /**
         * The transaction is outgoing and decreases the number of owned Telegram stars.
         */
        public StarTransactionDirectionOutgoing() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1854125472;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes source or recipient of a transaction with Telegram stars.
     */
    public abstract static class StarTransactionPartner extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StarTransactionPartnerTelegram.CONSTRUCTOR,
            StarTransactionPartnerAppStore.CONSTRUCTOR,
            StarTransactionPartnerGooglePlay.CONSTRUCTOR,
            StarTransactionPartnerFragment.CONSTRUCTOR,
            StarTransactionPartnerTelegramAds.CONSTRUCTOR,
            StarTransactionPartnerBot.CONSTRUCTOR,
            StarTransactionPartnerChannel.CONSTRUCTOR,
            StarTransactionPartnerUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StarTransactionPartner() {
        }
    }

    /**
     * The transaction is a transaction with Telegram through a bot.
     */
    public static class StarTransactionPartnerTelegram extends StarTransactionPartner {

        /**
         * The transaction is a transaction with Telegram through a bot.
         */
        public StarTransactionPartnerTelegram() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2055838912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction with App Store.
     */
    public static class StarTransactionPartnerAppStore extends StarTransactionPartner {

        /**
         * The transaction is a transaction with App Store.
         */
        public StarTransactionPartnerAppStore() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -482335012;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction with Google Play.
     */
    public static class StarTransactionPartnerGooglePlay extends StarTransactionPartner {

        /**
         * The transaction is a transaction with Google Play.
         */
        public StarTransactionPartnerGooglePlay() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -232131936;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction with Fragment.
     */
    public static class StarTransactionPartnerFragment extends StarTransactionPartner {
        /**
         * State of the withdrawal; may be null for refunds from Fragment.
         */
        @Nullable public RevenueWithdrawalState withdrawalState;

        /**
         * The transaction is a transaction with Fragment.
         */
        public StarTransactionPartnerFragment() {
        }

        /**
         * The transaction is a transaction with Fragment.
         *
         * @param withdrawalState State of the withdrawal; may be null for refunds from Fragment.
         */
        public StarTransactionPartnerFragment(RevenueWithdrawalState withdrawalState) {
            this.withdrawalState = withdrawalState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -635942475;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction with Telegram Ad platform.
     */
    public static class StarTransactionPartnerTelegramAds extends StarTransactionPartner {

        /**
         * The transaction is a transaction with Telegram Ad platform.
         */
        public StarTransactionPartnerTelegramAds() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 153066603;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction with a bot.
     */
    public static class StarTransactionPartnerBot extends StarTransactionPartner {
        /**
         * Identifier of the bot.
         */
        public long botUserId;
        /**
         * Information about the bought product; may be null if not applicable.
         */
        @Nullable public ProductInfo productInfo;
        /**
         * Invoice payload; for bots only.
         */
        public byte[] invoicePayload;

        /**
         * The transaction is a transaction with a bot.
         */
        public StarTransactionPartnerBot() {
        }

        /**
         * The transaction is a transaction with a bot.
         *
         * @param botUserId Identifier of the bot.
         * @param productInfo Information about the bought product; may be null if not applicable.
         * @param invoicePayload Invoice payload; for bots only.
         */
        public StarTransactionPartnerBot(long botUserId, ProductInfo productInfo, byte[] invoicePayload) {
            this.botUserId = botUserId;
            this.productInfo = productInfo;
            this.invoicePayload = invoicePayload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 467448921;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction with a channel chat.
     */
    public static class StarTransactionPartnerChannel extends StarTransactionPartner {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifier of the corresponding message with paid media; can be an identifier of a deleted message.
         */
        public long paidMediaMessageId;
        /**
         * Information about the bought media.
         */
        public PaidMedia[] media;

        /**
         * The transaction is a transaction with a channel chat.
         */
        public StarTransactionPartnerChannel() {
        }

        /**
         * The transaction is a transaction with a channel chat.
         *
         * @param chatId Identifier of the chat.
         * @param paidMediaMessageId Identifier of the corresponding message with paid media; can be an identifier of a deleted message.
         * @param media Information about the bought media.
         */
        public StarTransactionPartnerChannel(long chatId, long paidMediaMessageId, PaidMedia[] media) {
            this.chatId = chatId;
            this.paidMediaMessageId = paidMediaMessageId;
            this.media = media;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 632891593;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction with unknown partner.
     */
    public static class StarTransactionPartnerUnsupported extends StarTransactionPartner {

        /**
         * The transaction is a transaction with unknown partner.
         */
        public StarTransactionPartnerUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -994964109;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of Telegram star transactions.
     */
    public static class StarTransactions extends Object {
        /**
         * The amount of owned Telegram stars.
         */
        public long starCount;
        /**
         * List of transactions with Telegram stars.
         */
        public StarTransaction[] transactions;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of Telegram star transactions.
         */
        public StarTransactions() {
        }

        /**
         * Represents a list of Telegram star transactions.
         *
         * @param starCount The amount of owned Telegram stars.
         * @param transactions List of transactions with Telegram stars.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public StarTransactions(long starCount, StarTransaction[] transactions, String nextOffset) {
            this.starCount = starCount;
            this.transactions = transactions;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1305722959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a statistical graph.
     */
    public abstract static class StatisticalGraph extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StatisticalGraphData.CONSTRUCTOR,
            StatisticalGraphAsync.CONSTRUCTOR,
            StatisticalGraphError.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StatisticalGraph() {
        }
    }

    /**
     * A graph data.
     */
    public static class StatisticalGraphData extends StatisticalGraph {
        /**
         * Graph data in JSON format.
         */
        public String jsonData;
        /**
         * If non-empty, a token which can be used to receive a zoomed in graph.
         */
        public String zoomToken;

        /**
         * A graph data.
         */
        public StatisticalGraphData() {
        }

        /**
         * A graph data.
         *
         * @param jsonData Graph data in JSON format.
         * @param zoomToken If non-empty, a token which can be used to receive a zoomed in graph.
         */
        public StatisticalGraphData(String jsonData, String zoomToken) {
            this.jsonData = jsonData;
            this.zoomToken = zoomToken;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1988940244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The graph data to be asynchronously loaded through getStatisticalGraph.
     */
    public static class StatisticalGraphAsync extends StatisticalGraph {
        /**
         * The token to use for data loading.
         */
        public String token;

        /**
         * The graph data to be asynchronously loaded through getStatisticalGraph.
         */
        public StatisticalGraphAsync() {
        }

        /**
         * The graph data to be asynchronously loaded through getStatisticalGraph.
         *
         * @param token The token to use for data loading.
         */
        public StatisticalGraphAsync(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 435891103;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An error message to be shown to the user instead of the graph.
     */
    public static class StatisticalGraphError extends StatisticalGraph {
        /**
         * The error message.
         */
        public String errorMessage;

        /**
         * An error message to be shown to the user instead of the graph.
         */
        public StatisticalGraphError() {
        }

        /**
         * An error message to be shown to the user instead of the graph.
         *
         * @param errorMessage The error message.
         */
        public StatisticalGraphError(String errorMessage) {
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1006788526;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A value with information about its recent changes.
     */
    public static class StatisticalValue extends Object {
        /**
         * The current value.
         */
        public double value;
        /**
         * The value for the previous day.
         */
        public double previousValue;
        /**
         * The growth rate of the value, as a percentage.
         */
        public double growthRatePercentage;

        /**
         * A value with information about its recent changes.
         */
        public StatisticalValue() {
        }

        /**
         * A value with information about its recent changes.
         *
         * @param value The current value.
         * @param previousValue The value for the previous day.
         * @param growthRatePercentage The growth rate of the value, as a percentage.
         */
        public StatisticalValue(double value, double previousValue, double growthRatePercentage) {
            this.value = value;
            this.previousValue = previousValue;
            this.growthRatePercentage = growthRatePercentage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1651337846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a sticker.
     */
    public static class Sticker extends Object {
        /**
         * Unique sticker identifier within the set; 0 if none.
         */
        public long id;
        /**
         * Identifier of the sticker set to which the sticker belongs; 0 if none.
         */
        public long setId;
        /**
         * Sticker width; as defined by the sender.
         */
        public int width;
        /**
         * Sticker height; as defined by the sender.
         */
        public int height;
        /**
         * Emoji corresponding to the sticker.
         */
        public String emoji;
        /**
         * Sticker format.
         */
        public StickerFormat format;
        /**
         * Sticker's full type.
         */
        public StickerFullType fullType;
        /**
         * Sticker's outline represented as a list of closed vector paths; may be empty. The coordinate system origin is in the upper-left corner.
         */
        public ClosedVectorPath[] outline;
        /**
         * Sticker thumbnail in WEBP or JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * File containing the sticker.
         */
        public File sticker;

        /**
         * Describes a sticker.
         */
        public Sticker() {
        }

        /**
         * Describes a sticker.
         *
         * @param id Unique sticker identifier within the set; 0 if none.
         * @param setId Identifier of the sticker set to which the sticker belongs; 0 if none.
         * @param width Sticker width; as defined by the sender.
         * @param height Sticker height; as defined by the sender.
         * @param emoji Emoji corresponding to the sticker.
         * @param format Sticker format.
         * @param fullType Sticker's full type.
         * @param outline Sticker's outline represented as a list of closed vector paths; may be empty. The coordinate system origin is in the upper-left corner.
         * @param thumbnail Sticker thumbnail in WEBP or JPEG format; may be null.
         * @param sticker File containing the sticker.
         */
        public Sticker(long id, long setId, int width, int height, String emoji, StickerFormat format, StickerFullType fullType, ClosedVectorPath[] outline, Thumbnail thumbnail, File sticker) {
            this.id = id;
            this.setId = setId;
            this.width = width;
            this.height = height;
            this.emoji = emoji;
            this.format = format;
            this.fullType = fullType;
            this.outline = outline;
            this.thumbnail = thumbnail;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1155605331;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes format of a sticker.
     */
    public abstract static class StickerFormat extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StickerFormatWebp.CONSTRUCTOR,
            StickerFormatTgs.CONSTRUCTOR,
            StickerFormatWebm.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StickerFormat() {
        }
    }

    /**
     * The sticker is an image in WEBP format.
     */
    public static class StickerFormatWebp extends StickerFormat {

        /**
         * The sticker is an image in WEBP format.
         */
        public StickerFormatWebp() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2123043040;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is an animation in TGS format.
     */
    public static class StickerFormatTgs extends StickerFormat {

        /**
         * The sticker is an animation in TGS format.
         */
        public StickerFormatTgs() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1614588662;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a video in WEBM format.
     */
    public static class StickerFormatWebm extends StickerFormat {

        /**
         * The sticker is a video in WEBM format.
         */
        public StickerFormatWebm() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2070162097;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains full information about sticker type.
     */
    public abstract static class StickerFullType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StickerFullTypeRegular.CONSTRUCTOR,
            StickerFullTypeMask.CONSTRUCTOR,
            StickerFullTypeCustomEmoji.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StickerFullType() {
        }
    }

    /**
     * The sticker is a regular sticker.
     */
    public static class StickerFullTypeRegular extends StickerFullType {
        /**
         * Premium animation of the sticker; may be null. If present, only Telegram Premium users can use the sticker.
         */
        @Nullable public File premiumAnimation;

        /**
         * The sticker is a regular sticker.
         */
        public StickerFullTypeRegular() {
        }

        /**
         * The sticker is a regular sticker.
         *
         * @param premiumAnimation Premium animation of the sticker; may be null. If present, only Telegram Premium users can use the sticker.
         */
        public StickerFullTypeRegular(File premiumAnimation) {
            this.premiumAnimation = premiumAnimation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2006425865;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a mask in WEBP format to be placed on photos or videos.
     */
    public static class StickerFullTypeMask extends StickerFullType {
        /**
         * Position where the mask is placed; may be null.
         */
        @Nullable public MaskPosition maskPosition;

        /**
         * The sticker is a mask in WEBP format to be placed on photos or videos.
         */
        public StickerFullTypeMask() {
        }

        /**
         * The sticker is a mask in WEBP format to be placed on photos or videos.
         *
         * @param maskPosition Position where the mask is placed; may be null.
         */
        public StickerFullTypeMask(MaskPosition maskPosition) {
            this.maskPosition = maskPosition;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 652197687;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a custom emoji to be used inside message text and caption. Currently, only Telegram Premium users can use custom emoji.
     */
    public static class StickerFullTypeCustomEmoji extends StickerFullType {
        /**
         * Identifier of the custom emoji.
         */
        public long customEmojiId;
        /**
         * True, if the sticker must be repainted to a text color in messages, the color of the Telegram Premium badge in emoji status, white color on chat photos, or another appropriate color in other places.
         */
        public boolean needsRepainting;

        /**
         * The sticker is a custom emoji to be used inside message text and caption. Currently, only Telegram Premium users can use custom emoji.
         */
        public StickerFullTypeCustomEmoji() {
        }

        /**
         * The sticker is a custom emoji to be used inside message text and caption. Currently, only Telegram Premium users can use custom emoji.
         *
         * @param customEmojiId Identifier of the custom emoji.
         * @param needsRepainting True, if the sticker must be repainted to a text color in messages, the color of the Telegram Premium badge in emoji status, white color on chat photos, or another appropriate color in other places.
         */
        public StickerFullTypeCustomEmoji(long customEmojiId, boolean needsRepainting) {
            this.customEmojiId = customEmojiId;
            this.needsRepainting = needsRepainting;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1015085653;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a sticker set.
     */
    public static class StickerSet extends Object {
        /**
         * Identifier of the sticker set.
         */
        public long id;
        /**
         * Title of the sticker set.
         */
        public String title;
        /**
         * Name of the sticker set.
         */
        public String name;
        /**
         * Sticker set thumbnail in WEBP, TGS, or WEBM format with width and height 100; may be null. The file can be downloaded only before the thumbnail is changed.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * Sticker set thumbnail's outline represented as a list of closed vector paths; may be empty. The coordinate system origin is in the upper-left corner.
         */
        public ClosedVectorPath[] thumbnailOutline;
        /**
         * True, if the sticker set is owned by the current user.
         */
        public boolean isOwned;
        /**
         * True, if the sticker set has been installed by the current user.
         */
        public boolean isInstalled;
        /**
         * True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously.
         */
        public boolean isArchived;
        /**
         * True, if the sticker set is official.
         */
        public boolean isOfficial;
        /**
         * Type of the stickers in the set.
         */
        public StickerType stickerType;
        /**
         * True, if stickers in the sticker set are custom emoji that must be repainted; for custom emoji sticker sets only.
         */
        public boolean needsRepainting;
        /**
         * True, if stickers in the sticker set are custom emoji that can be used as chat emoji status; for custom emoji sticker sets only.
         */
        public boolean isAllowedAsChatEmojiStatus;
        /**
         * True for already viewed trending sticker sets.
         */
        public boolean isViewed;
        /**
         * List of stickers in this set.
         */
        public Sticker[] stickers;
        /**
         * A list of emojis corresponding to the stickers in the same order. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
         */
        public Emojis[] emojis;

        /**
         * Represents a sticker set.
         */
        public StickerSet() {
        }

        /**
         * Represents a sticker set.
         *
         * @param id Identifier of the sticker set.
         * @param title Title of the sticker set.
         * @param name Name of the sticker set.
         * @param thumbnail Sticker set thumbnail in WEBP, TGS, or WEBM format with width and height 100; may be null. The file can be downloaded only before the thumbnail is changed.
         * @param thumbnailOutline Sticker set thumbnail's outline represented as a list of closed vector paths; may be empty. The coordinate system origin is in the upper-left corner.
         * @param isOwned True, if the sticker set is owned by the current user.
         * @param isInstalled True, if the sticker set has been installed by the current user.
         * @param isArchived True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously.
         * @param isOfficial True, if the sticker set is official.
         * @param stickerType Type of the stickers in the set.
         * @param needsRepainting True, if stickers in the sticker set are custom emoji that must be repainted; for custom emoji sticker sets only.
         * @param isAllowedAsChatEmojiStatus True, if stickers in the sticker set are custom emoji that can be used as chat emoji status; for custom emoji sticker sets only.
         * @param isViewed True for already viewed trending sticker sets.
         * @param stickers List of stickers in this set.
         * @param emojis A list of emojis corresponding to the stickers in the same order. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
         */
        public StickerSet(long id, String title, String name, Thumbnail thumbnail, ClosedVectorPath[] thumbnailOutline, boolean isOwned, boolean isInstalled, boolean isArchived, boolean isOfficial, StickerType stickerType, boolean needsRepainting, boolean isAllowedAsChatEmojiStatus, boolean isViewed, Sticker[] stickers, Emojis[] emojis) {
            this.id = id;
            this.title = title;
            this.name = name;
            this.thumbnail = thumbnail;
            this.thumbnailOutline = thumbnailOutline;
            this.isOwned = isOwned;
            this.isInstalled = isInstalled;
            this.isArchived = isArchived;
            this.isOfficial = isOfficial;
            this.stickerType = stickerType;
            this.needsRepainting = needsRepainting;
            this.isAllowedAsChatEmojiStatus = isAllowedAsChatEmojiStatus;
            this.isViewed = isViewed;
            this.stickers = stickers;
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 607438405;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents short information about a sticker set.
     */
    public static class StickerSetInfo extends Object {
        /**
         * Identifier of the sticker set.
         */
        public long id;
        /**
         * Title of the sticker set.
         */
        public String title;
        /**
         * Name of the sticker set.
         */
        public String name;
        /**
         * Sticker set thumbnail in WEBP, TGS, or WEBM format with width and height 100; may be null. The file can be downloaded only before the thumbnail is changed.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * Sticker set thumbnail's outline represented as a list of closed vector paths; may be empty. The coordinate system origin is in the upper-left corner.
         */
        public ClosedVectorPath[] thumbnailOutline;
        /**
         * True, if the sticker set is owned by the current user.
         */
        public boolean isOwned;
        /**
         * True, if the sticker set has been installed by the current user.
         */
        public boolean isInstalled;
        /**
         * True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously.
         */
        public boolean isArchived;
        /**
         * True, if the sticker set is official.
         */
        public boolean isOfficial;
        /**
         * Type of the stickers in the set.
         */
        public StickerType stickerType;
        /**
         * True, if stickers in the sticker set are custom emoji that must be repainted; for custom emoji sticker sets only.
         */
        public boolean needsRepainting;
        /**
         * True, if stickers in the sticker set are custom emoji that can be used as chat emoji status; for custom emoji sticker sets only.
         */
        public boolean isAllowedAsChatEmojiStatus;
        /**
         * True for already viewed trending sticker sets.
         */
        public boolean isViewed;
        /**
         * Total number of stickers in the set.
         */
        public int size;
        /**
         * Up to the first 5 stickers from the set, depending on the context. If the application needs more stickers the full sticker set needs to be requested.
         */
        public Sticker[] covers;

        /**
         * Represents short information about a sticker set.
         */
        public StickerSetInfo() {
        }

        /**
         * Represents short information about a sticker set.
         *
         * @param id Identifier of the sticker set.
         * @param title Title of the sticker set.
         * @param name Name of the sticker set.
         * @param thumbnail Sticker set thumbnail in WEBP, TGS, or WEBM format with width and height 100; may be null. The file can be downloaded only before the thumbnail is changed.
         * @param thumbnailOutline Sticker set thumbnail's outline represented as a list of closed vector paths; may be empty. The coordinate system origin is in the upper-left corner.
         * @param isOwned True, if the sticker set is owned by the current user.
         * @param isInstalled True, if the sticker set has been installed by the current user.
         * @param isArchived True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously.
         * @param isOfficial True, if the sticker set is official.
         * @param stickerType Type of the stickers in the set.
         * @param needsRepainting True, if stickers in the sticker set are custom emoji that must be repainted; for custom emoji sticker sets only.
         * @param isAllowedAsChatEmojiStatus True, if stickers in the sticker set are custom emoji that can be used as chat emoji status; for custom emoji sticker sets only.
         * @param isViewed True for already viewed trending sticker sets.
         * @param size Total number of stickers in the set.
         * @param covers Up to the first 5 stickers from the set, depending on the context. If the application needs more stickers the full sticker set needs to be requested.
         */
        public StickerSetInfo(long id, String title, String name, Thumbnail thumbnail, ClosedVectorPath[] thumbnailOutline, boolean isOwned, boolean isInstalled, boolean isArchived, boolean isOfficial, StickerType stickerType, boolean needsRepainting, boolean isAllowedAsChatEmojiStatus, boolean isViewed, int size, Sticker[] covers) {
            this.id = id;
            this.title = title;
            this.name = name;
            this.thumbnail = thumbnail;
            this.thumbnailOutline = thumbnailOutline;
            this.isOwned = isOwned;
            this.isInstalled = isInstalled;
            this.isArchived = isArchived;
            this.isOfficial = isOfficial;
            this.stickerType = stickerType;
            this.needsRepainting = needsRepainting;
            this.isAllowedAsChatEmojiStatus = isAllowedAsChatEmojiStatus;
            this.isViewed = isViewed;
            this.size = size;
            this.covers = covers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1730888790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of sticker sets.
     */
    public static class StickerSets extends Object {
        /**
         * Approximate total number of sticker sets found.
         */
        public int totalCount;
        /**
         * List of sticker sets.
         */
        public StickerSetInfo[] sets;

        /**
         * Represents a list of sticker sets.
         */
        public StickerSets() {
        }

        /**
         * Represents a list of sticker sets.
         *
         * @param totalCount Approximate total number of sticker sets found.
         * @param sets List of sticker sets.
         */
        public StickerSets(int totalCount, StickerSetInfo[] sets) {
            this.totalCount = totalCount;
            this.sets = sets;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1883828812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of sticker.
     */
    public abstract static class StickerType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StickerTypeRegular.CONSTRUCTOR,
            StickerTypeMask.CONSTRUCTOR,
            StickerTypeCustomEmoji.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StickerType() {
        }
    }

    /**
     * The sticker is a regular sticker.
     */
    public static class StickerTypeRegular extends StickerType {

        /**
         * The sticker is a regular sticker.
         */
        public StickerTypeRegular() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 56345973;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a mask in WEBP format to be placed on photos or videos.
     */
    public static class StickerTypeMask extends StickerType {

        /**
         * The sticker is a mask in WEBP format to be placed on photos or videos.
         */
        public StickerTypeMask() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1765394796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a custom emoji to be used inside message text and caption.
     */
    public static class StickerTypeCustomEmoji extends StickerType {

        /**
         * The sticker is a custom emoji to be used inside message text and caption.
         */
        public StickerTypeCustomEmoji() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -120752249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of stickers.
     */
    public static class Stickers extends Object {
        /**
         * List of stickers.
         */
        public Sticker[] stickers;

        /**
         * Represents a list of stickers.
         */
        public Stickers() {
        }

        /**
         * Represents a list of stickers.
         *
         * @param stickers List of stickers.
         */
        public Stickers(Sticker[] stickers) {
            this.stickers = stickers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1974859260;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the exact storage usage statistics split by chats and file type.
     */
    public static class StorageStatistics extends Object {
        /**
         * Total size of files, in bytes.
         */
        public long size;
        /**
         * Total number of files.
         */
        public int count;
        /**
         * Statistics split by chats.
         */
        public StorageStatisticsByChat[] byChat;

        /**
         * Contains the exact storage usage statistics split by chats and file type.
         */
        public StorageStatistics() {
        }

        /**
         * Contains the exact storage usage statistics split by chats and file type.
         *
         * @param size Total size of files, in bytes.
         * @param count Total number of files.
         * @param byChat Statistics split by chats.
         */
        public StorageStatistics(long size, int count, StorageStatisticsByChat[] byChat) {
            this.size = size;
            this.count = count;
            this.byChat = byChat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 217237013;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the storage usage statistics for a specific chat.
     */
    public static class StorageStatisticsByChat extends Object {
        /**
         * Chat identifier; 0 if none.
         */
        public long chatId;
        /**
         * Total size of the files in the chat, in bytes.
         */
        public long size;
        /**
         * Total number of files in the chat.
         */
        public int count;
        /**
         * Statistics split by file types.
         */
        public StorageStatisticsByFileType[] byFileType;

        /**
         * Contains the storage usage statistics for a specific chat.
         */
        public StorageStatisticsByChat() {
        }

        /**
         * Contains the storage usage statistics for a specific chat.
         *
         * @param chatId Chat identifier; 0 if none.
         * @param size Total size of the files in the chat, in bytes.
         * @param count Total number of files in the chat.
         * @param byFileType Statistics split by file types.
         */
        public StorageStatisticsByChat(long chatId, long size, int count, StorageStatisticsByFileType[] byFileType) {
            this.chatId = chatId;
            this.size = size;
            this.count = count;
            this.byFileType = byFileType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 635434531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the storage usage statistics for a specific file type.
     */
    public static class StorageStatisticsByFileType extends Object {
        /**
         * File type.
         */
        public FileType fileType;
        /**
         * Total size of the files, in bytes.
         */
        public long size;
        /**
         * Total number of files.
         */
        public int count;

        /**
         * Contains the storage usage statistics for a specific file type.
         */
        public StorageStatisticsByFileType() {
        }

        /**
         * Contains the storage usage statistics for a specific file type.
         *
         * @param fileType File type.
         * @param size Total size of the files, in bytes.
         * @param count Total number of files.
         */
        public StorageStatisticsByFileType(FileType fileType, long size, int count) {
            this.fileType = fileType;
            this.size = size;
            this.count = count;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 714012840;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains approximate storage usage statistics, excluding files of unknown file type.
     */
    public static class StorageStatisticsFast extends Object {
        /**
         * Approximate total size of files, in bytes.
         */
        public long filesSize;
        /**
         * Approximate number of files.
         */
        public int fileCount;
        /**
         * Size of the database.
         */
        public long databaseSize;
        /**
         * Size of the language pack database.
         */
        public long languagePackDatabaseSize;
        /**
         * Size of the TDLib internal log.
         */
        public long logSize;

        /**
         * Contains approximate storage usage statistics, excluding files of unknown file type.
         */
        public StorageStatisticsFast() {
        }

        /**
         * Contains approximate storage usage statistics, excluding files of unknown file type.
         *
         * @param filesSize Approximate total size of files, in bytes.
         * @param fileCount Approximate number of files.
         * @param databaseSize Size of the database.
         * @param languagePackDatabaseSize Size of the language pack database.
         * @param logSize Size of the TDLib internal log.
         */
        public StorageStatisticsFast(long filesSize, int fileCount, long databaseSize, long languagePackDatabaseSize, long logSize) {
            this.filesSize = filesSize;
            this.fileCount = fileCount;
            this.databaseSize = databaseSize;
            this.languagePackDatabaseSize = languagePackDatabaseSize;
            this.logSize = logSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -884922271;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a purpose of an in-store payment.
     */
    public abstract static class StorePaymentPurpose extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StorePaymentPurposePremiumSubscription.CONSTRUCTOR,
            StorePaymentPurposeGiftedPremium.CONSTRUCTOR,
            StorePaymentPurposePremiumGiftCodes.CONSTRUCTOR,
            StorePaymentPurposePremiumGiveaway.CONSTRUCTOR,
            StorePaymentPurposeStars.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StorePaymentPurpose() {
        }
    }

    /**
     * The user subscribing to Telegram Premium.
     */
    public static class StorePaymentPurposePremiumSubscription extends StorePaymentPurpose {
        /**
         * Pass true if this is a restore of a Telegram Premium purchase; only for App Store.
         */
        public boolean isRestore;
        /**
         * Pass true if this is an upgrade from a monthly subscription to early subscription; only for App Store.
         */
        public boolean isUpgrade;

        /**
         * The user subscribing to Telegram Premium.
         */
        public StorePaymentPurposePremiumSubscription() {
        }

        /**
         * The user subscribing to Telegram Premium.
         *
         * @param isRestore Pass true if this is a restore of a Telegram Premium purchase; only for App Store.
         * @param isUpgrade Pass true if this is an upgrade from a monthly subscription to early subscription; only for App Store.
         */
        public StorePaymentPurposePremiumSubscription(boolean isRestore, boolean isUpgrade) {
            this.isRestore = isRestore;
            this.isUpgrade = isUpgrade;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1263894804;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user gifting Telegram Premium to another user.
     */
    public static class StorePaymentPurposeGiftedPremium extends StorePaymentPurpose {
        /**
         * Identifier of the user to which Premium was gifted.
         */
        public long userId;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;

        /**
         * The user gifting Telegram Premium to another user.
         */
        public StorePaymentPurposeGiftedPremium() {
        }

        /**
         * The user gifting Telegram Premium to another user.
         *
         * @param userId Identifier of the user to which Premium was gifted.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         */
        public StorePaymentPurposeGiftedPremium(long userId, String currency, long amount) {
            this.userId = userId;
            this.currency = currency;
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1916846289;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user creating Telegram Premium gift codes for other users.
     */
    public static class StorePaymentPurposePremiumGiftCodes extends StorePaymentPurpose {
        /**
         * Identifier of the supergroup or channel chat, which will be automatically boosted by the users for duration of the Premium subscription and which is administered by the user; 0 if none.
         */
        public long boostedChatId;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Identifiers of the users which can activate the gift codes.
         */
        public long[] userIds;

        /**
         * The user creating Telegram Premium gift codes for other users.
         */
        public StorePaymentPurposePremiumGiftCodes() {
        }

        /**
         * The user creating Telegram Premium gift codes for other users.
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which will be automatically boosted by the users for duration of the Premium subscription and which is administered by the user; 0 if none.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param userIds Identifiers of the users which can activate the gift codes.
         */
        public StorePaymentPurposePremiumGiftCodes(long boostedChatId, String currency, long amount, long[] userIds) {
            this.boostedChatId = boostedChatId;
            this.currency = currency;
            this.amount = amount;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1527840798;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user creating a Telegram Premium giveaway.
     */
    public static class StorePaymentPurposePremiumGiveaway extends StorePaymentPurpose {
        /**
         * Giveaway parameters.
         */
        public PremiumGiveawayParameters parameters;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;

        /**
         * The user creating a Telegram Premium giveaway.
         */
        public StorePaymentPurposePremiumGiveaway() {
        }

        /**
         * The user creating a Telegram Premium giveaway.
         *
         * @param parameters Giveaway parameters.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         */
        public StorePaymentPurposePremiumGiveaway(PremiumGiveawayParameters parameters, String currency, long amount) {
            this.parameters = parameters;
            this.currency = currency;
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1346867417;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user buying Telegram stars.
     */
    public static class StorePaymentPurposeStars extends StorePaymentPurpose {
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of bought stars.
         */
        public long starCount;

        /**
         * The user buying Telegram stars.
         */
        public StorePaymentPurposeStars() {
        }

        /**
         * The user buying Telegram stars.
         *
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param starCount Number of bought stars.
         */
        public StorePaymentPurposeStars(String currency, long amount, long starCount) {
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1803497708;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of stories.
     */
    public static class Stories extends Object {
        /**
         * Approximate total number of stories found.
         */
        public int totalCount;
        /**
         * The list of stories.
         */
        public Story[] stories;
        /**
         * Identifiers of the pinned stories; returned only in getChatPostedToChatPageStories with fromStoryId == 0.
         */
        public int[] pinnedStoryIds;

        /**
         * Represents a list of stories.
         */
        public Stories() {
        }

        /**
         * Represents a list of stories.
         *
         * @param totalCount Approximate total number of stories found.
         * @param stories The list of stories.
         * @param pinnedStoryIds Identifiers of the pinned stories; returned only in getChatPostedToChatPageStories with fromStoryId == 0.
         */
        public Stories(int totalCount, Story[] stories, int[] pinnedStoryIds) {
            this.totalCount = totalCount;
            this.stories = stories;
            this.pinnedStoryIds = pinnedStoryIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 670157595;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a story.
     */
    public static class Story extends Object {
        /**
         * Unique story identifier among stories of the given sender.
         */
        public int id;
        /**
         * Identifier of the chat that posted the story.
         */
        public long senderChatId;
        /**
         * Identifier of the sender of the story; may be null if the story is posted on behalf of the senderChatId.
         */
        @Nullable public MessageSender senderId;
        /**
         * Point in time (Unix timestamp) when the story was published.
         */
        public int date;
        /**
         * True, if the story is being sent by the current user.
         */
        public boolean isBeingSent;
        /**
         * True, if the story is being edited by the current user.
         */
        public boolean isBeingEdited;
        /**
         * True, if the story was edited.
         */
        public boolean isEdited;
        /**
         * True, if the story is saved in the sender's profile and will be available there after expiration.
         */
        public boolean isPostedToChatPage;
        /**
         * True, if the story is visible only for the current user.
         */
        public boolean isVisibleOnlyForSelf;
        /**
         * True, if the story can be deleted.
         */
        public boolean canBeDeleted;
        /**
         * True, if the story can be edited.
         */
        public boolean canBeEdited;
        /**
         * True, if the story can be forwarded as a message. Otherwise, screenshots and saving of the story content must be also forbidden.
         */
        public boolean canBeForwarded;
        /**
         * True, if the story can be replied in the chat with the story sender.
         */
        public boolean canBeReplied;
        /**
         * True, if the story's isPostedToChatPage value can be changed.
         */
        public boolean canToggleIsPostedToChatPage;
        /**
         * True, if the story statistics are available through getStoryStatistics.
         */
        public boolean canGetStatistics;
        /**
         * True, if interactions with the story can be received through getStoryInteractions.
         */
        public boolean canGetInteractions;
        /**
         * True, if users viewed the story can't be received, because the story has expired more than getOption(&quot;story_viewers_expiration_delay&quot;) seconds ago.
         */
        public boolean hasExpiredViewers;
        /**
         * Information about the original story; may be null if the story wasn't reposted.
         */
        @Nullable public StoryRepostInfo repostInfo;
        /**
         * Information about interactions with the story; may be null if the story isn't owned or there were no interactions.
         */
        @Nullable public StoryInteractionInfo interactionInfo;
        /**
         * Type of the chosen reaction; may be null if none.
         */
        @Nullable public ReactionType chosenReactionType;
        /**
         * Privacy rules affecting story visibility; may be approximate for non-owned stories.
         */
        public StoryPrivacySettings privacySettings;
        /**
         * Content of the story.
         */
        public StoryContent content;
        /**
         * Clickable areas to be shown on the story content.
         */
        public StoryArea[] areas;
        /**
         * Caption of the story.
         */
        public FormattedText caption;

        /**
         * Represents a story.
         */
        public Story() {
        }

        /**
         * Represents a story.
         *
         * @param id Unique story identifier among stories of the given sender.
         * @param senderChatId Identifier of the chat that posted the story.
         * @param senderId Identifier of the sender of the story; may be null if the story is posted on behalf of the senderChatId.
         * @param date Point in time (Unix timestamp) when the story was published.
         * @param isBeingSent True, if the story is being sent by the current user.
         * @param isBeingEdited True, if the story is being edited by the current user.
         * @param isEdited True, if the story was edited.
         * @param isPostedToChatPage True, if the story is saved in the sender's profile and will be available there after expiration.
         * @param isVisibleOnlyForSelf True, if the story is visible only for the current user.
         * @param canBeDeleted True, if the story can be deleted.
         * @param canBeEdited True, if the story can be edited.
         * @param canBeForwarded True, if the story can be forwarded as a message. Otherwise, screenshots and saving of the story content must be also forbidden.
         * @param canBeReplied True, if the story can be replied in the chat with the story sender.
         * @param canToggleIsPostedToChatPage True, if the story's isPostedToChatPage value can be changed.
         * @param canGetStatistics True, if the story statistics are available through getStoryStatistics.
         * @param canGetInteractions True, if interactions with the story can be received through getStoryInteractions.
         * @param hasExpiredViewers True, if users viewed the story can't be received, because the story has expired more than getOption(&quot;story_viewers_expiration_delay&quot;) seconds ago.
         * @param repostInfo Information about the original story; may be null if the story wasn't reposted.
         * @param interactionInfo Information about interactions with the story; may be null if the story isn't owned or there were no interactions.
         * @param chosenReactionType Type of the chosen reaction; may be null if none.
         * @param privacySettings Privacy rules affecting story visibility; may be approximate for non-owned stories.
         * @param content Content of the story.
         * @param areas Clickable areas to be shown on the story content.
         * @param caption Caption of the story.
         */
        public Story(int id, long senderChatId, MessageSender senderId, int date, boolean isBeingSent, boolean isBeingEdited, boolean isEdited, boolean isPostedToChatPage, boolean isVisibleOnlyForSelf, boolean canBeDeleted, boolean canBeEdited, boolean canBeForwarded, boolean canBeReplied, boolean canToggleIsPostedToChatPage, boolean canGetStatistics, boolean canGetInteractions, boolean hasExpiredViewers, StoryRepostInfo repostInfo, StoryInteractionInfo interactionInfo, ReactionType chosenReactionType, StoryPrivacySettings privacySettings, StoryContent content, StoryArea[] areas, FormattedText caption) {
            this.id = id;
            this.senderChatId = senderChatId;
            this.senderId = senderId;
            this.date = date;
            this.isBeingSent = isBeingSent;
            this.isBeingEdited = isBeingEdited;
            this.isEdited = isEdited;
            this.isPostedToChatPage = isPostedToChatPage;
            this.isVisibleOnlyForSelf = isVisibleOnlyForSelf;
            this.canBeDeleted = canBeDeleted;
            this.canBeEdited = canBeEdited;
            this.canBeForwarded = canBeForwarded;
            this.canBeReplied = canBeReplied;
            this.canToggleIsPostedToChatPage = canToggleIsPostedToChatPage;
            this.canGetStatistics = canGetStatistics;
            this.canGetInteractions = canGetInteractions;
            this.hasExpiredViewers = hasExpiredViewers;
            this.repostInfo = repostInfo;
            this.interactionInfo = interactionInfo;
            this.chosenReactionType = chosenReactionType;
            this.privacySettings = privacySettings;
            this.content = content;
            this.areas = areas;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -294015331;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a clickable rectangle area on a story media.
     */
    public static class StoryArea extends Object {
        /**
         * Position of the area.
         */
        public StoryAreaPosition position;
        /**
         * Type of the area.
         */
        public StoryAreaType type;

        /**
         * Describes a clickable rectangle area on a story media.
         */
        public StoryArea() {
        }

        /**
         * Describes a clickable rectangle area on a story media.
         *
         * @param position Position of the area.
         * @param type Type of the area.
         */
        public StoryArea(StoryAreaPosition position, StoryAreaType type) {
            this.position = position;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -906033314;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes position of a clickable rectangle area on a story media.
     */
    public static class StoryAreaPosition extends Object {
        /**
         * The abscissa of the rectangle's center, as a percentage of the media width.
         */
        public double xPercentage;
        /**
         * The ordinate of the rectangle's center, as a percentage of the media height.
         */
        public double yPercentage;
        /**
         * The width of the rectangle, as a percentage of the media width.
         */
        public double widthPercentage;
        /**
         * The height of the rectangle, as a percentage of the media height.
         */
        public double heightPercentage;
        /**
         * Clockwise rotation angle of the rectangle, in degrees; 0-360.
         */
        public double rotationAngle;
        /**
         * The radius of the rectangle corner rounding, as a percentage of the media width.
         */
        public double cornerRadiusPercentage;

        /**
         * Describes position of a clickable rectangle area on a story media.
         */
        public StoryAreaPosition() {
        }

        /**
         * Describes position of a clickable rectangle area on a story media.
         *
         * @param xPercentage The abscissa of the rectangle's center, as a percentage of the media width.
         * @param yPercentage The ordinate of the rectangle's center, as a percentage of the media height.
         * @param widthPercentage The width of the rectangle, as a percentage of the media width.
         * @param heightPercentage The height of the rectangle, as a percentage of the media height.
         * @param rotationAngle Clockwise rotation angle of the rectangle, in degrees; 0-360.
         * @param cornerRadiusPercentage The radius of the rectangle corner rounding, as a percentage of the media width.
         */
        public StoryAreaPosition(double xPercentage, double yPercentage, double widthPercentage, double heightPercentage, double rotationAngle, double cornerRadiusPercentage) {
            this.xPercentage = xPercentage;
            this.yPercentage = yPercentage;
            this.widthPercentage = widthPercentage;
            this.heightPercentage = heightPercentage;
            this.rotationAngle = rotationAngle;
            this.cornerRadiusPercentage = cornerRadiusPercentage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1533023124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of clickable rectangle area on a story media.
     */
    public abstract static class StoryAreaType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryAreaTypeLocation.CONSTRUCTOR,
            StoryAreaTypeVenue.CONSTRUCTOR,
            StoryAreaTypeSuggestedReaction.CONSTRUCTOR,
            StoryAreaTypeMessage.CONSTRUCTOR,
            StoryAreaTypeLink.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryAreaType() {
        }
    }

    /**
     * An area pointing to a location.
     */
    public static class StoryAreaTypeLocation extends StoryAreaType {
        /**
         * The location.
         */
        public Location location;
        /**
         * Address of the location; may be null if unknown.
         */
        @Nullable public LocationAddress address;

        /**
         * An area pointing to a location.
         */
        public StoryAreaTypeLocation() {
        }

        /**
         * An area pointing to a location.
         *
         * @param location The location.
         * @param address Address of the location; may be null if unknown.
         */
        public StoryAreaTypeLocation(Location location, LocationAddress address) {
            this.location = location;
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1464612189;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a venue.
     */
    public static class StoryAreaTypeVenue extends StoryAreaType {
        /**
         * Information about the venue.
         */
        public Venue venue;

        /**
         * An area pointing to a venue.
         */
        public StoryAreaTypeVenue() {
        }

        /**
         * An area pointing to a venue.
         *
         * @param venue Information about the venue.
         */
        public StoryAreaTypeVenue(Venue venue) {
            this.venue = venue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 414076166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a suggested reaction. App needs to show a clickable reaction on the area and call setStoryReaction when the are is clicked.
     */
    public static class StoryAreaTypeSuggestedReaction extends StoryAreaType {
        /**
         * Type of the reaction.
         */
        public ReactionType reactionType;
        /**
         * Number of times the reaction was added.
         */
        public int totalCount;
        /**
         * True, if reaction has a dark background.
         */
        public boolean isDark;
        /**
         * True, if reaction corner is flipped.
         */
        public boolean isFlipped;

        /**
         * An area pointing to a suggested reaction. App needs to show a clickable reaction on the area and call setStoryReaction when the are is clicked.
         */
        public StoryAreaTypeSuggestedReaction() {
        }

        /**
         * An area pointing to a suggested reaction. App needs to show a clickable reaction on the area and call setStoryReaction when the are is clicked.
         *
         * @param reactionType Type of the reaction.
         * @param totalCount Number of times the reaction was added.
         * @param isDark True, if reaction has a dark background.
         * @param isFlipped True, if reaction corner is flipped.
         */
        public StoryAreaTypeSuggestedReaction(ReactionType reactionType, int totalCount, boolean isDark, boolean isFlipped) {
            this.reactionType = reactionType;
            this.totalCount = totalCount;
            this.isDark = isDark;
            this.isFlipped = isFlipped;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -111177092;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a message.
     */
    public static class StoryAreaTypeMessage extends StoryAreaType {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * An area pointing to a message.
         */
        public StoryAreaTypeMessage() {
        }

        /**
         * An area pointing to a message.
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message.
         */
        public StoryAreaTypeMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1074825548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a HTTP or tg:// link.
     */
    public static class StoryAreaTypeLink extends StoryAreaType {
        /**
         * HTTP or tg:// URL to be opened when the area is clicked.
         */
        public String url;

        /**
         * An area pointing to a HTTP or tg:// link.
         */
        public StoryAreaTypeLink() {
        }

        /**
         * An area pointing to a HTTP or tg:// link.
         *
         * @param url HTTP or tg:// URL to be opened when the area is clicked.
         */
        public StoryAreaTypeLink(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -127770235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the content of a story.
     */
    public abstract static class StoryContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryContentPhoto.CONSTRUCTOR,
            StoryContentVideo.CONSTRUCTOR,
            StoryContentUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryContent() {
        }
    }

    /**
     * A photo story.
     */
    public static class StoryContentPhoto extends StoryContent {
        /**
         * The photo.
         */
        public Photo photo;

        /**
         * A photo story.
         */
        public StoryContentPhoto() {
        }

        /**
         * A photo story.
         *
         * @param photo The photo.
         */
        public StoryContentPhoto(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -731971504;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video story.
     */
    public static class StoryContentVideo extends StoryContent {
        /**
         * The video in MPEG4 format.
         */
        public StoryVideo video;
        /**
         * Alternative version of the video in MPEG4 format, encoded by x264 codec; may be null.
         */
        @Nullable public StoryVideo alternativeVideo;

        /**
         * A video story.
         */
        public StoryContentVideo() {
        }

        /**
         * A video story.
         *
         * @param video The video in MPEG4 format.
         * @param alternativeVideo Alternative version of the video in MPEG4 format, encoded by x264 codec; may be null.
         */
        public StoryContentVideo(StoryVideo video, StoryVideo alternativeVideo) {
            this.video = video;
            this.alternativeVideo = alternativeVideo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1291754842;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story content that is not supported in the current TDLib version.
     */
    public static class StoryContentUnsupported extends StoryContent {

        /**
         * A story content that is not supported in the current TDLib version.
         */
        public StoryContentUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2033715858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains identifier of a story along with identifier of its sender.
     */
    public static class StoryFullId extends Object {
        /**
         * Identifier of the chat that posted the story.
         */
        public long senderChatId;
        /**
         * Unique story identifier among stories of the given sender.
         */
        public int storyId;

        /**
         * Contains identifier of a story along with identifier of its sender.
         */
        public StoryFullId() {
        }

        /**
         * Contains identifier of a story along with identifier of its sender.
         *
         * @param senderChatId Identifier of the chat that posted the story.
         * @param storyId Unique story identifier among stories of the given sender.
         */
        public StoryFullId(long senderChatId, int storyId) {
            this.senderChatId = senderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1880961525;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about a story.
     */
    public static class StoryInfo extends Object {
        /**
         * Unique story identifier among stories of the given sender.
         */
        public int storyId;
        /**
         * Point in time (Unix timestamp) when the story was published.
         */
        public int date;
        /**
         * True, if the story is available only to close friends.
         */
        public boolean isForCloseFriends;

        /**
         * Contains basic information about a story.
         */
        public StoryInfo() {
        }

        /**
         * Contains basic information about a story.
         *
         * @param storyId Unique story identifier among stories of the given sender.
         * @param date Point in time (Unix timestamp) when the story was published.
         * @param isForCloseFriends True, if the story is available only to close friends.
         */
        public StoryInfo(int storyId, int date, boolean isForCloseFriends) {
            this.storyId = storyId;
            this.date = date;
            this.isForCloseFriends = isForCloseFriends;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1986542766;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents interaction with a story.
     */
    public static class StoryInteraction extends Object {
        /**
         * Identifier of the user or chat that made the interaction.
         */
        public MessageSender actorId;
        /**
         * Approximate point in time (Unix timestamp) when the interaction happened.
         */
        public int interactionDate;
        /**
         * Block list to which the actor is added; may be null if none or for chat stories.
         */
        @Nullable public BlockList blockList;
        /**
         * Type of the interaction.
         */
        public StoryInteractionType type;

        /**
         * Represents interaction with a story.
         */
        public StoryInteraction() {
        }

        /**
         * Represents interaction with a story.
         *
         * @param actorId Identifier of the user or chat that made the interaction.
         * @param interactionDate Approximate point in time (Unix timestamp) when the interaction happened.
         * @param blockList Block list to which the actor is added; may be null if none or for chat stories.
         * @param type Type of the interaction.
         */
        public StoryInteraction(MessageSender actorId, int interactionDate, BlockList blockList, StoryInteractionType type) {
            this.actorId = actorId;
            this.interactionDate = interactionDate;
            this.blockList = blockList;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -702229982;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about interactions with a story.
     */
    public static class StoryInteractionInfo extends Object {
        /**
         * Number of times the story was viewed.
         */
        public int viewCount;
        /**
         * Number of times the story was forwarded; 0 if none or unknown.
         */
        public int forwardCount;
        /**
         * Number of reactions added to the story; 0 if none or unknown.
         */
        public int reactionCount;
        /**
         * Identifiers of at most 3 recent viewers of the story.
         */
        public long[] recentViewerUserIds;

        /**
         * Contains information about interactions with a story.
         */
        public StoryInteractionInfo() {
        }

        /**
         * Contains information about interactions with a story.
         *
         * @param viewCount Number of times the story was viewed.
         * @param forwardCount Number of times the story was forwarded; 0 if none or unknown.
         * @param reactionCount Number of reactions added to the story; 0 if none or unknown.
         * @param recentViewerUserIds Identifiers of at most 3 recent viewers of the story.
         */
        public StoryInteractionInfo(int viewCount, int forwardCount, int reactionCount, long[] recentViewerUserIds) {
            this.viewCount = viewCount;
            this.forwardCount = forwardCount;
            this.reactionCount = reactionCount;
            this.recentViewerUserIds = recentViewerUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -846542065;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of interaction with a story.
     */
    public abstract static class StoryInteractionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryInteractionTypeView.CONSTRUCTOR,
            StoryInteractionTypeForward.CONSTRUCTOR,
            StoryInteractionTypeRepost.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryInteractionType() {
        }
    }

    /**
     * A view of the story.
     */
    public static class StoryInteractionTypeView extends StoryInteractionType {
        /**
         * Type of the reaction that was chosen by the viewer; may be null if none.
         */
        @Nullable public ReactionType chosenReactionType;

        /**
         * A view of the story.
         */
        public StoryInteractionTypeView() {
        }

        /**
         * A view of the story.
         *
         * @param chosenReactionType Type of the reaction that was chosen by the viewer; may be null if none.
         */
        public StoryInteractionTypeView(ReactionType chosenReactionType) {
            this.chosenReactionType = chosenReactionType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1407399888;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forward of the story as a message.
     */
    public static class StoryInteractionTypeForward extends StoryInteractionType {
        /**
         * The message with story forward.
         */
        public Message message;

        /**
         * A forward of the story as a message.
         */
        public StoryInteractionTypeForward() {
        }

        /**
         * A forward of the story as a message.
         *
         * @param message The message with story forward.
         */
        public StoryInteractionTypeForward(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 668089599;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A repost of the story as a story.
     */
    public static class StoryInteractionTypeRepost extends StoryInteractionType {
        /**
         * The reposted story.
         */
        public Story story;

        /**
         * A repost of the story as a story.
         */
        public StoryInteractionTypeRepost() {
        }

        /**
         * A repost of the story as a story.
         *
         * @param story The reposted story.
         */
        public StoryInteractionTypeRepost(Story story) {
            this.story = story;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1021150780;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of interactions with a story.
     */
    public static class StoryInteractions extends Object {
        /**
         * Approximate total number of interactions found.
         */
        public int totalCount;
        /**
         * Approximate total number of found forwards and reposts; always 0 for chat stories.
         */
        public int totalForwardCount;
        /**
         * Approximate total number of found reactions; always 0 for chat stories.
         */
        public int totalReactionCount;
        /**
         * List of story interactions.
         */
        public StoryInteraction[] interactions;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of interactions with a story.
         */
        public StoryInteractions() {
        }

        /**
         * Represents a list of interactions with a story.
         *
         * @param totalCount Approximate total number of interactions found.
         * @param totalForwardCount Approximate total number of found forwards and reposts; always 0 for chat stories.
         * @param totalReactionCount Approximate total number of found reactions; always 0 for chat stories.
         * @param interactions List of story interactions.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public StoryInteractions(int totalCount, int totalForwardCount, int totalReactionCount, StoryInteraction[] interactions, String nextOffset) {
            this.totalCount = totalCount;
            this.totalForwardCount = totalForwardCount;
            this.totalReactionCount = totalReactionCount;
            this.interactions = interactions;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1537062962;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a list of stories.
     */
    public abstract static class StoryList extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryListMain.CONSTRUCTOR,
            StoryListArchive.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryList() {
        }
    }

    /**
     * The list of stories, shown in the main chat list and folder chat lists.
     */
    public static class StoryListMain extends StoryList {

        /**
         * The list of stories, shown in the main chat list and folder chat lists.
         */
        public StoryListMain() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -672222209;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of stories, shown in the Arvhive chat list.
     */
    public static class StoryListArchive extends StoryList {

        /**
         * The list of stories, shown in the Arvhive chat list.
         */
        public StoryListArchive() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -41900223;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the origin of a story that was reposted.
     */
    public abstract static class StoryOrigin extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryOriginPublicStory.CONSTRUCTOR,
            StoryOriginHiddenUser.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryOrigin() {
        }
    }

    /**
     * The original story was a public story with known sender.
     */
    public static class StoryOriginPublicStory extends StoryOrigin {
        /**
         * Identifier of the chat that posted original story.
         */
        public long chatId;
        /**
         * Story identifier of the original story.
         */
        public int storyId;

        /**
         * The original story was a public story with known sender.
         */
        public StoryOriginPublicStory() {
        }

        /**
         * The original story was a public story with known sender.
         *
         * @param chatId Identifier of the chat that posted original story.
         * @param storyId Story identifier of the original story.
         */
        public StoryOriginPublicStory(long chatId, int storyId) {
            this.chatId = chatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 741842878;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The original story was sent by an unknown user.
     */
    public static class StoryOriginHiddenUser extends StoryOrigin {
        /**
         * Name of the story sender.
         */
        public String senderName;

        /**
         * The original story was sent by an unknown user.
         */
        public StoryOriginHiddenUser() {
        }

        /**
         * The original story was sent by an unknown user.
         *
         * @param senderName Name of the story sender.
         */
        public StoryOriginHiddenUser(String senderName) {
            this.senderName = senderName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1512016364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes privacy settings of a story.
     */
    public abstract static class StoryPrivacySettings extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryPrivacySettingsEveryone.CONSTRUCTOR,
            StoryPrivacySettingsContacts.CONSTRUCTOR,
            StoryPrivacySettingsCloseFriends.CONSTRUCTOR,
            StoryPrivacySettingsSelectedUsers.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryPrivacySettings() {
        }
    }

    /**
     * The story can be viewed by everyone.
     */
    public static class StoryPrivacySettingsEveryone extends StoryPrivacySettings {
        /**
         * Identifiers of the users that can't see the story; always unknown and empty for non-owned stories.
         */
        public long[] exceptUserIds;

        /**
         * The story can be viewed by everyone.
         */
        public StoryPrivacySettingsEveryone() {
        }

        /**
         * The story can be viewed by everyone.
         *
         * @param exceptUserIds Identifiers of the users that can't see the story; always unknown and empty for non-owned stories.
         */
        public StoryPrivacySettingsEveryone(long[] exceptUserIds) {
            this.exceptUserIds = exceptUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 890847843;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The story can be viewed by all contacts except chosen users.
     */
    public static class StoryPrivacySettingsContacts extends StoryPrivacySettings {
        /**
         * User identifiers of the contacts that can't see the story; always unknown and empty for non-owned stories.
         */
        public long[] exceptUserIds;

        /**
         * The story can be viewed by all contacts except chosen users.
         */
        public StoryPrivacySettingsContacts() {
        }

        /**
         * The story can be viewed by all contacts except chosen users.
         *
         * @param exceptUserIds User identifiers of the contacts that can't see the story; always unknown and empty for non-owned stories.
         */
        public StoryPrivacySettingsContacts(long[] exceptUserIds) {
            this.exceptUserIds = exceptUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 50285309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The story can be viewed by all close friends.
     */
    public static class StoryPrivacySettingsCloseFriends extends StoryPrivacySettings {

        /**
         * The story can be viewed by all close friends.
         */
        public StoryPrivacySettingsCloseFriends() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2097122144;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The story can be viewed by certain specified users.
     */
    public static class StoryPrivacySettingsSelectedUsers extends StoryPrivacySettings {
        /**
         * Identifiers of the users; always unknown and empty for non-owned stories.
         */
        public long[] userIds;

        /**
         * The story can be viewed by certain specified users.
         */
        public StoryPrivacySettingsSelectedUsers() {
        }

        /**
         * The story can be viewed by certain specified users.
         *
         * @param userIds Identifiers of the users; always unknown and empty for non-owned stories.
         */
        public StoryPrivacySettingsSelectedUsers(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1885772602;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about original story that was reposted.
     */
    public static class StoryRepostInfo extends Object {
        /**
         * Origin of the story that was reposted.
         */
        public StoryOrigin origin;
        /**
         * True, if story content was modified during reposting; otherwise, story wasn't modified.
         */
        public boolean isContentModified;

        /**
         * Contains information about original story that was reposted.
         */
        public StoryRepostInfo() {
        }

        /**
         * Contains information about original story that was reposted.
         *
         * @param origin Origin of the story that was reposted.
         * @param isContentModified True, if story content was modified during reposting; otherwise, story wasn't modified.
         */
        public StoryRepostInfo(StoryOrigin origin, boolean isContentModified) {
            this.origin = origin;
            this.isContentModified = isContentModified;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -8412096;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about a story.
     */
    public static class StoryStatistics extends Object {
        /**
         * A graph containing number of story views and shares.
         */
        public StatisticalGraph storyInteractionGraph;
        /**
         * A graph containing number of story reactions.
         */
        public StatisticalGraph storyReactionGraph;

        /**
         * A detailed statistics about a story.
         */
        public StoryStatistics() {
        }

        /**
         * A detailed statistics about a story.
         *
         * @param storyInteractionGraph A graph containing number of story views and shares.
         * @param storyReactionGraph A graph containing number of story reactions.
         */
        public StoryStatistics(StatisticalGraph storyInteractionGraph, StatisticalGraph storyReactionGraph) {
            this.storyInteractionGraph = storyInteractionGraph;
            this.storyReactionGraph = storyReactionGraph;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1178897259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a video file sent in a story.
     */
    public static class StoryVideo extends Object {
        /**
         * Duration of the video, in seconds.
         */
        public double duration;
        /**
         * Video width.
         */
        public int width;
        /**
         * Video height.
         */
        public int height;
        /**
         * True, if stickers were added to the video. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         */
        public boolean hasStickers;
        /**
         * True, if the video has no sound.
         */
        public boolean isAnimation;
        /**
         * Video minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Video thumbnail in JPEG or MPEG4 format; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * Size of file prefix, which is supposed to be preloaded, in bytes.
         */
        public int preloadPrefixSize;
        /**
         * File containing the video.
         */
        public File video;

        /**
         * Describes a video file sent in a story.
         */
        public StoryVideo() {
        }

        /**
         * Describes a video file sent in a story.
         *
         * @param duration Duration of the video, in seconds.
         * @param width Video width.
         * @param height Video height.
         * @param hasStickers True, if stickers were added to the video. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         * @param isAnimation True, if the video has no sound.
         * @param minithumbnail Video minithumbnail; may be null.
         * @param thumbnail Video thumbnail in JPEG or MPEG4 format; may be null.
         * @param preloadPrefixSize Size of file prefix, which is supposed to be preloaded, in bytes.
         * @param video File containing the video.
         */
        public StoryVideo(double duration, int width, int height, boolean hasStickers, boolean isAnimation, Minithumbnail minithumbnail, Thumbnail thumbnail, int preloadPrefixSize, File video) {
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.hasStickers = hasStickers;
            this.isAnimation = isAnimation;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.preloadPrefixSize = preloadPrefixSize;
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 140020643;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes an action suggested to the current user.
     */
    public abstract static class SuggestedAction extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SuggestedActionEnableArchiveAndMuteNewChats.CONSTRUCTOR,
            SuggestedActionCheckPassword.CONSTRUCTOR,
            SuggestedActionCheckPhoneNumber.CONSTRUCTOR,
            SuggestedActionViewChecksHint.CONSTRUCTOR,
            SuggestedActionConvertToBroadcastGroup.CONSTRUCTOR,
            SuggestedActionSetPassword.CONSTRUCTOR,
            SuggestedActionUpgradePremium.CONSTRUCTOR,
            SuggestedActionRestorePremium.CONSTRUCTOR,
            SuggestedActionSubscribeToAnnualPremium.CONSTRUCTOR,
            SuggestedActionGiftPremiumForChristmas.CONSTRUCTOR,
            SuggestedActionSetBirthdate.CONSTRUCTOR,
            SuggestedActionExtendPremium.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SuggestedAction() {
        }
    }

    /**
     * Suggests the user to enable archiveAndMuteNewChatsFromUnknownUsers setting in archiveChatListSettings.
     */
    public static class SuggestedActionEnableArchiveAndMuteNewChats extends SuggestedAction {

        /**
         * Suggests the user to enable archiveAndMuteNewChatsFromUnknownUsers setting in archiveChatListSettings.
         */
        public SuggestedActionEnableArchiveAndMuteNewChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2017586255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to check whether they still remember their 2-step verification password.
     */
    public static class SuggestedActionCheckPassword extends SuggestedAction {

        /**
         * Suggests the user to check whether they still remember their 2-step verification password.
         */
        public SuggestedActionCheckPassword() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1910534839;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to check whether authorization phone number is correct and change the phone number if it is inaccessible.
     */
    public static class SuggestedActionCheckPhoneNumber extends SuggestedAction {

        /**
         * Suggests the user to check whether authorization phone number is correct and change the phone number if it is inaccessible.
         */
        public SuggestedActionCheckPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 648771563;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to view a hint about the meaning of one and two check marks on sent messages.
     */
    public static class SuggestedActionViewChecksHint extends SuggestedAction {

        /**
         * Suggests the user to view a hint about the meaning of one and two check marks on sent messages.
         */
        public SuggestedActionViewChecksHint() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 891303239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to convert specified supergroup to a broadcast group.
     */
    public static class SuggestedActionConvertToBroadcastGroup extends SuggestedAction {
        /**
         * Supergroup identifier.
         */
        public long supergroupId;

        /**
         * Suggests the user to convert specified supergroup to a broadcast group.
         */
        public SuggestedActionConvertToBroadcastGroup() {
        }

        /**
         * Suggests the user to convert specified supergroup to a broadcast group.
         *
         * @param supergroupId Supergroup identifier.
         */
        public SuggestedActionConvertToBroadcastGroup(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -965071304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to set a 2-step verification password to be able to log in again.
     */
    public static class SuggestedActionSetPassword extends SuggestedAction {
        /**
         * The number of days to pass between consecutive authorizations if the user declines to set password; if 0, then the user is advised to set the password for security reasons.
         */
        public int authorizationDelay;

        /**
         * Suggests the user to set a 2-step verification password to be able to log in again.
         */
        public SuggestedActionSetPassword() {
        }

        /**
         * Suggests the user to set a 2-step verification password to be able to log in again.
         *
         * @param authorizationDelay The number of days to pass between consecutive authorizations if the user declines to set password; if 0, then the user is advised to set the password for security reasons.
         */
        public SuggestedActionSetPassword(int authorizationDelay) {
            this.authorizationDelay = authorizationDelay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1863613848;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to upgrade the Premium subscription from monthly payments to annual payments.
     */
    public static class SuggestedActionUpgradePremium extends SuggestedAction {

        /**
         * Suggests the user to upgrade the Premium subscription from monthly payments to annual payments.
         */
        public SuggestedActionUpgradePremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1890220539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to restore a recently expired Premium subscription.
     */
    public static class SuggestedActionRestorePremium extends SuggestedAction {

        /**
         * Suggests the user to restore a recently expired Premium subscription.
         */
        public SuggestedActionRestorePremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -385229468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to subscribe to the Premium subscription with annual payments.
     */
    public static class SuggestedActionSubscribeToAnnualPremium extends SuggestedAction {

        /**
         * Suggests the user to subscribe to the Premium subscription with annual payments.
         */
        public SuggestedActionSubscribeToAnnualPremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 373913787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to gift Telegram Premium to friends for Christmas.
     */
    public static class SuggestedActionGiftPremiumForChristmas extends SuggestedAction {

        /**
         * Suggests the user to gift Telegram Premium to friends for Christmas.
         */
        public SuggestedActionGiftPremiumForChristmas() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1816924561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to set birthdate.
     */
    public static class SuggestedActionSetBirthdate extends SuggestedAction {

        /**
         * Suggests the user to set birthdate.
         */
        public SuggestedActionSetBirthdate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -356672766;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to extend their expiring Telegram Premium subscription.
     */
    public static class SuggestedActionExtendPremium extends SuggestedAction {
        /**
         * A URL for managing Telegram Premium subscription.
         */
        public String managePremiumSubscriptionUrl;

        /**
         * Suggests the user to extend their expiring Telegram Premium subscription.
         */
        public SuggestedActionExtendPremium() {
        }

        /**
         * Suggests the user to extend their expiring Telegram Premium subscription.
         *
         * @param managePremiumSubscriptionUrl A URL for managing Telegram Premium subscription.
         */
        public SuggestedActionExtendPremium(String managePremiumSubscriptionUrl) {
            this.managePremiumSubscriptionUrl = managePremiumSubscriptionUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -566207286;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers.
     */
    public static class Supergroup extends Object {
        /**
         * Supergroup or channel identifier.
         */
        public long id;
        /**
         * Usernames of the supergroup or channel; may be null.
         */
        @Nullable public Usernames usernames;
        /**
         * Point in time (Unix timestamp) when the current user joined, or the point in time when the supergroup or channel was created, in case the user is not a member.
         */
        public int date;
        /**
         * Status of the current user in the supergroup or channel; custom title will always be empty.
         */
        public ChatMemberStatus status;
        /**
         * Number of members in the supergroup or channel; 0 if unknown. Currently, it is guaranteed to be known only if the supergroup or channel was received through getChatSimilarChats, getChatsToSendStories, getCreatedPublicChats, getGroupsInCommon, getInactiveSupergroupChats, getRecommendedChats, getSuitableDiscussionChats, getUserPrivacySettingRules, getVideoChatAvailableParticipants, searchChatsNearby, searchPublicChats, or in chatFolderInviteLinkInfo.missingChatIds, or in userFullInfo.personalChatId, or for chats with messages or stories from publicForwards.
         */
        public int memberCount;
        /**
         * Approximate boost level for the chat.
         */
        public int boostLevel;
        /**
         * True, if the channel has a discussion group, or the supergroup is the designated discussion group for a channel.
         */
        public boolean hasLinkedChat;
        /**
         * True, if the supergroup is connected to a location, i.e. the supergroup is a location-based supergroup.
         */
        public boolean hasLocation;
        /**
         * True, if messages sent to the channel need to contain information about the sender. This field is only applicable to channels.
         */
        public boolean signMessages;
        /**
         * True, if users need to join the supergroup before they can send messages. Always true for channels and non-discussion supergroups.
         */
        public boolean joinToSendMessages;
        /**
         * True, if all users directly joining the supergroup need to be approved by supergroup administrators. Always false for channels and supergroups without username, location, or a linked chat.
         */
        public boolean joinByRequest;
        /**
         * True, if the slow mode is enabled in the supergroup.
         */
        public boolean isSlowModeEnabled;
        /**
         * True, if the supergroup is a channel.
         */
        public boolean isChannel;
        /**
         * True, if the supergroup is a broadcast group, i.e. only administrators can send messages and there is no limit on the number of members.
         */
        public boolean isBroadcastGroup;
        /**
         * True, if the supergroup is a forum with topics.
         */
        public boolean isForum;
        /**
         * True, if the supergroup or channel is verified.
         */
        public boolean isVerified;
        /**
         * If non-empty, contains a human-readable description of the reason why access to this supergroup or channel must be restricted.
         */
        public String restrictionReason;
        /**
         * True, if many users reported this supergroup or channel as a scam.
         */
        public boolean isScam;
        /**
         * True, if many users reported this supergroup or channel as a fake account.
         */
        public boolean isFake;
        /**
         * True, if the supergroup or channel has non-expired stories available to the current user.
         */
        public boolean hasActiveStories;
        /**
         * True, if the supergroup or channel has unread non-expired stories available to the current user.
         */
        public boolean hasUnreadActiveStories;

        /**
         * Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers.
         */
        public Supergroup() {
        }

        /**
         * Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers.
         *
         * @param id Supergroup or channel identifier.
         * @param usernames Usernames of the supergroup or channel; may be null.
         * @param date Point in time (Unix timestamp) when the current user joined, or the point in time when the supergroup or channel was created, in case the user is not a member.
         * @param status Status of the current user in the supergroup or channel; custom title will always be empty.
         * @param memberCount Number of members in the supergroup or channel; 0 if unknown. Currently, it is guaranteed to be known only if the supergroup or channel was received through getChatSimilarChats, getChatsToSendStories, getCreatedPublicChats, getGroupsInCommon, getInactiveSupergroupChats, getRecommendedChats, getSuitableDiscussionChats, getUserPrivacySettingRules, getVideoChatAvailableParticipants, searchChatsNearby, searchPublicChats, or in chatFolderInviteLinkInfo.missingChatIds, or in userFullInfo.personalChatId, or for chats with messages or stories from publicForwards.
         * @param boostLevel Approximate boost level for the chat.
         * @param hasLinkedChat True, if the channel has a discussion group, or the supergroup is the designated discussion group for a channel.
         * @param hasLocation True, if the supergroup is connected to a location, i.e. the supergroup is a location-based supergroup.
         * @param signMessages True, if messages sent to the channel need to contain information about the sender. This field is only applicable to channels.
         * @param joinToSendMessages True, if users need to join the supergroup before they can send messages. Always true for channels and non-discussion supergroups.
         * @param joinByRequest True, if all users directly joining the supergroup need to be approved by supergroup administrators. Always false for channels and supergroups without username, location, or a linked chat.
         * @param isSlowModeEnabled True, if the slow mode is enabled in the supergroup.
         * @param isChannel True, if the supergroup is a channel.
         * @param isBroadcastGroup True, if the supergroup is a broadcast group, i.e. only administrators can send messages and there is no limit on the number of members.
         * @param isForum True, if the supergroup is a forum with topics.
         * @param isVerified True, if the supergroup or channel is verified.
         * @param restrictionReason If non-empty, contains a human-readable description of the reason why access to this supergroup or channel must be restricted.
         * @param isScam True, if many users reported this supergroup or channel as a scam.
         * @param isFake True, if many users reported this supergroup or channel as a fake account.
         * @param hasActiveStories True, if the supergroup or channel has non-expired stories available to the current user.
         * @param hasUnreadActiveStories True, if the supergroup or channel has unread non-expired stories available to the current user.
         */
        public Supergroup(long id, Usernames usernames, int date, ChatMemberStatus status, int memberCount, int boostLevel, boolean hasLinkedChat, boolean hasLocation, boolean signMessages, boolean joinToSendMessages, boolean joinByRequest, boolean isSlowModeEnabled, boolean isChannel, boolean isBroadcastGroup, boolean isForum, boolean isVerified, String restrictionReason, boolean isScam, boolean isFake, boolean hasActiveStories, boolean hasUnreadActiveStories) {
            this.id = id;
            this.usernames = usernames;
            this.date = date;
            this.status = status;
            this.memberCount = memberCount;
            this.boostLevel = boostLevel;
            this.hasLinkedChat = hasLinkedChat;
            this.hasLocation = hasLocation;
            this.signMessages = signMessages;
            this.joinToSendMessages = joinToSendMessages;
            this.joinByRequest = joinByRequest;
            this.isSlowModeEnabled = isSlowModeEnabled;
            this.isChannel = isChannel;
            this.isBroadcastGroup = isBroadcastGroup;
            this.isForum = isForum;
            this.isVerified = isVerified;
            this.restrictionReason = restrictionReason;
            this.isScam = isScam;
            this.isFake = isFake;
            this.hasActiveStories = hasActiveStories;
            this.hasUnreadActiveStories = hasUnreadActiveStories;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 966869641;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains full information about a supergroup or channel.
     */
    public static class SupergroupFullInfo extends Object {
        /**
         * Chat photo; may be null if empty or unknown. If non-null, then it is the same photo as in chat.photo.
         */
        @Nullable public ChatPhoto photo;
        /**
         * Supergroup or channel description.
         */
        public String description;
        /**
         * Number of members in the supergroup or channel; 0 if unknown.
         */
        public int memberCount;
        /**
         * Number of privileged users in the supergroup or channel; 0 if unknown.
         */
        public int administratorCount;
        /**
         * Number of restricted users in the supergroup; 0 if unknown.
         */
        public int restrictedCount;
        /**
         * Number of users banned from chat; 0 if unknown.
         */
        public int bannedCount;
        /**
         * Chat identifier of a discussion group for the channel, or a channel, for which the supergroup is the designated discussion group; 0 if none or unknown.
         */
        public long linkedChatId;
        /**
         * Delay between consecutive sent messages for non-administrator supergroup members, in seconds.
         */
        public int slowModeDelay;
        /**
         * Time left before next message can be sent in the supergroup, in seconds. An updateSupergroupFullInfo update is not triggered when value of this field changes, but both new and old values are non-zero.
         */
        public double slowModeDelayExpiresIn;
        /**
         * True, if members of the chat can be retrieved via getSupergroupMembers or searchChatMembers.
         */
        public boolean canGetMembers;
        /**
         * True, if non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers.
         */
        public boolean hasHiddenMembers;
        /**
         * True, if non-administrators and non-bots can be hidden in responses to getSupergroupMembers and searchChatMembers for non-administrators.
         */
        public boolean canHideMembers;
        /**
         * True, if the supergroup sticker set can be changed.
         */
        public boolean canSetStickerSet;
        /**
         * True, if the supergroup location can be changed.
         */
        public boolean canSetLocation;
        /**
         * True, if the supergroup or channel statistics are available.
         */
        public boolean canGetStatistics;
        /**
         * True, if the supergroup or channel revenue statistics are available.
         */
        public boolean canGetRevenueStatistics;
        /**
         * True, if the supergroup or channel Telegram Star revenue statistics are available.
         */
        public boolean canGetStarRevenueStatistics;
        /**
         * True, if aggressive anti-spam checks can be enabled or disabled in the supergroup.
         */
        public boolean canToggleAggressiveAntiSpam;
        /**
         * True, if new chat members will have access to old messages. In public, discussion, of forum groups and all channels, old messages are always available, so this option affects only private non-forum supergroups without a linked chat. The value of this field is only available to chat administrators.
         */
        public boolean isAllHistoryAvailable;
        /**
         * True, if the chat can have sponsored messages. The value of this field is only available to the owner of the chat.
         */
        public boolean canHaveSponsoredMessages;
        /**
         * True, if aggressive anti-spam checks are enabled in the supergroup. The value of this field is only available to chat administrators.
         */
        public boolean hasAggressiveAntiSpamEnabled;
        /**
         * True, if paid media can be sent and forwarded to the channel chat; for channels only.
         */
        public boolean hasPaidMediaAllowed;
        /**
         * True, if the supergroup or channel has pinned stories.
         */
        public boolean hasPinnedStories;
        /**
         * Number of times the current user boosted the supergroup or channel.
         */
        public int myBoostCount;
        /**
         * Number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; 0 if unspecified.
         */
        public int unrestrictBoostCount;
        /**
         * Identifier of the supergroup sticker set that must be shown before user sticker sets; 0 if none.
         */
        public long stickerSetId;
        /**
         * Identifier of the custom emoji sticker set that can be used in the supergroup without Telegram Premium subscription; 0 if none.
         */
        public long customEmojiStickerSetId;
        /**
         * Location to which the supergroup is connected; may be null if none.
         */
        @Nullable public ChatLocation location;
        /**
         * Primary invite link for the chat; may be null. For chat administrators with canInviteUsers right only.
         */
        @Nullable public ChatInviteLink inviteLink;
        /**
         * List of commands of bots in the group.
         */
        public BotCommands[] botCommands;
        /**
         * Identifier of the basic group from which supergroup was upgraded; 0 if none.
         */
        public long upgradedFromBasicGroupId;
        /**
         * Identifier of the last message in the basic group from which supergroup was upgraded; 0 if none.
         */
        public long upgradedFromMaxMessageId;

        /**
         * Contains full information about a supergroup or channel.
         */
        public SupergroupFullInfo() {
        }

        /**
         * Contains full information about a supergroup or channel.
         *
         * @param photo Chat photo; may be null if empty or unknown. If non-null, then it is the same photo as in chat.photo.
         * @param description Supergroup or channel description.
         * @param memberCount Number of members in the supergroup or channel; 0 if unknown.
         * @param administratorCount Number of privileged users in the supergroup or channel; 0 if unknown.
         * @param restrictedCount Number of restricted users in the supergroup; 0 if unknown.
         * @param bannedCount Number of users banned from chat; 0 if unknown.
         * @param linkedChatId Chat identifier of a discussion group for the channel, or a channel, for which the supergroup is the designated discussion group; 0 if none or unknown.
         * @param slowModeDelay Delay between consecutive sent messages for non-administrator supergroup members, in seconds.
         * @param slowModeDelayExpiresIn Time left before next message can be sent in the supergroup, in seconds. An updateSupergroupFullInfo update is not triggered when value of this field changes, but both new and old values are non-zero.
         * @param canGetMembers True, if members of the chat can be retrieved via getSupergroupMembers or searchChatMembers.
         * @param hasHiddenMembers True, if non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers.
         * @param canHideMembers True, if non-administrators and non-bots can be hidden in responses to getSupergroupMembers and searchChatMembers for non-administrators.
         * @param canSetStickerSet True, if the supergroup sticker set can be changed.
         * @param canSetLocation True, if the supergroup location can be changed.
         * @param canGetStatistics True, if the supergroup or channel statistics are available.
         * @param canGetRevenueStatistics True, if the supergroup or channel revenue statistics are available.
         * @param canGetStarRevenueStatistics True, if the supergroup or channel Telegram Star revenue statistics are available.
         * @param canToggleAggressiveAntiSpam True, if aggressive anti-spam checks can be enabled or disabled in the supergroup.
         * @param isAllHistoryAvailable True, if new chat members will have access to old messages. In public, discussion, of forum groups and all channels, old messages are always available, so this option affects only private non-forum supergroups without a linked chat. The value of this field is only available to chat administrators.
         * @param canHaveSponsoredMessages True, if the chat can have sponsored messages. The value of this field is only available to the owner of the chat.
         * @param hasAggressiveAntiSpamEnabled True, if aggressive anti-spam checks are enabled in the supergroup. The value of this field is only available to chat administrators.
         * @param hasPaidMediaAllowed True, if paid media can be sent and forwarded to the channel chat; for channels only.
         * @param hasPinnedStories True, if the supergroup or channel has pinned stories.
         * @param myBoostCount Number of times the current user boosted the supergroup or channel.
         * @param unrestrictBoostCount Number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; 0 if unspecified.
         * @param stickerSetId Identifier of the supergroup sticker set that must be shown before user sticker sets; 0 if none.
         * @param customEmojiStickerSetId Identifier of the custom emoji sticker set that can be used in the supergroup without Telegram Premium subscription; 0 if none.
         * @param location Location to which the supergroup is connected; may be null if none.
         * @param inviteLink Primary invite link for the chat; may be null. For chat administrators with canInviteUsers right only.
         * @param botCommands List of commands of bots in the group.
         * @param upgradedFromBasicGroupId Identifier of the basic group from which supergroup was upgraded; 0 if none.
         * @param upgradedFromMaxMessageId Identifier of the last message in the basic group from which supergroup was upgraded; 0 if none.
         */
        public SupergroupFullInfo(ChatPhoto photo, String description, int memberCount, int administratorCount, int restrictedCount, int bannedCount, long linkedChatId, int slowModeDelay, double slowModeDelayExpiresIn, boolean canGetMembers, boolean hasHiddenMembers, boolean canHideMembers, boolean canSetStickerSet, boolean canSetLocation, boolean canGetStatistics, boolean canGetRevenueStatistics, boolean canGetStarRevenueStatistics, boolean canToggleAggressiveAntiSpam, boolean isAllHistoryAvailable, boolean canHaveSponsoredMessages, boolean hasAggressiveAntiSpamEnabled, boolean hasPaidMediaAllowed, boolean hasPinnedStories, int myBoostCount, int unrestrictBoostCount, long stickerSetId, long customEmojiStickerSetId, ChatLocation location, ChatInviteLink inviteLink, BotCommands[] botCommands, long upgradedFromBasicGroupId, long upgradedFromMaxMessageId) {
            this.photo = photo;
            this.description = description;
            this.memberCount = memberCount;
            this.administratorCount = administratorCount;
            this.restrictedCount = restrictedCount;
            this.bannedCount = bannedCount;
            this.linkedChatId = linkedChatId;
            this.slowModeDelay = slowModeDelay;
            this.slowModeDelayExpiresIn = slowModeDelayExpiresIn;
            this.canGetMembers = canGetMembers;
            this.hasHiddenMembers = hasHiddenMembers;
            this.canHideMembers = canHideMembers;
            this.canSetStickerSet = canSetStickerSet;
            this.canSetLocation = canSetLocation;
            this.canGetStatistics = canGetStatistics;
            this.canGetRevenueStatistics = canGetRevenueStatistics;
            this.canGetStarRevenueStatistics = canGetStarRevenueStatistics;
            this.canToggleAggressiveAntiSpam = canToggleAggressiveAntiSpam;
            this.isAllHistoryAvailable = isAllHistoryAvailable;
            this.canHaveSponsoredMessages = canHaveSponsoredMessages;
            this.hasAggressiveAntiSpamEnabled = hasAggressiveAntiSpamEnabled;
            this.hasPaidMediaAllowed = hasPaidMediaAllowed;
            this.hasPinnedStories = hasPinnedStories;
            this.myBoostCount = myBoostCount;
            this.unrestrictBoostCount = unrestrictBoostCount;
            this.stickerSetId = stickerSetId;
            this.customEmojiStickerSetId = customEmojiStickerSetId;
            this.location = location;
            this.inviteLink = inviteLink;
            this.botCommands = botCommands;
            this.upgradedFromBasicGroupId = upgradedFromBasicGroupId;
            this.upgradedFromMaxMessageId = upgradedFromMaxMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 493566627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Specifies the kind of chat members to return in getSupergroupMembers.
     */
    public abstract static class SupergroupMembersFilter extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SupergroupMembersFilterRecent.CONSTRUCTOR,
            SupergroupMembersFilterContacts.CONSTRUCTOR,
            SupergroupMembersFilterAdministrators.CONSTRUCTOR,
            SupergroupMembersFilterSearch.CONSTRUCTOR,
            SupergroupMembersFilterRestricted.CONSTRUCTOR,
            SupergroupMembersFilterBanned.CONSTRUCTOR,
            SupergroupMembersFilterMention.CONSTRUCTOR,
            SupergroupMembersFilterBots.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SupergroupMembersFilter() {
        }
    }

    /**
     * Returns recently active users in reverse chronological order.
     */
    public static class SupergroupMembersFilterRecent extends SupergroupMembersFilter {

        /**
         * Returns recently active users in reverse chronological order.
         */
        public SupergroupMembersFilterRecent() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1178199509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns contacts of the user, which are members of the supergroup or channel.
     */
    public static class SupergroupMembersFilterContacts extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Returns contacts of the user, which are members of the supergroup or channel.
         */
        public SupergroupMembersFilterContacts() {
        }

        /**
         * Returns contacts of the user, which are members of the supergroup or channel.
         *
         * @param query Query to search for.
         */
        public SupergroupMembersFilterContacts(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1282910856;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the owner and administrators.
     */
    public static class SupergroupMembersFilterAdministrators extends SupergroupMembersFilter {

        /**
         * Returns the owner and administrators.
         */
        public SupergroupMembersFilterAdministrators() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2097380265;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Used to search for supergroup or channel members via a (string) query.
     */
    public static class SupergroupMembersFilterSearch extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Used to search for supergroup or channel members via a (string) query.
         */
        public SupergroupMembersFilterSearch() {
        }

        /**
         * Used to search for supergroup or channel members via a (string) query.
         *
         * @param query Query to search for.
         */
        public SupergroupMembersFilterSearch(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1696358469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns restricted supergroup members; can be used only by administrators.
     */
    public static class SupergroupMembersFilterRestricted extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Returns restricted supergroup members; can be used only by administrators.
         */
        public SupergroupMembersFilterRestricted() {
        }

        /**
         * Returns restricted supergroup members; can be used only by administrators.
         *
         * @param query Query to search for.
         */
        public SupergroupMembersFilterRestricted(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1107800034;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users banned from the supergroup or channel; can be used only by administrators.
     */
    public static class SupergroupMembersFilterBanned extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Returns users banned from the supergroup or channel; can be used only by administrators.
         */
        public SupergroupMembersFilterBanned() {
        }

        /**
         * Returns users banned from the supergroup or channel; can be used only by administrators.
         *
         * @param query Query to search for.
         */
        public SupergroupMembersFilterBanned(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1210621683;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users which can be mentioned in the supergroup.
     */
    public static class SupergroupMembersFilterMention extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;
        /**
         * If non-zero, the identifier of the current message thread.
         */
        public long messageThreadId;

        /**
         * Returns users which can be mentioned in the supergroup.
         */
        public SupergroupMembersFilterMention() {
        }

        /**
         * Returns users which can be mentioned in the supergroup.
         *
         * @param query Query to search for.
         * @param messageThreadId If non-zero, the identifier of the current message thread.
         */
        public SupergroupMembersFilterMention(String query, long messageThreadId) {
            this.query = query;
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 947915036;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns bot members of the supergroup or channel.
     */
    public static class SupergroupMembersFilterBots extends SupergroupMembersFilter {

        /**
         * Returns bot members of the supergroup or channel.
         */
        public SupergroupMembersFilterBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 492138918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a URL linking to an internal Telegram entity.
     */
    public static class TMeUrl extends Object {
        /**
         * URL.
         */
        public String url;
        /**
         * Type of the URL.
         */
        public TMeUrlType type;

        /**
         * Represents a URL linking to an internal Telegram entity.
         */
        public TMeUrl() {
        }

        /**
         * Represents a URL linking to an internal Telegram entity.
         *
         * @param url URL.
         * @param type Type of the URL.
         */
        public TMeUrl(String url, TMeUrlType type) {
            this.url = url;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1140786622;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of URL linking to an internal Telegram entity.
     */
    public abstract static class TMeUrlType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TMeUrlTypeUser.CONSTRUCTOR,
            TMeUrlTypeSupergroup.CONSTRUCTOR,
            TMeUrlTypeChatInvite.CONSTRUCTOR,
            TMeUrlTypeStickerSet.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TMeUrlType() {
        }
    }

    /**
     * A URL linking to a user.
     */
    public static class TMeUrlTypeUser extends TMeUrlType {
        /**
         * Identifier of the user.
         */
        public long userId;

        /**
         * A URL linking to a user.
         */
        public TMeUrlTypeUser() {
        }

        /**
         * A URL linking to a user.
         *
         * @param userId Identifier of the user.
         */
        public TMeUrlTypeUser(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 125336602;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A URL linking to a public supergroup or channel.
     */
    public static class TMeUrlTypeSupergroup extends TMeUrlType {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;

        /**
         * A URL linking to a public supergroup or channel.
         */
        public TMeUrlTypeSupergroup() {
        }

        /**
         * A URL linking to a public supergroup or channel.
         *
         * @param supergroupId Identifier of the supergroup or channel.
         */
        public TMeUrlTypeSupergroup(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1353369944;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat invite link.
     */
    public static class TMeUrlTypeChatInvite extends TMeUrlType {
        /**
         * Information about the chat invite link.
         */
        public ChatInviteLinkInfo info;

        /**
         * A chat invite link.
         */
        public TMeUrlTypeChatInvite() {
        }

        /**
         * A chat invite link.
         *
         * @param info Information about the chat invite link.
         */
        public TMeUrlTypeChatInvite(ChatInviteLinkInfo info) {
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 313907785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A URL linking to a sticker set.
     */
    public static class TMeUrlTypeStickerSet extends TMeUrlType {
        /**
         * Identifier of the sticker set.
         */
        public long stickerSetId;

        /**
         * A URL linking to a sticker set.
         */
        public TMeUrlTypeStickerSet() {
        }

        /**
         * A URL linking to a sticker set.
         *
         * @param stickerSetId Identifier of the sticker set.
         */
        public TMeUrlTypeStickerSet(long stickerSetId) {
            this.stickerSetId = stickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1602473196;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of t.me URLs.
     */
    public static class TMeUrls extends Object {
        /**
         * List of URLs.
         */
        public TMeUrl[] urls;

        /**
         * Contains a list of t.me URLs.
         */
        public TMeUrls() {
        }

        /**
         * Contains a list of t.me URLs.
         *
         * @param urls List of URLs.
         */
        public TMeUrls(TMeUrl[] urls) {
            this.urls = urls;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1130595098;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the target chat to be opened.
     */
    public abstract static class TargetChat extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TargetChatCurrent.CONSTRUCTOR,
            TargetChatChosen.CONSTRUCTOR,
            TargetChatInternalLink.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TargetChat() {
        }
    }

    /**
     * The currently opened chat needs to be kept.
     */
    public static class TargetChatCurrent extends TargetChat {

        /**
         * The currently opened chat needs to be kept.
         */
        public TargetChatCurrent() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -416689904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat needs to be chosen by the user among chats of the specified types.
     */
    public static class TargetChatChosen extends TargetChat {
        /**
         * True, if private chats with ordinary users are allowed.
         */
        public boolean allowUserChats;
        /**
         * True, if private chats with other bots are allowed.
         */
        public boolean allowBotChats;
        /**
         * True, if basic group and supergroup chats are allowed.
         */
        public boolean allowGroupChats;
        /**
         * True, if channel chats are allowed.
         */
        public boolean allowChannelChats;

        /**
         * The chat needs to be chosen by the user among chats of the specified types.
         */
        public TargetChatChosen() {
        }

        /**
         * The chat needs to be chosen by the user among chats of the specified types.
         *
         * @param allowUserChats True, if private chats with ordinary users are allowed.
         * @param allowBotChats True, if private chats with other bots are allowed.
         * @param allowGroupChats True, if basic group and supergroup chats are allowed.
         * @param allowChannelChats True, if channel chats are allowed.
         */
        public TargetChatChosen(boolean allowUserChats, boolean allowBotChats, boolean allowGroupChats, boolean allowChannelChats) {
            this.allowUserChats = allowUserChats;
            this.allowBotChats = allowBotChats;
            this.allowGroupChats = allowGroupChats;
            this.allowChannelChats = allowChannelChats;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -307442990;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat needs to be open with the provided internal link.
     */
    public static class TargetChatInternalLink extends TargetChat {
        /**
         * An internal link pointing to the chat.
         */
        public InternalLinkType link;

        /**
         * The chat needs to be open with the provided internal link.
         */
        public TargetChatInternalLink() {
        }

        /**
         * The chat needs to be open with the provided internal link.
         *
         * @param link An internal link pointing to the chat.
         */
        public TargetChatInternalLink(InternalLinkType link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -579301408;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a purpose of a payment toward Telegram.
     */
    public abstract static class TelegramPaymentPurpose extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TelegramPaymentPurposePremiumGiftCodes.CONSTRUCTOR,
            TelegramPaymentPurposePremiumGiveaway.CONSTRUCTOR,
            TelegramPaymentPurposeStars.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TelegramPaymentPurpose() {
        }
    }

    /**
     * The user creating Telegram Premium gift codes for other users.
     */
    public static class TelegramPaymentPurposePremiumGiftCodes extends TelegramPaymentPurpose {
        /**
         * Identifier of the supergroup or channel chat, which will be automatically boosted by the users for duration of the Premium subscription and which is administered by the user; 0 if none.
         */
        public long boostedChatId;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Identifiers of the users which can activate the gift codes.
         */
        public long[] userIds;
        /**
         * Number of months the Telegram Premium subscription will be active for the users.
         */
        public int monthCount;

        /**
         * The user creating Telegram Premium gift codes for other users.
         */
        public TelegramPaymentPurposePremiumGiftCodes() {
        }

        /**
         * The user creating Telegram Premium gift codes for other users.
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which will be automatically boosted by the users for duration of the Premium subscription and which is administered by the user; 0 if none.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param userIds Identifiers of the users which can activate the gift codes.
         * @param monthCount Number of months the Telegram Premium subscription will be active for the users.
         */
        public TelegramPaymentPurposePremiumGiftCodes(long boostedChatId, String currency, long amount, long[] userIds, int monthCount) {
            this.boostedChatId = boostedChatId;
            this.currency = currency;
            this.amount = amount;
            this.userIds = userIds;
            this.monthCount = monthCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1637144394;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user creating a Telegram Premium giveaway.
     */
    public static class TelegramPaymentPurposePremiumGiveaway extends TelegramPaymentPurpose {
        /**
         * Giveaway parameters.
         */
        public PremiumGiveawayParameters parameters;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of users which will be able to activate the gift codes.
         */
        public int winnerCount;
        /**
         * Number of months the Telegram Premium subscription will be active for the users.
         */
        public int monthCount;

        /**
         * The user creating a Telegram Premium giveaway.
         */
        public TelegramPaymentPurposePremiumGiveaway() {
        }

        /**
         * The user creating a Telegram Premium giveaway.
         *
         * @param parameters Giveaway parameters.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param winnerCount Number of users which will be able to activate the gift codes.
         * @param monthCount Number of months the Telegram Premium subscription will be active for the users.
         */
        public TelegramPaymentPurposePremiumGiveaway(PremiumGiveawayParameters parameters, String currency, long amount, int winnerCount, int monthCount) {
            this.parameters = parameters;
            this.currency = currency;
            this.amount = amount;
            this.winnerCount = winnerCount;
            this.monthCount = monthCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1076583897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user buying Telegram stars.
     */
    public static class TelegramPaymentPurposeStars extends TelegramPaymentPurpose {
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of bought stars.
         */
        public long starCount;

        /**
         * The user buying Telegram stars.
         */
        public TelegramPaymentPurposeStars() {
        }

        /**
         * The user buying Telegram stars.
         *
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param starCount Number of bought stars.
         */
        public TelegramPaymentPurposeStars(String currency, long amount, long starCount) {
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -495718830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the availability of a temporary password, which can be used for payments.
     */
    public static class TemporaryPasswordState extends Object {
        /**
         * True, if a temporary password is available.
         */
        public boolean hasPassword;
        /**
         * Time left before the temporary password expires, in seconds.
         */
        public int validFor;

        /**
         * Returns information about the availability of a temporary password, which can be used for payments.
         */
        public TemporaryPasswordState() {
        }

        /**
         * Returns information about the availability of a temporary password, which can be used for payments.
         *
         * @param hasPassword True, if a temporary password is available.
         * @param validFor Time left before the temporary password expires, in seconds.
         */
        public TemporaryPasswordState(boolean hasPassword, int validFor) {
            this.hasPassword = hasPassword;
            this.validFor = validFor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 939837410;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains Telegram terms of service.
     */
    public static class TermsOfService extends Object {
        /**
         * Text of the terms of service.
         */
        public FormattedText text;
        /**
         * The minimum age of a user to be able to accept the terms; 0 if age isn't restricted.
         */
        public int minUserAge;
        /**
         * True, if a blocking popup with terms of service must be shown to the user.
         */
        public boolean showPopup;

        /**
         * Contains Telegram terms of service.
         */
        public TermsOfService() {
        }

        /**
         * Contains Telegram terms of service.
         *
         * @param text Text of the terms of service.
         * @param minUserAge The minimum age of a user to be able to accept the terms; 0 if age isn't restricted.
         * @param showPopup True, if a blocking popup with terms of service must be shown to the user.
         */
        public TermsOfService(FormattedText text, int minUserAge, boolean showPopup) {
            this.text = text;
            this.minUserAge = minUserAge;
            this.showPopup = showPopup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 739422597;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a sequence of bytes; for testing only.
     */
    public static class TestBytes extends Object {
        /**
         * Bytes.
         */
        public byte[] value;

        /**
         * A simple object containing a sequence of bytes; for testing only.
         */
        public TestBytes() {
        }

        /**
         * A simple object containing a sequence of bytes; for testing only.
         *
         * @param value Bytes.
         */
        public TestBytes(byte[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1541225250;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a number; for testing only.
     */
    public static class TestInt extends Object {
        /**
         * Number.
         */
        public int value;

        /**
         * A simple object containing a number; for testing only.
         */
        public TestInt() {
        }

        /**
         * A simple object containing a number; for testing only.
         *
         * @param value Number.
         */
        public TestInt(int value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -574804983;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a string; for testing only.
     */
    public static class TestString extends Object {
        /**
         * String.
         */
        public String value;

        /**
         * A simple object containing a string; for testing only.
         */
        public TestString() {
        }

        /**
         * A simple object containing a string; for testing only.
         *
         * @param value String.
         */
        public TestString(String value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -27891572;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a vector of numbers; for testing only.
     */
    public static class TestVectorInt extends Object {
        /**
         * Vector of numbers.
         */
        public int[] value;

        /**
         * A simple object containing a vector of numbers; for testing only.
         */
        public TestVectorInt() {
        }

        /**
         * A simple object containing a vector of numbers; for testing only.
         *
         * @param value Vector of numbers.
         */
        public TestVectorInt(int[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 593682027;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a vector of objects that hold a number; for testing only.
     */
    public static class TestVectorIntObject extends Object {
        /**
         * Vector of objects.
         */
        public TestInt[] value;

        /**
         * A simple object containing a vector of objects that hold a number; for testing only.
         */
        public TestVectorIntObject() {
        }

        /**
         * A simple object containing a vector of objects that hold a number; for testing only.
         *
         * @param value Vector of objects.
         */
        public TestVectorIntObject(TestInt[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 125891546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a vector of strings; for testing only.
     */
    public static class TestVectorString extends Object {
        /**
         * Vector of strings.
         */
        public String[] value;

        /**
         * A simple object containing a vector of strings; for testing only.
         */
        public TestVectorString() {
        }

        /**
         * A simple object containing a vector of strings; for testing only.
         *
         * @param value Vector of strings.
         */
        public TestVectorString(String[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 79339995;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a vector of objects that hold a string; for testing only.
     */
    public static class TestVectorStringObject extends Object {
        /**
         * Vector of objects.
         */
        public TestString[] value;

        /**
         * A simple object containing a vector of objects that hold a string; for testing only.
         */
        public TestVectorStringObject() {
        }

        /**
         * A simple object containing a vector of objects that hold a string; for testing only.
         *
         * @param value Vector of objects.
         */
        public TestVectorStringObject(TestString[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 80780537;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains some text.
     */
    public static class Text extends Object {
        /**
         * Text.
         */
        public String text;

        /**
         * Contains some text.
         */
        public Text() {
        }

        /**
         * Contains some text.
         *
         * @param text Text.
         */
        public Text(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 578181272;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of text entities.
     */
    public static class TextEntities extends Object {
        /**
         * List of text entities.
         */
        public TextEntity[] entities;

        /**
         * Contains a list of text entities.
         */
        public TextEntities() {
        }

        /**
         * Contains a list of text entities.
         *
         * @param entities List of text entities.
         */
        public TextEntities(TextEntity[] entities) {
            this.entities = entities;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -933199172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a part of the text that needs to be formatted in some unusual way.
     */
    public static class TextEntity extends Object {
        /**
         * Offset of the entity, in UTF-16 code units.
         */
        public int offset;
        /**
         * Length of the entity, in UTF-16 code units.
         */
        public int length;
        /**
         * Type of the entity.
         */
        public TextEntityType type;

        /**
         * Represents a part of the text that needs to be formatted in some unusual way.
         */
        public TextEntity() {
        }

        /**
         * Represents a part of the text that needs to be formatted in some unusual way.
         *
         * @param offset Offset of the entity, in UTF-16 code units.
         * @param length Length of the entity, in UTF-16 code units.
         * @param type Type of the entity.
         */
        public TextEntity(int offset, int length, TextEntityType type) {
            this.offset = offset;
            this.length = length;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1951688280;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a part of the text which must be formatted differently.
     */
    public abstract static class TextEntityType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TextEntityTypeMention.CONSTRUCTOR,
            TextEntityTypeHashtag.CONSTRUCTOR,
            TextEntityTypeCashtag.CONSTRUCTOR,
            TextEntityTypeBotCommand.CONSTRUCTOR,
            TextEntityTypeUrl.CONSTRUCTOR,
            TextEntityTypeEmailAddress.CONSTRUCTOR,
            TextEntityTypePhoneNumber.CONSTRUCTOR,
            TextEntityTypeBankCardNumber.CONSTRUCTOR,
            TextEntityTypeBold.CONSTRUCTOR,
            TextEntityTypeItalic.CONSTRUCTOR,
            TextEntityTypeUnderline.CONSTRUCTOR,
            TextEntityTypeStrikethrough.CONSTRUCTOR,
            TextEntityTypeSpoiler.CONSTRUCTOR,
            TextEntityTypeCode.CONSTRUCTOR,
            TextEntityTypePre.CONSTRUCTOR,
            TextEntityTypePreCode.CONSTRUCTOR,
            TextEntityTypeBlockQuote.CONSTRUCTOR,
            TextEntityTypeExpandableBlockQuote.CONSTRUCTOR,
            TextEntityTypeTextUrl.CONSTRUCTOR,
            TextEntityTypeMentionName.CONSTRUCTOR,
            TextEntityTypeCustomEmoji.CONSTRUCTOR,
            TextEntityTypeMediaTimestamp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TextEntityType() {
        }
    }

    /**
     * A mention of a user, a supergroup, or a channel by their username.
     */
    public static class TextEntityTypeMention extends TextEntityType {

        /**
         * A mention of a user, a supergroup, or a channel by their username.
         */
        public TextEntityTypeMention() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 934535013;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A hashtag text, beginning with &quot;#&quot;.
     */
    public static class TextEntityTypeHashtag extends TextEntityType {

        /**
         * A hashtag text, beginning with &quot;#&quot;.
         */
        public TextEntityTypeHashtag() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1023958307;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A cashtag text, beginning with &quot;$&quot; and consisting of capital English letters (e.g., &quot;$USD&quot;).
     */
    public static class TextEntityTypeCashtag extends TextEntityType {

        /**
         * A cashtag text, beginning with &quot;$&quot; and consisting of capital English letters (e.g., &quot;$USD&quot;).
         */
        public TextEntityTypeCashtag() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1222915915;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bot command, beginning with &quot;/&quot;.
     */
    public static class TextEntityTypeBotCommand extends TextEntityType {

        /**
         * A bot command, beginning with &quot;/&quot;.
         */
        public TextEntityTypeBotCommand() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1150997581;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An HTTP URL.
     */
    public static class TextEntityTypeUrl extends TextEntityType {

        /**
         * An HTTP URL.
         */
        public TextEntityTypeUrl() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1312762756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An email address.
     */
    public static class TextEntityTypeEmailAddress extends TextEntityType {

        /**
         * An email address.
         */
        public TextEntityTypeEmailAddress() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1425545249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A phone number.
     */
    public static class TextEntityTypePhoneNumber extends TextEntityType {

        /**
         * A phone number.
         */
        public TextEntityTypePhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1160140246;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bank card number. The getBankCardInfo method can be used to get information about the bank card.
     */
    public static class TextEntityTypeBankCardNumber extends TextEntityType {

        /**
         * A bank card number. The getBankCardInfo method can be used to get information about the bank card.
         */
        public TextEntityTypeBankCardNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 105986320;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bold text.
     */
    public static class TextEntityTypeBold extends TextEntityType {

        /**
         * A bold text.
         */
        public TextEntityTypeBold() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1128210000;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An italic text.
     */
    public static class TextEntityTypeItalic extends TextEntityType {

        /**
         * An italic text.
         */
        public TextEntityTypeItalic() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -118253987;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An underlined text.
     */
    public static class TextEntityTypeUnderline extends TextEntityType {

        /**
         * An underlined text.
         */
        public TextEntityTypeUnderline() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 792317842;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A strikethrough text.
     */
    public static class TextEntityTypeStrikethrough extends TextEntityType {

        /**
         * A strikethrough text.
         */
        public TextEntityTypeStrikethrough() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 961529082;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A spoiler text.
     */
    public static class TextEntityTypeSpoiler extends TextEntityType {

        /**
         * A spoiler text.
         */
        public TextEntityTypeSpoiler() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 544019899;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside a code HTML tag.
     */
    public static class TextEntityTypeCode extends TextEntityType {

        /**
         * Text that must be formatted as if inside a code HTML tag.
         */
        public TextEntityTypeCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -974534326;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside a pre HTML tag.
     */
    public static class TextEntityTypePre extends TextEntityType {

        /**
         * Text that must be formatted as if inside a pre HTML tag.
         */
        public TextEntityTypePre() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1648958606;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside pre, and code HTML tags.
     */
    public static class TextEntityTypePreCode extends TextEntityType {
        /**
         * Programming language of the code; as defined by the sender.
         */
        public String language;

        /**
         * Text that must be formatted as if inside pre, and code HTML tags.
         */
        public TextEntityTypePreCode() {
        }

        /**
         * Text that must be formatted as if inside pre, and code HTML tags.
         *
         * @param language Programming language of the code; as defined by the sender.
         */
        public TextEntityTypePreCode(String language) {
            this.language = language;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -945325397;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside a blockquote HTML tag; not supported in secret chats.
     */
    public static class TextEntityTypeBlockQuote extends TextEntityType {

        /**
         * Text that must be formatted as if inside a blockquote HTML tag; not supported in secret chats.
         */
        public TextEntityTypeBlockQuote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1003999032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside a blockquote HTML tag and collapsed by default to 3 lines with the ability to show full text; not supported in secret chats.
     */
    public static class TextEntityTypeExpandableBlockQuote extends TextEntityType {

        /**
         * Text that must be formatted as if inside a blockquote HTML tag and collapsed by default to 3 lines with the ability to show full text; not supported in secret chats.
         */
        public TextEntityTypeExpandableBlockQuote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 36572261;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text description shown instead of a raw URL.
     */
    public static class TextEntityTypeTextUrl extends TextEntityType {
        /**
         * HTTP or tg:// URL to be opened when the link is clicked.
         */
        public String url;

        /**
         * A text description shown instead of a raw URL.
         */
        public TextEntityTypeTextUrl() {
        }

        /**
         * A text description shown instead of a raw URL.
         *
         * @param url HTTP or tg:// URL to be opened when the link is clicked.
         */
        public TextEntityTypeTextUrl(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 445719651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text shows instead of a raw mention of the user (e.g., when the user has no username).
     */
    public static class TextEntityTypeMentionName extends TextEntityType {
        /**
         * Identifier of the mentioned user.
         */
        public long userId;

        /**
         * A text shows instead of a raw mention of the user (e.g., when the user has no username).
         */
        public TextEntityTypeMentionName() {
        }

        /**
         * A text shows instead of a raw mention of the user (e.g., when the user has no username).
         *
         * @param userId Identifier of the mentioned user.
         */
        public TextEntityTypeMentionName(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1570974289;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A custom emoji. The text behind a custom emoji must be an emoji. Only premium users can use premium custom emoji.
     */
    public static class TextEntityTypeCustomEmoji extends TextEntityType {
        /**
         * Unique identifier of the custom emoji.
         */
        public long customEmojiId;

        /**
         * A custom emoji. The text behind a custom emoji must be an emoji. Only premium users can use premium custom emoji.
         */
        public TextEntityTypeCustomEmoji() {
        }

        /**
         * A custom emoji. The text behind a custom emoji must be an emoji. Only premium users can use premium custom emoji.
         *
         * @param customEmojiId Unique identifier of the custom emoji.
         */
        public TextEntityTypeCustomEmoji(long customEmojiId) {
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1724820677;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A media timestamp.
     */
    public static class TextEntityTypeMediaTimestamp extends TextEntityType {
        /**
         * Timestamp from which a video/audio/video note/voice note/story playing must start, in seconds. The media can be in the content or the link preview of the current message, or in the same places in the replied message.
         */
        public int mediaTimestamp;

        /**
         * A media timestamp.
         */
        public TextEntityTypeMediaTimestamp() {
        }

        /**
         * A media timestamp.
         *
         * @param mediaTimestamp Timestamp from which a video/audio/video note/voice note/story playing must start, in seconds. The media can be in the content or the link preview of the current message, or in the same places in the replied message.
         */
        public TextEntityTypeMediaTimestamp(int mediaTimestamp) {
            this.mediaTimestamp = mediaTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1841898992;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the way the text needs to be parsed for text entities.
     */
    public abstract static class TextParseMode extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TextParseModeMarkdown.CONSTRUCTOR,
            TextParseModeHTML.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TextParseMode() {
        }
    }

    /**
     * The text uses Markdown-style formatting.
     */
    public static class TextParseModeMarkdown extends TextParseMode {
        /**
         * Version of the parser: 0 or 1 - Telegram Bot API &quot;Markdown&quot; parse mode, 2 - Telegram Bot API &quot;MarkdownV2&quot; parse mode.
         */
        public int version;

        /**
         * The text uses Markdown-style formatting.
         */
        public TextParseModeMarkdown() {
        }

        /**
         * The text uses Markdown-style formatting.
         *
         * @param version Version of the parser: 0 or 1 - Telegram Bot API &quot;Markdown&quot; parse mode, 2 - Telegram Bot API &quot;MarkdownV2&quot; parse mode.
         */
        public TextParseModeMarkdown(int version) {
            this.version = version;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 360073407;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The text uses HTML-style formatting. The same as Telegram Bot API &quot;HTML&quot; parse mode.
     */
    public static class TextParseModeHTML extends TextParseMode {

        /**
         * The text uses HTML-style formatting. The same as Telegram Bot API &quot;HTML&quot; parse mode.
         */
        public TextParseModeHTML() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1660208627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes manually or automatically chosen quote from another message.
     */
    public static class TextQuote extends Object {
        /**
         * Text of the quote. Only Bold, Italic, Underline, Strikethrough, Spoiler, and CustomEmoji entities can be present in the text.
         */
        public FormattedText text;
        /**
         * Approximate quote position in the original message in UTF-16 code units as specified by the message sender.
         */
        public int position;
        /**
         * True, if the quote was manually chosen by the message sender.
         */
        public boolean isManual;

        /**
         * Describes manually or automatically chosen quote from another message.
         */
        public TextQuote() {
        }

        /**
         * Describes manually or automatically chosen quote from another message.
         *
         * @param text Text of the quote. Only Bold, Italic, Underline, Strikethrough, Spoiler, and CustomEmoji entities can be present in the text.
         * @param position Approximate quote position in the original message in UTF-16 code units as specified by the message sender.
         * @param isManual True, if the quote was manually chosen by the message sender.
         */
        public TextQuote(FormattedText text, int position, boolean isManual) {
            this.text = text;
            this.position = position;
            this.isManual = isManual;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2039105358;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains parameters of the application theme.
     */
    public static class ThemeParameters extends Object {
        /**
         * A color of the background in the RGB24 format.
         */
        public int backgroundColor;
        /**
         * A secondary color for the background in the RGB24 format.
         */
        public int secondaryBackgroundColor;
        /**
         * A color of the header background in the RGB24 format.
         */
        public int headerBackgroundColor;
        /**
         * A color of the section background in the RGB24 format.
         */
        public int sectionBackgroundColor;
        /**
         * A color of the section separator in the RGB24 format.
         */
        public int sectionSeparatorColor;
        /**
         * A color of text in the RGB24 format.
         */
        public int textColor;
        /**
         * An accent color of the text in the RGB24 format.
         */
        public int accentTextColor;
        /**
         * A color of text on the section headers in the RGB24 format.
         */
        public int sectionHeaderTextColor;
        /**
         * A color of the subtitle text in the RGB24 format.
         */
        public int subtitleTextColor;
        /**
         * A color of the text for destructive actions in the RGB24 format.
         */
        public int destructiveTextColor;
        /**
         * A color of hints in the RGB24 format.
         */
        public int hintColor;
        /**
         * A color of links in the RGB24 format.
         */
        public int linkColor;
        /**
         * A color of the buttons in the RGB24 format.
         */
        public int buttonColor;
        /**
         * A color of text on the buttons in the RGB24 format.
         */
        public int buttonTextColor;

        /**
         * Contains parameters of the application theme.
         */
        public ThemeParameters() {
        }

        /**
         * Contains parameters of the application theme.
         *
         * @param backgroundColor A color of the background in the RGB24 format.
         * @param secondaryBackgroundColor A secondary color for the background in the RGB24 format.
         * @param headerBackgroundColor A color of the header background in the RGB24 format.
         * @param sectionBackgroundColor A color of the section background in the RGB24 format.
         * @param sectionSeparatorColor A color of the section separator in the RGB24 format.
         * @param textColor A color of text in the RGB24 format.
         * @param accentTextColor An accent color of the text in the RGB24 format.
         * @param sectionHeaderTextColor A color of text on the section headers in the RGB24 format.
         * @param subtitleTextColor A color of the subtitle text in the RGB24 format.
         * @param destructiveTextColor A color of the text for destructive actions in the RGB24 format.
         * @param hintColor A color of hints in the RGB24 format.
         * @param linkColor A color of links in the RGB24 format.
         * @param buttonColor A color of the buttons in the RGB24 format.
         * @param buttonTextColor A color of text on the buttons in the RGB24 format.
         */
        public ThemeParameters(int backgroundColor, int secondaryBackgroundColor, int headerBackgroundColor, int sectionBackgroundColor, int sectionSeparatorColor, int textColor, int accentTextColor, int sectionHeaderTextColor, int subtitleTextColor, int destructiveTextColor, int hintColor, int linkColor, int buttonColor, int buttonTextColor) {
            this.backgroundColor = backgroundColor;
            this.secondaryBackgroundColor = secondaryBackgroundColor;
            this.headerBackgroundColor = headerBackgroundColor;
            this.sectionBackgroundColor = sectionBackgroundColor;
            this.sectionSeparatorColor = sectionSeparatorColor;
            this.textColor = textColor;
            this.accentTextColor = accentTextColor;
            this.sectionHeaderTextColor = sectionHeaderTextColor;
            this.subtitleTextColor = subtitleTextColor;
            this.destructiveTextColor = destructiveTextColor;
            this.hintColor = hintColor;
            this.linkColor = linkColor;
            this.buttonColor = buttonColor;
            this.buttonTextColor = buttonTextColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1267396415;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes theme settings.
     */
    public static class ThemeSettings extends Object {
        /**
         * Theme accent color in ARGB format.
         */
        public int accentColor;
        /**
         * The background to be used in chats; may be null.
         */
        @Nullable public Background background;
        /**
         * The fill to be used as a background for outgoing messages.
         */
        public BackgroundFill outgoingMessageFill;
        /**
         * If true, the freeform gradient fill needs to be animated on every sent message.
         */
        public boolean animateOutgoingMessageFill;
        /**
         * Accent color of outgoing messages in ARGB format.
         */
        public int outgoingMessageAccentColor;

        /**
         * Describes theme settings.
         */
        public ThemeSettings() {
        }

        /**
         * Describes theme settings.
         *
         * @param accentColor Theme accent color in ARGB format.
         * @param background The background to be used in chats; may be null.
         * @param outgoingMessageFill The fill to be used as a background for outgoing messages.
         * @param animateOutgoingMessageFill If true, the freeform gradient fill needs to be animated on every sent message.
         * @param outgoingMessageAccentColor Accent color of outgoing messages in ARGB format.
         */
        public ThemeSettings(int accentColor, Background background, BackgroundFill outgoingMessageFill, boolean animateOutgoingMessageFill, int outgoingMessageAccentColor) {
            this.accentColor = accentColor;
            this.background = background;
            this.outgoingMessageFill = outgoingMessageFill;
            this.animateOutgoingMessageFill = animateOutgoingMessageFill;
            this.outgoingMessageAccentColor = outgoingMessageAccentColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -62120942;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a thumbnail.
     */
    public static class Thumbnail extends Object {
        /**
         * Thumbnail format.
         */
        public ThumbnailFormat format;
        /**
         * Thumbnail width.
         */
        public int width;
        /**
         * Thumbnail height.
         */
        public int height;
        /**
         * The thumbnail.
         */
        public File file;

        /**
         * Represents a thumbnail.
         */
        public Thumbnail() {
        }

        /**
         * Represents a thumbnail.
         *
         * @param format Thumbnail format.
         * @param width Thumbnail width.
         * @param height Thumbnail height.
         * @param file The thumbnail.
         */
        public Thumbnail(ThumbnailFormat format, int width, int height, File file) {
            this.format = format;
            this.width = width;
            this.height = height;
            this.file = file;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1243275371;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes format of a thumbnail.
     */
    public abstract static class ThumbnailFormat extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ThumbnailFormatJpeg.CONSTRUCTOR,
            ThumbnailFormatGif.CONSTRUCTOR,
            ThumbnailFormatMpeg4.CONSTRUCTOR,
            ThumbnailFormatPng.CONSTRUCTOR,
            ThumbnailFormatTgs.CONSTRUCTOR,
            ThumbnailFormatWebm.CONSTRUCTOR,
            ThumbnailFormatWebp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ThumbnailFormat() {
        }
    }

    /**
     * The thumbnail is in JPEG format.
     */
    public static class ThumbnailFormatJpeg extends ThumbnailFormat {

        /**
         * The thumbnail is in JPEG format.
         */
        public ThumbnailFormatJpeg() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -653503352;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in static GIF format. It will be used only for some bot inline query results.
     */
    public static class ThumbnailFormatGif extends ThumbnailFormat {

        /**
         * The thumbnail is in static GIF format. It will be used only for some bot inline query results.
         */
        public ThumbnailFormatGif() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1252205962;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in MPEG4 format. It will be used only for some animations and videos.
     */
    public static class ThumbnailFormatMpeg4 extends ThumbnailFormat {

        /**
         * The thumbnail is in MPEG4 format. It will be used only for some animations and videos.
         */
        public ThumbnailFormatMpeg4() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 278616062;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in PNG format. It will be used only for background patterns.
     */
    public static class ThumbnailFormatPng extends ThumbnailFormat {

        /**
         * The thumbnail is in PNG format. It will be used only for background patterns.
         */
        public ThumbnailFormatPng() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1577490421;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in TGS format. It will be used only for sticker sets.
     */
    public static class ThumbnailFormatTgs extends ThumbnailFormat {

        /**
         * The thumbnail is in TGS format. It will be used only for sticker sets.
         */
        public ThumbnailFormatTgs() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1315522642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in WEBM format. It will be used only for sticker sets.
     */
    public static class ThumbnailFormatWebm extends ThumbnailFormat {

        /**
         * The thumbnail is in WEBM format. It will be used only for sticker sets.
         */
        public ThumbnailFormatWebm() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -660084953;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in WEBP format. It will be used only for some stickers and sticker sets.
     */
    public static class ThumbnailFormatWebp extends ThumbnailFormat {

        /**
         * The thumbnail is in WEBP format. It will be used only for some stickers and sticker sets.
         */
        public ThumbnailFormatWebp() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -53588974;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a time zone.
     */
    public static class TimeZone extends Object {
        /**
         * Unique time zone identifier.
         */
        public String id;
        /**
         * Time zone name.
         */
        public String name;
        /**
         * Current UTC time offset for the time zone.
         */
        public int utcTimeOffset;

        /**
         * Describes a time zone.
         */
        public TimeZone() {
        }

        /**
         * Describes a time zone.
         *
         * @param id Unique time zone identifier.
         * @param name Time zone name.
         * @param utcTimeOffset Current UTC time offset for the time zone.
         */
        public TimeZone(String id, String name, int utcTimeOffset) {
            this.id = id;
            this.name = name;
            this.utcTimeOffset = utcTimeOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1189481763;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of time zones.
     */
    public static class TimeZones extends Object {
        /**
         * A list of time zones.
         */
        public TimeZone[] timeZones;

        /**
         * Contains a list of time zones.
         */
        public TimeZones() {
        }

        /**
         * Contains a list of time zones.
         *
         * @param timeZones A list of time zones.
         */
        public TimeZones(TimeZone[] timeZones) {
            this.timeZones = timeZones;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -334655570;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the categories of chats for which a list of frequently used chats can be retrieved.
     */
    public abstract static class TopChatCategory extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TopChatCategoryUsers.CONSTRUCTOR,
            TopChatCategoryBots.CONSTRUCTOR,
            TopChatCategoryGroups.CONSTRUCTOR,
            TopChatCategoryChannels.CONSTRUCTOR,
            TopChatCategoryInlineBots.CONSTRUCTOR,
            TopChatCategoryCalls.CONSTRUCTOR,
            TopChatCategoryForwardChats.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TopChatCategory() {
        }
    }

    /**
     * A category containing frequently used private chats with non-bot users.
     */
    public static class TopChatCategoryUsers extends TopChatCategory {

        /**
         * A category containing frequently used private chats with non-bot users.
         */
        public TopChatCategoryUsers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1026706816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used private chats with bot users.
     */
    public static class TopChatCategoryBots extends TopChatCategory {

        /**
         * A category containing frequently used private chats with bot users.
         */
        public TopChatCategoryBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1577129195;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used basic groups and supergroups.
     */
    public static class TopChatCategoryGroups extends TopChatCategory {

        /**
         * A category containing frequently used basic groups and supergroups.
         */
        public TopChatCategoryGroups() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1530056846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used channels.
     */
    public static class TopChatCategoryChannels extends TopChatCategory {

        /**
         * A category containing frequently used channels.
         */
        public TopChatCategoryChannels() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -500825885;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used chats with inline bots sorted by their usage in inline mode.
     */
    public static class TopChatCategoryInlineBots extends TopChatCategory {

        /**
         * A category containing frequently used chats with inline bots sorted by their usage in inline mode.
         */
        public TopChatCategoryInlineBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 377023356;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used chats used for calls.
     */
    public static class TopChatCategoryCalls extends TopChatCategory {

        /**
         * A category containing frequently used chats used for calls.
         */
        public TopChatCategoryCalls() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 356208861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used chats used to forward messages.
     */
    public static class TopChatCategoryForwardChats extends TopChatCategory {

        /**
         * A category containing frequently used chats used to forward messages.
         */
        public TopChatCategoryForwardChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1695922133;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of trending sticker sets.
     */
    public static class TrendingStickerSets extends Object {
        /**
         * Approximate total number of trending sticker sets.
         */
        public int totalCount;
        /**
         * List of trending sticker sets.
         */
        public StickerSetInfo[] sets;
        /**
         * True, if the list contains sticker sets with premium stickers.
         */
        public boolean isPremium;

        /**
         * Represents a list of trending sticker sets.
         */
        public TrendingStickerSets() {
        }

        /**
         * Represents a list of trending sticker sets.
         *
         * @param totalCount Approximate total number of trending sticker sets.
         * @param sets List of trending sticker sets.
         * @param isPremium True, if the list contains sticker sets with premium stickers.
         */
        public TrendingStickerSets(int totalCount, StickerSetInfo[] sets, boolean isPremium) {
            this.totalCount = totalCount;
            this.sets = sets;
            this.isPremium = isPremium;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 41028940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an unconfirmed session.
     */
    public static class UnconfirmedSession extends Object {
        /**
         * Session identifier.
         */
        public long id;
        /**
         * Point in time (Unix timestamp) when the user has logged in.
         */
        public int logInDate;
        /**
         * Model of the device that was used for the session creation, as provided by the application.
         */
        public String deviceModel;
        /**
         * A human-readable description of the location from which the session was created, based on the IP address.
         */
        public String location;

        /**
         * Contains information about an unconfirmed session.
         */
        public UnconfirmedSession() {
        }

        /**
         * Contains information about an unconfirmed session.
         *
         * @param id Session identifier.
         * @param logInDate Point in time (Unix timestamp) when the user has logged in.
         * @param deviceModel Model of the device that was used for the session creation, as provided by the application.
         * @param location A human-readable description of the location from which the session was created, based on the IP address.
         */
        public UnconfirmedSession(long id, int logInDate, String deviceModel, String location) {
            this.id = id;
            this.logInDate = logInDate;
            this.deviceModel = deviceModel;
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2062726663;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an unread reaction to a message.
     */
    public static class UnreadReaction extends Object {
        /**
         * Type of the reaction.
         */
        public ReactionType type;
        /**
         * Identifier of the sender, added the reaction.
         */
        public MessageSender senderId;
        /**
         * True, if the reaction was added with a big animation.
         */
        public boolean isBig;

        /**
         * Contains information about an unread reaction to a message.
         */
        public UnreadReaction() {
        }

        /**
         * Contains information about an unread reaction to a message.
         *
         * @param type Type of the reaction.
         * @param senderId Identifier of the sender, added the reaction.
         * @param isBig True, if the reaction was added with a big animation.
         */
        public UnreadReaction(ReactionType type, MessageSender senderId, boolean isBig) {
            this.type = type;
            this.senderId = senderId;
            this.isBig = isBig;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1940178046;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains notifications about data changes.
     */
    public abstract static class Update extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UpdateAuthorizationState.CONSTRUCTOR,
            UpdateNewMessage.CONSTRUCTOR,
            UpdateMessageSendAcknowledged.CONSTRUCTOR,
            UpdateMessageSendSucceeded.CONSTRUCTOR,
            UpdateMessageSendFailed.CONSTRUCTOR,
            UpdateMessageContent.CONSTRUCTOR,
            UpdateMessageEdited.CONSTRUCTOR,
            UpdateMessageIsPinned.CONSTRUCTOR,
            UpdateMessageInteractionInfo.CONSTRUCTOR,
            UpdateMessageContentOpened.CONSTRUCTOR,
            UpdateMessageMentionRead.CONSTRUCTOR,
            UpdateMessageUnreadReactions.CONSTRUCTOR,
            UpdateMessageFactCheck.CONSTRUCTOR,
            UpdateMessageLiveLocationViewed.CONSTRUCTOR,
            UpdateNewChat.CONSTRUCTOR,
            UpdateChatTitle.CONSTRUCTOR,
            UpdateChatPhoto.CONSTRUCTOR,
            UpdateChatAccentColors.CONSTRUCTOR,
            UpdateChatPermissions.CONSTRUCTOR,
            UpdateChatLastMessage.CONSTRUCTOR,
            UpdateChatPosition.CONSTRUCTOR,
            UpdateChatAddedToList.CONSTRUCTOR,
            UpdateChatRemovedFromList.CONSTRUCTOR,
            UpdateChatReadInbox.CONSTRUCTOR,
            UpdateChatReadOutbox.CONSTRUCTOR,
            UpdateChatActionBar.CONSTRUCTOR,
            UpdateChatBusinessBotManageBar.CONSTRUCTOR,
            UpdateChatAvailableReactions.CONSTRUCTOR,
            UpdateChatDraftMessage.CONSTRUCTOR,
            UpdateChatEmojiStatus.CONSTRUCTOR,
            UpdateChatMessageSender.CONSTRUCTOR,
            UpdateChatMessageAutoDeleteTime.CONSTRUCTOR,
            UpdateChatNotificationSettings.CONSTRUCTOR,
            UpdateChatPendingJoinRequests.CONSTRUCTOR,
            UpdateChatReplyMarkup.CONSTRUCTOR,
            UpdateChatBackground.CONSTRUCTOR,
            UpdateChatTheme.CONSTRUCTOR,
            UpdateChatUnreadMentionCount.CONSTRUCTOR,
            UpdateChatUnreadReactionCount.CONSTRUCTOR,
            UpdateChatVideoChat.CONSTRUCTOR,
            UpdateChatDefaultDisableNotification.CONSTRUCTOR,
            UpdateChatHasProtectedContent.CONSTRUCTOR,
            UpdateChatIsTranslatable.CONSTRUCTOR,
            UpdateChatIsMarkedAsUnread.CONSTRUCTOR,
            UpdateChatViewAsTopics.CONSTRUCTOR,
            UpdateChatBlockList.CONSTRUCTOR,
            UpdateChatHasScheduledMessages.CONSTRUCTOR,
            UpdateChatFolders.CONSTRUCTOR,
            UpdateChatOnlineMemberCount.CONSTRUCTOR,
            UpdateSavedMessagesTopic.CONSTRUCTOR,
            UpdateSavedMessagesTopicCount.CONSTRUCTOR,
            UpdateQuickReplyShortcut.CONSTRUCTOR,
            UpdateQuickReplyShortcutDeleted.CONSTRUCTOR,
            UpdateQuickReplyShortcuts.CONSTRUCTOR,
            UpdateQuickReplyShortcutMessages.CONSTRUCTOR,
            UpdateForumTopicInfo.CONSTRUCTOR,
            UpdateScopeNotificationSettings.CONSTRUCTOR,
            UpdateReactionNotificationSettings.CONSTRUCTOR,
            UpdateNotification.CONSTRUCTOR,
            UpdateNotificationGroup.CONSTRUCTOR,
            UpdateActiveNotifications.CONSTRUCTOR,
            UpdateHavePendingNotifications.CONSTRUCTOR,
            UpdateDeleteMessages.CONSTRUCTOR,
            UpdateChatAction.CONSTRUCTOR,
            UpdateUserStatus.CONSTRUCTOR,
            UpdateUser.CONSTRUCTOR,
            UpdateBasicGroup.CONSTRUCTOR,
            UpdateSupergroup.CONSTRUCTOR,
            UpdateSecretChat.CONSTRUCTOR,
            UpdateUserFullInfo.CONSTRUCTOR,
            UpdateBasicGroupFullInfo.CONSTRUCTOR,
            UpdateSupergroupFullInfo.CONSTRUCTOR,
            UpdateServiceNotification.CONSTRUCTOR,
            UpdateFile.CONSTRUCTOR,
            UpdateFileGenerationStart.CONSTRUCTOR,
            UpdateFileGenerationStop.CONSTRUCTOR,
            UpdateFileDownloads.CONSTRUCTOR,
            UpdateFileAddedToDownloads.CONSTRUCTOR,
            UpdateFileDownload.CONSTRUCTOR,
            UpdateFileRemovedFromDownloads.CONSTRUCTOR,
            UpdateApplicationVerificationRequired.CONSTRUCTOR,
            UpdateCall.CONSTRUCTOR,
            UpdateGroupCall.CONSTRUCTOR,
            UpdateGroupCallParticipant.CONSTRUCTOR,
            UpdateNewCallSignalingData.CONSTRUCTOR,
            UpdateUserPrivacySettingRules.CONSTRUCTOR,
            UpdateUnreadMessageCount.CONSTRUCTOR,
            UpdateUnreadChatCount.CONSTRUCTOR,
            UpdateStory.CONSTRUCTOR,
            UpdateStoryDeleted.CONSTRUCTOR,
            UpdateStorySendSucceeded.CONSTRUCTOR,
            UpdateStorySendFailed.CONSTRUCTOR,
            UpdateChatActiveStories.CONSTRUCTOR,
            UpdateStoryListChatCount.CONSTRUCTOR,
            UpdateStoryStealthMode.CONSTRUCTOR,
            UpdateOption.CONSTRUCTOR,
            UpdateStickerSet.CONSTRUCTOR,
            UpdateInstalledStickerSets.CONSTRUCTOR,
            UpdateTrendingStickerSets.CONSTRUCTOR,
            UpdateRecentStickers.CONSTRUCTOR,
            UpdateFavoriteStickers.CONSTRUCTOR,
            UpdateSavedAnimations.CONSTRUCTOR,
            UpdateSavedNotificationSounds.CONSTRUCTOR,
            UpdateDefaultBackground.CONSTRUCTOR,
            UpdateChatThemes.CONSTRUCTOR,
            UpdateAccentColors.CONSTRUCTOR,
            UpdateProfileAccentColors.CONSTRUCTOR,
            UpdateLanguagePackStrings.CONSTRUCTOR,
            UpdateConnectionState.CONSTRUCTOR,
            UpdateTermsOfService.CONSTRUCTOR,
            UpdateUsersNearby.CONSTRUCTOR,
            UpdateUnconfirmedSession.CONSTRUCTOR,
            UpdateAttachmentMenuBots.CONSTRUCTOR,
            UpdateWebAppMessageSent.CONSTRUCTOR,
            UpdateActiveEmojiReactions.CONSTRUCTOR,
            UpdateAvailableMessageEffects.CONSTRUCTOR,
            UpdateDefaultReactionType.CONSTRUCTOR,
            UpdateSavedMessagesTags.CONSTRUCTOR,
            UpdateOwnedStarCount.CONSTRUCTOR,
            UpdateChatRevenueAmount.CONSTRUCTOR,
            UpdateStarRevenueStatus.CONSTRUCTOR,
            UpdateSpeechRecognitionTrial.CONSTRUCTOR,
            UpdateDiceEmojis.CONSTRUCTOR,
            UpdateAnimatedEmojiMessageClicked.CONSTRUCTOR,
            UpdateAnimationSearchParameters.CONSTRUCTOR,
            UpdateSuggestedActions.CONSTRUCTOR,
            UpdateSpeedLimitNotification.CONSTRUCTOR,
            UpdateContactCloseBirthdays.CONSTRUCTOR,
            UpdateAutosaveSettings.CONSTRUCTOR,
            UpdateBusinessConnection.CONSTRUCTOR,
            UpdateNewBusinessMessage.CONSTRUCTOR,
            UpdateBusinessMessageEdited.CONSTRUCTOR,
            UpdateBusinessMessagesDeleted.CONSTRUCTOR,
            UpdateNewInlineQuery.CONSTRUCTOR,
            UpdateNewChosenInlineResult.CONSTRUCTOR,
            UpdateNewCallbackQuery.CONSTRUCTOR,
            UpdateNewInlineCallbackQuery.CONSTRUCTOR,
            UpdateNewBusinessCallbackQuery.CONSTRUCTOR,
            UpdateNewShippingQuery.CONSTRUCTOR,
            UpdateNewPreCheckoutQuery.CONSTRUCTOR,
            UpdateNewCustomEvent.CONSTRUCTOR,
            UpdateNewCustomQuery.CONSTRUCTOR,
            UpdatePoll.CONSTRUCTOR,
            UpdatePollAnswer.CONSTRUCTOR,
            UpdateChatMember.CONSTRUCTOR,
            UpdateNewChatJoinRequest.CONSTRUCTOR,
            UpdateChatBoost.CONSTRUCTOR,
            UpdateMessageReaction.CONSTRUCTOR,
            UpdateMessageReactions.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public Update() {
        }
    }

    /**
     * The user authorization state has changed.
     */
    public static class UpdateAuthorizationState extends Update {
        /**
         * New authorization state.
         */
        public AuthorizationState authorizationState;

        /**
         * The user authorization state has changed.
         */
        public UpdateAuthorizationState() {
        }

        /**
         * The user authorization state has changed.
         *
         * @param authorizationState New authorization state.
         */
        public UpdateAuthorizationState(AuthorizationState authorizationState) {
            this.authorizationState = authorizationState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1622347490;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new message was received; can also be an outgoing message.
     */
    public static class UpdateNewMessage extends Update {
        /**
         * The new message.
         */
        public Message message;

        /**
         * A new message was received; can also be an outgoing message.
         */
        public UpdateNewMessage() {
        }

        /**
         * A new message was received; can also be an outgoing message.
         *
         * @param message The new message.
         */
        public UpdateNewMessage(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -563105266;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully. This update is sent only if the option &quot;use_quick_ack&quot; is set to true. This update may be sent multiple times for the same message.
     */
    public static class UpdateMessageSendAcknowledged extends Update {
        /**
         * The chat identifier of the sent message.
         */
        public long chatId;
        /**
         * A temporary message identifier.
         */
        public long messageId;

        /**
         * A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully. This update is sent only if the option &quot;use_quick_ack&quot; is set to true. This update may be sent multiple times for the same message.
         */
        public UpdateMessageSendAcknowledged() {
        }

        /**
         * A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully. This update is sent only if the option &quot;use_quick_ack&quot; is set to true. This update may be sent multiple times for the same message.
         *
         * @param chatId The chat identifier of the sent message.
         * @param messageId A temporary message identifier.
         */
        public UpdateMessageSendAcknowledged(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1302843961;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message has been successfully sent.
     */
    public static class UpdateMessageSendSucceeded extends Update {
        /**
         * The sent message. Usually only the message identifier, date, and content are changed, but almost all other fields can also change.
         */
        public Message message;
        /**
         * The previous temporary message identifier.
         */
        public long oldMessageId;

        /**
         * A message has been successfully sent.
         */
        public UpdateMessageSendSucceeded() {
        }

        /**
         * A message has been successfully sent.
         *
         * @param message The sent message. Usually only the message identifier, date, and content are changed, but almost all other fields can also change.
         * @param oldMessageId The previous temporary message identifier.
         */
        public UpdateMessageSendSucceeded(Message message, long oldMessageId) {
            this.message = message;
            this.oldMessageId = oldMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1815715197;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update.
     */
    public static class UpdateMessageSendFailed extends Update {
        /**
         * The failed to send message.
         */
        public Message message;
        /**
         * The previous temporary message identifier.
         */
        public long oldMessageId;
        /**
         * The cause of the message sending failure.
         */
        public Error error;

        /**
         * A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update.
         */
        public UpdateMessageSendFailed() {
        }

        /**
         * A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update.
         *
         * @param message The failed to send message.
         * @param oldMessageId The previous temporary message identifier.
         * @param error The cause of the message sending failure.
         */
        public UpdateMessageSendFailed(Message message, long oldMessageId, Error error) {
            this.message = message;
            this.oldMessageId = oldMessageId;
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -635701017;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message content has changed.
     */
    public static class UpdateMessageContent extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * New message content.
         */
        public MessageContent newContent;

        /**
         * The message content has changed.
         */
        public UpdateMessageContent() {
        }

        /**
         * The message content has changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param newContent New message content.
         */
        public UpdateMessageContent(long chatId, long messageId, MessageContent newContent) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.newContent = newContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 506903332;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was edited. Changes in the message content will come in a separate updateMessageContent.
     */
    public static class UpdateMessageEdited extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Point in time (Unix timestamp) when the message was edited.
         */
        public int editDate;
        /**
         * New message reply markup; may be null.
         */
        @Nullable public ReplyMarkup replyMarkup;

        /**
         * A message was edited. Changes in the message content will come in a separate updateMessageContent.
         */
        public UpdateMessageEdited() {
        }

        /**
         * A message was edited. Changes in the message content will come in a separate updateMessageContent.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param editDate Point in time (Unix timestamp) when the message was edited.
         * @param replyMarkup New message reply markup; may be null.
         */
        public UpdateMessageEdited(long chatId, long messageId, int editDate, ReplyMarkup replyMarkup) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.editDate = editDate;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -559545626;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message pinned state was changed.
     */
    public static class UpdateMessageIsPinned extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The message identifier.
         */
        public long messageId;
        /**
         * True, if the message is pinned.
         */
        public boolean isPinned;

        /**
         * The message pinned state was changed.
         */
        public UpdateMessageIsPinned() {
        }

        /**
         * The message pinned state was changed.
         *
         * @param chatId Chat identifier.
         * @param messageId The message identifier.
         * @param isPinned True, if the message is pinned.
         */
        public UpdateMessageIsPinned(long chatId, long messageId, boolean isPinned) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1102848829;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The information about interactions with a message has changed.
     */
    public static class UpdateMessageInteractionInfo extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * New information about interactions with the message; may be null.
         */
        @Nullable public MessageInteractionInfo interactionInfo;

        /**
         * The information about interactions with a message has changed.
         */
        public UpdateMessageInteractionInfo() {
        }

        /**
         * The information about interactions with a message has changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param interactionInfo New information about interactions with the message; may be null.
         */
        public UpdateMessageInteractionInfo(long chatId, long messageId, MessageInteractionInfo interactionInfo) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.interactionInfo = interactionInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1417659394;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message content was opened. Updates voice note messages to &quot;listened&quot;, video note messages to &quot;viewed&quot; and starts the self-destruct timer.
     */
    public static class UpdateMessageContentOpened extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * The message content was opened. Updates voice note messages to &quot;listened&quot;, video note messages to &quot;viewed&quot; and starts the self-destruct timer.
         */
        public UpdateMessageContentOpened() {
        }

        /**
         * The message content was opened. Updates voice note messages to &quot;listened&quot;, video note messages to &quot;viewed&quot; and starts the self-destruct timer.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         */
        public UpdateMessageContentOpened(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1520523131;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an unread mention was read.
     */
    public static class UpdateMessageMentionRead extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The new number of unread mention messages left in the chat.
         */
        public int unreadMentionCount;

        /**
         * A message with an unread mention was read.
         */
        public UpdateMessageMentionRead() {
        }

        /**
         * A message with an unread mention was read.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param unreadMentionCount The new number of unread mention messages left in the chat.
         */
        public UpdateMessageMentionRead(long chatId, long messageId, int unreadMentionCount) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.unreadMentionCount = unreadMentionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -252228282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of unread reactions added to a message was changed.
     */
    public static class UpdateMessageUnreadReactions extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The new list of unread reactions.
         */
        public UnreadReaction[] unreadReactions;
        /**
         * The new number of messages with unread reactions left in the chat.
         */
        public int unreadReactionCount;

        /**
         * The list of unread reactions added to a message was changed.
         */
        public UpdateMessageUnreadReactions() {
        }

        /**
         * The list of unread reactions added to a message was changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param unreadReactions The new list of unread reactions.
         * @param unreadReactionCount The new number of messages with unread reactions left in the chat.
         */
        public UpdateMessageUnreadReactions(long chatId, long messageId, UnreadReaction[] unreadReactions, int unreadReactionCount) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.unreadReactions = unreadReactions;
            this.unreadReactionCount = unreadReactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 942840008;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A fact-check added to a message was changed.
     */
    public static class UpdateMessageFactCheck extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The new fact-check.
         */
        public FactCheck factCheck;

        /**
         * A fact-check added to a message was changed.
         */
        public UpdateMessageFactCheck() {
        }

        /**
         * A fact-check added to a message was changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param factCheck The new fact-check.
         */
        public UpdateMessageFactCheck(long chatId, long messageId, FactCheck factCheck) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.factCheck = factCheck;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1014561538;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a live location was viewed. When the update is received, the application is supposed to update the live location.
     */
    public static class UpdateMessageLiveLocationViewed extends Update {
        /**
         * Identifier of the chat with the live location message.
         */
        public long chatId;
        /**
         * Identifier of the message with live location.
         */
        public long messageId;

        /**
         * A message with a live location was viewed. When the update is received, the application is supposed to update the live location.
         */
        public UpdateMessageLiveLocationViewed() {
        }

        /**
         * A message with a live location was viewed. When the update is received, the application is supposed to update the live location.
         *
         * @param chatId Identifier of the chat with the live location message.
         * @param messageId Identifier of the message with live location.
         */
        public UpdateMessageLiveLocationViewed(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1308260971;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the application. The chat field changes will be reported through separate updates.
     */
    public static class UpdateNewChat extends Update {
        /**
         * The chat.
         */
        public Chat chat;

        /**
         * A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the application. The chat field changes will be reported through separate updates.
         */
        public UpdateNewChat() {
        }

        /**
         * A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the application. The chat field changes will be reported through separate updates.
         *
         * @param chat The chat.
         */
        public UpdateNewChat(Chat chat) {
            this.chat = chat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2075757773;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The title of a chat was changed.
     */
    public static class UpdateChatTitle extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat title.
         */
        public String title;

        /**
         * The title of a chat was changed.
         */
        public UpdateChatTitle() {
        }

        /**
         * The title of a chat was changed.
         *
         * @param chatId Chat identifier.
         * @param title The new chat title.
         */
        public UpdateChatTitle(long chatId, String title) {
            this.chatId = chatId;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -175405660;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat photo was changed.
     */
    public static class UpdateChatPhoto extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat photo; may be null.
         */
        @Nullable public ChatPhotoInfo photo;

        /**
         * A chat photo was changed.
         */
        public UpdateChatPhoto() {
        }

        /**
         * A chat photo was changed.
         *
         * @param chatId Chat identifier.
         * @param photo The new chat photo; may be null.
         */
        public UpdateChatPhoto(long chatId, ChatPhotoInfo photo) {
            this.chatId = chatId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -324713921;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Chat accent colors have changed.
     */
    public static class UpdateChatAccentColors extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat accent color identifier.
         */
        public int accentColorId;
        /**
         * The new identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         */
        public long backgroundCustomEmojiId;
        /**
         * The new chat profile accent color identifier; -1 if none.
         */
        public int profileAccentColorId;
        /**
         * The new identifier of a custom emoji to be shown on the profile background; 0 if none.
         */
        public long profileBackgroundCustomEmojiId;

        /**
         * Chat accent colors have changed.
         */
        public UpdateChatAccentColors() {
        }

        /**
         * Chat accent colors have changed.
         *
         * @param chatId Chat identifier.
         * @param accentColorId The new chat accent color identifier.
         * @param backgroundCustomEmojiId The new identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         * @param profileAccentColorId The new chat profile accent color identifier; -1 if none.
         * @param profileBackgroundCustomEmojiId The new identifier of a custom emoji to be shown on the profile background; 0 if none.
         */
        public UpdateChatAccentColors(long chatId, int accentColorId, long backgroundCustomEmojiId, int profileAccentColorId, long profileBackgroundCustomEmojiId) {
            this.chatId = chatId;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1212614407;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Chat permissions were changed.
     */
    public static class UpdateChatPermissions extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat permissions.
         */
        public ChatPermissions permissions;

        /**
         * Chat permissions were changed.
         */
        public UpdateChatPermissions() {
        }

        /**
         * Chat permissions were changed.
         *
         * @param chatId Chat identifier.
         * @param permissions The new chat permissions.
         */
        public UpdateChatPermissions(long chatId, ChatPermissions permissions) {
            this.chatId = chatId;
            this.permissions = permissions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1622010003;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The last message of a chat was changed.
     */
    public static class UpdateChatLastMessage extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new last message in the chat; may be null if the last message became unknown. While the last message is unknown, new messages can be added to the chat without corresponding updateNewMessage update.
         */
        @Nullable public Message lastMessage;
        /**
         * The new chat positions in the chat lists.
         */
        public ChatPosition[] positions;

        /**
         * The last message of a chat was changed.
         */
        public UpdateChatLastMessage() {
        }

        /**
         * The last message of a chat was changed.
         *
         * @param chatId Chat identifier.
         * @param lastMessage The new last message in the chat; may be null if the last message became unknown. While the last message is unknown, new messages can be added to the chat without corresponding updateNewMessage update.
         * @param positions The new chat positions in the chat lists.
         */
        public UpdateChatLastMessage(long chatId, Message lastMessage, ChatPosition[] positions) {
            this.chatId = chatId;
            this.lastMessage = lastMessage;
            this.positions = positions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -923244537;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The position of a chat in a chat list has changed. An updateChatLastMessage or updateChatDraftMessage update might be sent instead of the update.
     */
    public static class UpdateChatPosition extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New chat position. If new order is 0, then the chat needs to be removed from the list.
         */
        public ChatPosition position;

        /**
         * The position of a chat in a chat list has changed. An updateChatLastMessage or updateChatDraftMessage update might be sent instead of the update.
         */
        public UpdateChatPosition() {
        }

        /**
         * The position of a chat in a chat list has changed. An updateChatLastMessage or updateChatDraftMessage update might be sent instead of the update.
         *
         * @param chatId Chat identifier.
         * @param position New chat position. If new order is 0, then the chat needs to be removed from the list.
         */
        public UpdateChatPosition(long chatId, ChatPosition position) {
            this.chatId = chatId;
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -8979849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat was added to a chat list.
     */
    public static class UpdateChatAddedToList extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The chat list to which the chat was added.
         */
        public ChatList chatList;

        /**
         * A chat was added to a chat list.
         */
        public UpdateChatAddedToList() {
        }

        /**
         * A chat was added to a chat list.
         *
         * @param chatId Chat identifier.
         * @param chatList The chat list to which the chat was added.
         */
        public UpdateChatAddedToList(long chatId, ChatList chatList) {
            this.chatId = chatId;
            this.chatList = chatList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1418722068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat was removed from a chat list.
     */
    public static class UpdateChatRemovedFromList extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The chat list from which the chat was removed.
         */
        public ChatList chatList;

        /**
         * A chat was removed from a chat list.
         */
        public UpdateChatRemovedFromList() {
        }

        /**
         * A chat was removed from a chat list.
         *
         * @param chatId Chat identifier.
         * @param chatList The chat list from which the chat was removed.
         */
        public UpdateChatRemovedFromList(long chatId, ChatList chatList) {
            this.chatId = chatId;
            this.chatList = chatList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1294647836;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Incoming messages were read or the number of unread messages has been changed.
     */
    public static class UpdateChatReadInbox extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the last read incoming message.
         */
        public long lastReadInboxMessageId;
        /**
         * The number of unread messages left in the chat.
         */
        public int unreadCount;

        /**
         * Incoming messages were read or the number of unread messages has been changed.
         */
        public UpdateChatReadInbox() {
        }

        /**
         * Incoming messages were read or the number of unread messages has been changed.
         *
         * @param chatId Chat identifier.
         * @param lastReadInboxMessageId Identifier of the last read incoming message.
         * @param unreadCount The number of unread messages left in the chat.
         */
        public UpdateChatReadInbox(long chatId, long lastReadInboxMessageId, int unreadCount) {
            this.chatId = chatId;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.unreadCount = unreadCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -797952281;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Outgoing messages were read.
     */
    public static class UpdateChatReadOutbox extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of last read outgoing message.
         */
        public long lastReadOutboxMessageId;

        /**
         * Outgoing messages were read.
         */
        public UpdateChatReadOutbox() {
        }

        /**
         * Outgoing messages were read.
         *
         * @param chatId Chat identifier.
         * @param lastReadOutboxMessageId Identifier of last read outgoing message.
         */
        public UpdateChatReadOutbox(long chatId, long lastReadOutboxMessageId) {
            this.chatId = chatId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 708334213;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat action bar was changed.
     */
    public static class UpdateChatActionBar extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new value of the action bar; may be null.
         */
        @Nullable public ChatActionBar actionBar;

        /**
         * The chat action bar was changed.
         */
        public UpdateChatActionBar() {
        }

        /**
         * The chat action bar was changed.
         *
         * @param chatId Chat identifier.
         * @param actionBar The new value of the action bar; may be null.
         */
        public UpdateChatActionBar(long chatId, ChatActionBar actionBar) {
            this.chatId = chatId;
            this.actionBar = actionBar;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -643671870;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The bar for managing business bot was changed in a chat.
     */
    public static class UpdateChatBusinessBotManageBar extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new value of the business bot manage bar; may be null.
         */
        @Nullable public BusinessBotManageBar businessBotManageBar;

        /**
         * The bar for managing business bot was changed in a chat.
         */
        public UpdateChatBusinessBotManageBar() {
        }

        /**
         * The bar for managing business bot was changed in a chat.
         *
         * @param chatId Chat identifier.
         * @param businessBotManageBar The new value of the business bot manage bar; may be null.
         */
        public UpdateChatBusinessBotManageBar(long chatId, BusinessBotManageBar businessBotManageBar) {
            this.chatId = chatId;
            this.businessBotManageBar = businessBotManageBar;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1104091145;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat available reactions were changed.
     */
    public static class UpdateChatAvailableReactions extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new reactions, available in the chat.
         */
        public ChatAvailableReactions availableReactions;

        /**
         * The chat available reactions were changed.
         */
        public UpdateChatAvailableReactions() {
        }

        /**
         * The chat available reactions were changed.
         *
         * @param chatId Chat identifier.
         * @param availableReactions The new reactions, available in the chat.
         */
        public UpdateChatAvailableReactions(long chatId, ChatAvailableReactions availableReactions) {
            this.chatId = chatId;
            this.availableReactions = availableReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1967909895;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update mustn't be applied.
     */
    public static class UpdateChatDraftMessage extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new draft message; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;
        /**
         * The new chat positions in the chat lists.
         */
        public ChatPosition[] positions;

        /**
         * A chat draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update mustn't be applied.
         */
        public UpdateChatDraftMessage() {
        }

        /**
         * A chat draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update mustn't be applied.
         *
         * @param chatId Chat identifier.
         * @param draftMessage The new draft message; may be null if none.
         * @param positions The new chat positions in the chat lists.
         */
        public UpdateChatDraftMessage(long chatId, DraftMessage draftMessage, ChatPosition[] positions) {
            this.chatId = chatId;
            this.draftMessage = draftMessage;
            this.positions = positions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1455190380;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Chat emoji status has changed.
     */
    public static class UpdateChatEmojiStatus extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat emoji status; may be null.
         */
        @Nullable public EmojiStatus emojiStatus;

        /**
         * Chat emoji status has changed.
         */
        public UpdateChatEmojiStatus() {
        }

        /**
         * Chat emoji status has changed.
         *
         * @param chatId Chat identifier.
         * @param emojiStatus The new chat emoji status; may be null.
         */
        public UpdateChatEmojiStatus(long chatId, EmojiStatus emojiStatus) {
            this.chatId = chatId;
            this.emojiStatus = emojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2004444432;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message sender that is selected to send messages in a chat has changed.
     */
    public static class UpdateChatMessageSender extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of messageSenderId; may be null if the user can't change message sender.
         */
        @Nullable public MessageSender messageSenderId;

        /**
         * The message sender that is selected to send messages in a chat has changed.
         */
        public UpdateChatMessageSender() {
        }

        /**
         * The message sender that is selected to send messages in a chat has changed.
         *
         * @param chatId Chat identifier.
         * @param messageSenderId New value of messageSenderId; may be null if the user can't change message sender.
         */
        public UpdateChatMessageSender(long chatId, MessageSender messageSenderId) {
            this.chatId = chatId;
            this.messageSenderId = messageSenderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2003849793;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message auto-delete or self-destruct timer setting for a chat was changed.
     */
    public static class UpdateChatMessageAutoDeleteTime extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of messageAutoDeleteTime.
         */
        public int messageAutoDeleteTime;

        /**
         * The message auto-delete or self-destruct timer setting for a chat was changed.
         */
        public UpdateChatMessageAutoDeleteTime() {
        }

        /**
         * The message auto-delete or self-destruct timer setting for a chat was changed.
         *
         * @param chatId Chat identifier.
         * @param messageAutoDeleteTime New value of messageAutoDeleteTime.
         */
        public UpdateChatMessageAutoDeleteTime(long chatId, int messageAutoDeleteTime) {
            this.chatId = chatId;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1900174821;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings for a chat were changed.
     */
    public static class UpdateChatNotificationSettings extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new notification settings.
         */
        public ChatNotificationSettings notificationSettings;

        /**
         * Notification settings for a chat were changed.
         */
        public UpdateChatNotificationSettings() {
        }

        /**
         * Notification settings for a chat were changed.
         *
         * @param chatId Chat identifier.
         * @param notificationSettings The new notification settings.
         */
        public UpdateChatNotificationSettings(long chatId, ChatNotificationSettings notificationSettings) {
            this.chatId = chatId;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -803163050;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat pending join requests were changed.
     */
    public static class UpdateChatPendingJoinRequests extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new data about pending join requests; may be null.
         */
        @Nullable public ChatJoinRequestsInfo pendingJoinRequests;

        /**
         * The chat pending join requests were changed.
         */
        public UpdateChatPendingJoinRequests() {
        }

        /**
         * The chat pending join requests were changed.
         *
         * @param chatId Chat identifier.
         * @param pendingJoinRequests The new data about pending join requests; may be null.
         */
        public UpdateChatPendingJoinRequests(long chatId, ChatJoinRequestsInfo pendingJoinRequests) {
            this.chatId = chatId;
            this.pendingJoinRequests = pendingJoinRequests;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 348578785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The default chat reply markup was changed. Can occur because new messages with reply markup were received or because an old reply markup was hidden by the user.
     */
    public static class UpdateChatReplyMarkup extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat.
         */
        public long replyMarkupMessageId;

        /**
         * The default chat reply markup was changed. Can occur because new messages with reply markup were received or because an old reply markup was hidden by the user.
         */
        public UpdateChatReplyMarkup() {
        }

        /**
         * The default chat reply markup was changed. Can occur because new messages with reply markup were received or because an old reply markup was hidden by the user.
         *
         * @param chatId Chat identifier.
         * @param replyMarkupMessageId Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat.
         */
        public UpdateChatReplyMarkup(long chatId, long replyMarkupMessageId) {
            this.chatId = chatId;
            this.replyMarkupMessageId = replyMarkupMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1309386144;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat background was changed.
     */
    public static class UpdateChatBackground extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat background; may be null if background was reset to default.
         */
        @Nullable public ChatBackground background;

        /**
         * The chat background was changed.
         */
        public UpdateChatBackground() {
        }

        /**
         * The chat background was changed.
         *
         * @param chatId Chat identifier.
         * @param background The new chat background; may be null if background was reset to default.
         */
        public UpdateChatBackground(long chatId, ChatBackground background) {
            this.chatId = chatId;
            this.background = background;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -6473549;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat theme was changed.
     */
    public static class UpdateChatTheme extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new name of the chat theme; may be empty if theme was reset to default.
         */
        public String themeName;

        /**
         * The chat theme was changed.
         */
        public UpdateChatTheme() {
        }

        /**
         * The chat theme was changed.
         *
         * @param chatId Chat identifier.
         * @param themeName The new name of the chat theme; may be empty if theme was reset to default.
         */
        public UpdateChatTheme(long chatId, String themeName) {
            this.chatId = chatId;
            this.themeName = themeName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 838063205;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat unreadMentionCount has changed.
     */
    public static class UpdateChatUnreadMentionCount extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The number of unread mention messages left in the chat.
         */
        public int unreadMentionCount;

        /**
         * The chat unreadMentionCount has changed.
         */
        public UpdateChatUnreadMentionCount() {
        }

        /**
         * The chat unreadMentionCount has changed.
         *
         * @param chatId Chat identifier.
         * @param unreadMentionCount The number of unread mention messages left in the chat.
         */
        public UpdateChatUnreadMentionCount(long chatId, int unreadMentionCount) {
            this.chatId = chatId;
            this.unreadMentionCount = unreadMentionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2131461348;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat unreadReactionCount has changed.
     */
    public static class UpdateChatUnreadReactionCount extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The number of messages with unread reactions left in the chat.
         */
        public int unreadReactionCount;

        /**
         * The chat unreadReactionCount has changed.
         */
        public UpdateChatUnreadReactionCount() {
        }

        /**
         * The chat unreadReactionCount has changed.
         *
         * @param chatId Chat identifier.
         * @param unreadReactionCount The number of messages with unread reactions left in the chat.
         */
        public UpdateChatUnreadReactionCount(long chatId, int unreadReactionCount) {
            this.chatId = chatId;
            this.unreadReactionCount = unreadReactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2124399395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat video chat state has changed.
     */
    public static class UpdateChatVideoChat extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of videoChat.
         */
        public VideoChat videoChat;

        /**
         * A chat video chat state has changed.
         */
        public UpdateChatVideoChat() {
        }

        /**
         * A chat video chat state has changed.
         *
         * @param chatId Chat identifier.
         * @param videoChat New value of videoChat.
         */
        public UpdateChatVideoChat(long chatId, VideoChat videoChat) {
            this.chatId = chatId;
            this.videoChat = videoChat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 637226150;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The value of the default disableNotification parameter, used when a message is sent to the chat, was changed.
     */
    public static class UpdateChatDefaultDisableNotification extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new defaultDisableNotification value.
         */
        public boolean defaultDisableNotification;

        /**
         * The value of the default disableNotification parameter, used when a message is sent to the chat, was changed.
         */
        public UpdateChatDefaultDisableNotification() {
        }

        /**
         * The value of the default disableNotification parameter, used when a message is sent to the chat, was changed.
         *
         * @param chatId Chat identifier.
         * @param defaultDisableNotification The new defaultDisableNotification value.
         */
        public UpdateChatDefaultDisableNotification(long chatId, boolean defaultDisableNotification) {
            this.chatId = chatId;
            this.defaultDisableNotification = defaultDisableNotification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 464087707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat content was allowed or restricted for saving.
     */
    public static class UpdateChatHasProtectedContent extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of hasProtectedContent.
         */
        public boolean hasProtectedContent;

        /**
         * A chat content was allowed or restricted for saving.
         */
        public UpdateChatHasProtectedContent() {
        }

        /**
         * A chat content was allowed or restricted for saving.
         *
         * @param chatId Chat identifier.
         * @param hasProtectedContent New value of hasProtectedContent.
         */
        public UpdateChatHasProtectedContent(long chatId, boolean hasProtectedContent) {
            this.chatId = chatId;
            this.hasProtectedContent = hasProtectedContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1800406811;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Translation of chat messages was enabled or disabled.
     */
    public static class UpdateChatIsTranslatable extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of isTranslatable.
         */
        public boolean isTranslatable;

        /**
         * Translation of chat messages was enabled or disabled.
         */
        public UpdateChatIsTranslatable() {
        }

        /**
         * Translation of chat messages was enabled or disabled.
         *
         * @param chatId Chat identifier.
         * @param isTranslatable New value of isTranslatable.
         */
        public UpdateChatIsTranslatable(long chatId, boolean isTranslatable) {
            this.chatId = chatId;
            this.isTranslatable = isTranslatable;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2063799831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat was marked as unread or was read.
     */
    public static class UpdateChatIsMarkedAsUnread extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of isMarkedAsUnread.
         */
        public boolean isMarkedAsUnread;

        /**
         * A chat was marked as unread or was read.
         */
        public UpdateChatIsMarkedAsUnread() {
        }

        /**
         * A chat was marked as unread or was read.
         *
         * @param chatId Chat identifier.
         * @param isMarkedAsUnread New value of isMarkedAsUnread.
         */
        public UpdateChatIsMarkedAsUnread(long chatId, boolean isMarkedAsUnread) {
            this.chatId = chatId;
            this.isMarkedAsUnread = isMarkedAsUnread;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1468347188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat default appearance has changed.
     */
    public static class UpdateChatViewAsTopics extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of viewAsTopics.
         */
        public boolean viewAsTopics;

        /**
         * A chat default appearance has changed.
         */
        public UpdateChatViewAsTopics() {
        }

        /**
         * A chat default appearance has changed.
         *
         * @param chatId Chat identifier.
         * @param viewAsTopics New value of viewAsTopics.
         */
        public UpdateChatViewAsTopics(long chatId, boolean viewAsTopics) {
            this.chatId = chatId;
            this.viewAsTopics = viewAsTopics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1543444029;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat was blocked or unblocked.
     */
    public static class UpdateChatBlockList extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Block list to which the chat is added; may be null if none.
         */
        @Nullable public BlockList blockList;

        /**
         * A chat was blocked or unblocked.
         */
        public UpdateChatBlockList() {
        }

        /**
         * A chat was blocked or unblocked.
         *
         * @param chatId Chat identifier.
         * @param blockList Block list to which the chat is added; may be null if none.
         */
        public UpdateChatBlockList(long chatId, BlockList blockList) {
            this.chatId = chatId;
            this.blockList = blockList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2027228018;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat's hasScheduledMessages field has changed.
     */
    public static class UpdateChatHasScheduledMessages extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of hasScheduledMessages.
         */
        public boolean hasScheduledMessages;

        /**
         * A chat's hasScheduledMessages field has changed.
         */
        public UpdateChatHasScheduledMessages() {
        }

        /**
         * A chat's hasScheduledMessages field has changed.
         *
         * @param chatId Chat identifier.
         * @param hasScheduledMessages New value of hasScheduledMessages.
         */
        public UpdateChatHasScheduledMessages(long chatId, boolean hasScheduledMessages) {
            this.chatId = chatId;
            this.hasScheduledMessages = hasScheduledMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2064958167;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of chat folders or a chat folder has changed.
     */
    public static class UpdateChatFolders extends Update {
        /**
         * The new list of chat folders.
         */
        public ChatFolderInfo[] chatFolders;
        /**
         * Position of the main chat list among chat folders, 0-based.
         */
        public int mainChatListPosition;
        /**
         * True, if folder tags are enabled.
         */
        public boolean areTagsEnabled;

        /**
         * The list of chat folders or a chat folder has changed.
         */
        public UpdateChatFolders() {
        }

        /**
         * The list of chat folders or a chat folder has changed.
         *
         * @param chatFolders The new list of chat folders.
         * @param mainChatListPosition Position of the main chat list among chat folders, 0-based.
         * @param areTagsEnabled True, if folder tags are enabled.
         */
        public UpdateChatFolders(ChatFolderInfo[] chatFolders, int mainChatListPosition, boolean areTagsEnabled) {
            this.chatFolders = chatFolders;
            this.mainChatListPosition = mainChatListPosition;
            this.areTagsEnabled = areTagsEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1998101395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The number of online group members has changed. This update with non-zero number of online group members is sent only for currently opened chats. There is no guarantee that it is sent just after the number of online users has changed.
     */
    public static class UpdateChatOnlineMemberCount extends Update {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * New number of online members in the chat, or 0 if unknown.
         */
        public int onlineMemberCount;

        /**
         * The number of online group members has changed. This update with non-zero number of online group members is sent only for currently opened chats. There is no guarantee that it is sent just after the number of online users has changed.
         */
        public UpdateChatOnlineMemberCount() {
        }

        /**
         * The number of online group members has changed. This update with non-zero number of online group members is sent only for currently opened chats. There is no guarantee that it is sent just after the number of online users has changed.
         *
         * @param chatId Identifier of the chat.
         * @param onlineMemberCount New number of online members in the chat, or 0 if unknown.
         */
        public UpdateChatOnlineMemberCount(long chatId, int onlineMemberCount) {
            this.chatId = chatId;
            this.onlineMemberCount = onlineMemberCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 487369373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Basic information about a Saved Messages topic has changed. This update is guaranteed to come before the topic identifier is returned to the application.
     */
    public static class UpdateSavedMessagesTopic extends Update {
        /**
         * New data about the topic.
         */
        public SavedMessagesTopic topic;

        /**
         * Basic information about a Saved Messages topic has changed. This update is guaranteed to come before the topic identifier is returned to the application.
         */
        public UpdateSavedMessagesTopic() {
        }

        /**
         * Basic information about a Saved Messages topic has changed. This update is guaranteed to come before the topic identifier is returned to the application.
         *
         * @param topic New data about the topic.
         */
        public UpdateSavedMessagesTopic(SavedMessagesTopic topic) {
            this.topic = topic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1618855120;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of Saved Messages topics has changed.
     */
    public static class UpdateSavedMessagesTopicCount extends Update {
        /**
         * Approximate total number of Saved Messages topics.
         */
        public int topicCount;

        /**
         * Number of Saved Messages topics has changed.
         */
        public UpdateSavedMessagesTopicCount() {
        }

        /**
         * Number of Saved Messages topics has changed.
         *
         * @param topicCount Approximate total number of Saved Messages topics.
         */
        public UpdateSavedMessagesTopicCount(int topicCount) {
            this.topicCount = topicCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -70092335;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Basic information about a quick reply shortcut has changed. This update is guaranteed to come before the quick shortcut name is returned to the application.
     */
    public static class UpdateQuickReplyShortcut extends Update {
        /**
         * New data about the shortcut.
         */
        public QuickReplyShortcut shortcut;

        /**
         * Basic information about a quick reply shortcut has changed. This update is guaranteed to come before the quick shortcut name is returned to the application.
         */
        public UpdateQuickReplyShortcut() {
        }

        /**
         * Basic information about a quick reply shortcut has changed. This update is guaranteed to come before the quick shortcut name is returned to the application.
         *
         * @param shortcut New data about the shortcut.
         */
        public UpdateQuickReplyShortcut(QuickReplyShortcut shortcut) {
            this.shortcut = shortcut;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -963430193;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A quick reply shortcut and all its messages were deleted.
     */
    public static class UpdateQuickReplyShortcutDeleted extends Update {
        /**
         * The identifier of the deleted shortcut.
         */
        public int shortcutId;

        /**
         * A quick reply shortcut and all its messages were deleted.
         */
        public UpdateQuickReplyShortcutDeleted() {
        }

        /**
         * A quick reply shortcut and all its messages were deleted.
         *
         * @param shortcutId The identifier of the deleted shortcut.
         */
        public UpdateQuickReplyShortcutDeleted(int shortcutId) {
            this.shortcutId = shortcutId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -390480838;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of quick reply shortcuts has changed.
     */
    public static class UpdateQuickReplyShortcuts extends Update {
        /**
         * The new list of identifiers of quick reply shortcuts.
         */
        public int[] shortcutIds;

        /**
         * The list of quick reply shortcuts has changed.
         */
        public UpdateQuickReplyShortcuts() {
        }

        /**
         * The list of quick reply shortcuts has changed.
         *
         * @param shortcutIds The new list of identifiers of quick reply shortcuts.
         */
        public UpdateQuickReplyShortcuts(int[] shortcutIds) {
            this.shortcutIds = shortcutIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1994849731;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of quick reply shortcut messages has changed.
     */
    public static class UpdateQuickReplyShortcutMessages extends Update {
        /**
         * The identifier of the shortcut.
         */
        public int shortcutId;
        /**
         * The new list of quick reply messages for the shortcut in order from the first to the last sent.
         */
        public QuickReplyMessage[] messages;

        /**
         * The list of quick reply shortcut messages has changed.
         */
        public UpdateQuickReplyShortcutMessages() {
        }

        /**
         * The list of quick reply shortcut messages has changed.
         *
         * @param shortcutId The identifier of the shortcut.
         * @param messages The new list of quick reply messages for the shortcut in order from the first to the last sent.
         */
        public UpdateQuickReplyShortcutMessages(int shortcutId, QuickReplyMessage[] messages) {
            this.shortcutId = shortcutId;
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1396685225;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Basic information about a topic in a forum chat was changed.
     */
    public static class UpdateForumTopicInfo extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New information about the topic.
         */
        public ForumTopicInfo info;

        /**
         * Basic information about a topic in a forum chat was changed.
         */
        public UpdateForumTopicInfo() {
        }

        /**
         * Basic information about a topic in a forum chat was changed.
         *
         * @param chatId Chat identifier.
         * @param info New information about the topic.
         */
        public UpdateForumTopicInfo(long chatId, ForumTopicInfo info) {
            this.chatId = chatId;
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1802448073;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings for some type of chats were updated.
     */
    public static class UpdateScopeNotificationSettings extends Update {
        /**
         * Types of chats for which notification settings were updated.
         */
        public NotificationSettingsScope scope;
        /**
         * The new notification settings.
         */
        public ScopeNotificationSettings notificationSettings;

        /**
         * Notification settings for some type of chats were updated.
         */
        public UpdateScopeNotificationSettings() {
        }

        /**
         * Notification settings for some type of chats were updated.
         *
         * @param scope Types of chats for which notification settings were updated.
         * @param notificationSettings The new notification settings.
         */
        public UpdateScopeNotificationSettings(NotificationSettingsScope scope, ScopeNotificationSettings notificationSettings) {
            this.scope = scope;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1203975309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings for reactions were updated.
     */
    public static class UpdateReactionNotificationSettings extends Update {
        /**
         * The new notification settings.
         */
        public ReactionNotificationSettings notificationSettings;

        /**
         * Notification settings for reactions were updated.
         */
        public UpdateReactionNotificationSettings() {
        }

        /**
         * Notification settings for reactions were updated.
         *
         * @param notificationSettings The new notification settings.
         */
        public UpdateReactionNotificationSettings(ReactionNotificationSettings notificationSettings) {
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -447932436;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A notification was changed.
     */
    public static class UpdateNotification extends Update {
        /**
         * Unique notification group identifier.
         */
        public int notificationGroupId;
        /**
         * Changed notification.
         */
        public Notification notification;

        /**
         * A notification was changed.
         */
        public UpdateNotification() {
        }

        /**
         * A notification was changed.
         *
         * @param notificationGroupId Unique notification group identifier.
         * @param notification Changed notification.
         */
        public UpdateNotification(int notificationGroupId, Notification notification) {
            this.notificationGroupId = notificationGroupId;
            this.notification = notification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1897496876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of active notifications in a notification group has changed.
     */
    public static class UpdateNotificationGroup extends Update {
        /**
         * Unique notification group identifier.
         */
        public int notificationGroupId;
        /**
         * New type of the notification group.
         */
        public NotificationGroupType type;
        /**
         * Identifier of a chat to which all notifications in the group belong.
         */
        public long chatId;
        /**
         * Chat identifier, which notification settings must be applied to the added notifications.
         */
        public long notificationSettingsChatId;
        /**
         * Identifier of the notification sound to be played; 0 if sound is disabled.
         */
        public long notificationSoundId;
        /**
         * Total number of unread notifications in the group, can be bigger than number of active notifications.
         */
        public int totalCount;
        /**
         * List of added group notifications, sorted by notification identifier.
         */
        public Notification[] addedNotifications;
        /**
         * Identifiers of removed group notifications, sorted by notification identifier.
         */
        public int[] removedNotificationIds;

        /**
         * A list of active notifications in a notification group has changed.
         */
        public UpdateNotificationGroup() {
        }

        /**
         * A list of active notifications in a notification group has changed.
         *
         * @param notificationGroupId Unique notification group identifier.
         * @param type New type of the notification group.
         * @param chatId Identifier of a chat to which all notifications in the group belong.
         * @param notificationSettingsChatId Chat identifier, which notification settings must be applied to the added notifications.
         * @param notificationSoundId Identifier of the notification sound to be played; 0 if sound is disabled.
         * @param totalCount Total number of unread notifications in the group, can be bigger than number of active notifications.
         * @param addedNotifications List of added group notifications, sorted by notification identifier.
         * @param removedNotificationIds Identifiers of removed group notifications, sorted by notification identifier.
         */
        public UpdateNotificationGroup(int notificationGroupId, NotificationGroupType type, long chatId, long notificationSettingsChatId, long notificationSoundId, int totalCount, Notification[] addedNotifications, int[] removedNotificationIds) {
            this.notificationGroupId = notificationGroupId;
            this.type = type;
            this.chatId = chatId;
            this.notificationSettingsChatId = notificationSettingsChatId;
            this.notificationSoundId = notificationSoundId;
            this.totalCount = totalCount;
            this.addedNotifications = addedNotifications;
            this.removedNotificationIds = removedNotificationIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1381081378;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains active notifications that were shown on previous application launches. This update is sent only if the message database is used. In that case it comes once before any updateNotification and updateNotificationGroup update.
     */
    public static class UpdateActiveNotifications extends Update {
        /**
         * Lists of active notification groups.
         */
        public NotificationGroup[] groups;

        /**
         * Contains active notifications that were shown on previous application launches. This update is sent only if the message database is used. In that case it comes once before any updateNotification and updateNotificationGroup update.
         */
        public UpdateActiveNotifications() {
        }

        /**
         * Contains active notifications that were shown on previous application launches. This update is sent only if the message database is used. In that case it comes once before any updateNotification and updateNotificationGroup update.
         *
         * @param groups Lists of active notification groups.
         */
        public UpdateActiveNotifications(NotificationGroup[] groups) {
            this.groups = groups;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1306672221;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes whether there are some pending notification updates. Can be used to prevent application from killing, while there are some pending notifications.
     */
    public static class UpdateHavePendingNotifications extends Update {
        /**
         * True, if there are some delayed notification updates, which will be sent soon.
         */
        public boolean haveDelayedNotifications;
        /**
         * True, if there can be some yet unreceived notifications, which are being fetched from the server.
         */
        public boolean haveUnreceivedNotifications;

        /**
         * Describes whether there are some pending notification updates. Can be used to prevent application from killing, while there are some pending notifications.
         */
        public UpdateHavePendingNotifications() {
        }

        /**
         * Describes whether there are some pending notification updates. Can be used to prevent application from killing, while there are some pending notifications.
         *
         * @param haveDelayedNotifications True, if there are some delayed notification updates, which will be sent soon.
         * @param haveUnreceivedNotifications True, if there can be some yet unreceived notifications, which are being fetched from the server.
         */
        public UpdateHavePendingNotifications(boolean haveDelayedNotifications, boolean haveUnreceivedNotifications) {
            this.haveDelayedNotifications = haveDelayedNotifications;
            this.haveUnreceivedNotifications = haveUnreceivedNotifications;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 179233243;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some messages were deleted.
     */
    public static class UpdateDeleteMessages extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifiers of the deleted messages.
         */
        public long[] messageIds;
        /**
         * True, if the messages are permanently deleted by a user (as opposed to just becoming inaccessible).
         */
        public boolean isPermanent;
        /**
         * True, if the messages are deleted only from the cache and can possibly be retrieved again in the future.
         */
        public boolean fromCache;

        /**
         * Some messages were deleted.
         */
        public UpdateDeleteMessages() {
        }

        /**
         * Some messages were deleted.
         *
         * @param chatId Chat identifier.
         * @param messageIds Identifiers of the deleted messages.
         * @param isPermanent True, if the messages are permanently deleted by a user (as opposed to just becoming inaccessible).
         * @param fromCache True, if the messages are deleted only from the cache and can possibly be retrieved again in the future.
         */
        public UpdateDeleteMessages(long chatId, long[] messageIds, boolean isPermanent, boolean fromCache) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.isPermanent = isPermanent;
            this.fromCache = fromCache;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1669252686;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message sender activity in the chat has changed.
     */
    public static class UpdateChatAction extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * If not 0, the message thread identifier in which the action was performed.
         */
        public long messageThreadId;
        /**
         * Identifier of a message sender performing the action.
         */
        public MessageSender senderId;
        /**
         * The action.
         */
        public ChatAction action;

        /**
         * A message sender activity in the chat has changed.
         */
        public UpdateChatAction() {
        }

        /**
         * A message sender activity in the chat has changed.
         *
         * @param chatId Chat identifier.
         * @param messageThreadId If not 0, the message thread identifier in which the action was performed.
         * @param senderId Identifier of a message sender performing the action.
         * @param action The action.
         */
        public UpdateChatAction(long chatId, long messageThreadId, MessageSender senderId, ChatAction action) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.senderId = senderId;
            this.action = action;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1698703832;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user went online or offline.
     */
    public static class UpdateUserStatus extends Update {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * New status of the user.
         */
        public UserStatus status;

        /**
         * The user went online or offline.
         */
        public UpdateUserStatus() {
        }

        /**
         * The user went online or offline.
         *
         * @param userId User identifier.
         * @param status New status of the user.
         */
        public UpdateUserStatus(long userId, UserStatus status) {
            this.userId = userId;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 958468625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the application.
     */
    public static class UpdateUser extends Update {
        /**
         * New data about the user.
         */
        public User user;

        /**
         * Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the application.
         */
        public UpdateUser() {
        }

        /**
         * Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the application.
         *
         * @param user New data about the user.
         */
        public UpdateUser(User user) {
            this.user = user;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1183394041;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the application.
     */
    public static class UpdateBasicGroup extends Update {
        /**
         * New data about the group.
         */
        public BasicGroup basicGroup;

        /**
         * Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the application.
         */
        public UpdateBasicGroup() {
        }

        /**
         * Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the application.
         *
         * @param basicGroup New data about the group.
         */
        public UpdateBasicGroup(BasicGroup basicGroup) {
            this.basicGroup = basicGroup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1003239581;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the application.
     */
    public static class UpdateSupergroup extends Update {
        /**
         * New data about the supergroup.
         */
        public Supergroup supergroup;

        /**
         * Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the application.
         */
        public UpdateSupergroup() {
        }

        /**
         * Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the application.
         *
         * @param supergroup New data about the supergroup.
         */
        public UpdateSupergroup(Supergroup supergroup) {
            this.supergroup = supergroup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -76782300;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the application.
     */
    public static class UpdateSecretChat extends Update {
        /**
         * New data about the secret chat.
         */
        public SecretChat secretChat;

        /**
         * Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the application.
         */
        public UpdateSecretChat() {
        }

        /**
         * Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the application.
         *
         * @param secretChat New data about the secret chat.
         */
        public UpdateSecretChat(SecretChat secretChat) {
            this.secretChat = secretChat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1666903253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data in userFullInfo has been changed.
     */
    public static class UpdateUserFullInfo extends Update {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * New full information about the user.
         */
        public UserFullInfo userFullInfo;

        /**
         * Some data in userFullInfo has been changed.
         */
        public UpdateUserFullInfo() {
        }

        /**
         * Some data in userFullInfo has been changed.
         *
         * @param userId User identifier.
         * @param userFullInfo New full information about the user.
         */
        public UpdateUserFullInfo(long userId, UserFullInfo userFullInfo) {
            this.userId = userId;
            this.userFullInfo = userFullInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -51197161;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data in basicGroupFullInfo has been changed.
     */
    public static class UpdateBasicGroupFullInfo extends Update {
        /**
         * Identifier of a basic group.
         */
        public long basicGroupId;
        /**
         * New full information about the group.
         */
        public BasicGroupFullInfo basicGroupFullInfo;

        /**
         * Some data in basicGroupFullInfo has been changed.
         */
        public UpdateBasicGroupFullInfo() {
        }

        /**
         * Some data in basicGroupFullInfo has been changed.
         *
         * @param basicGroupId Identifier of a basic group.
         * @param basicGroupFullInfo New full information about the group.
         */
        public UpdateBasicGroupFullInfo(long basicGroupId, BasicGroupFullInfo basicGroupFullInfo) {
            this.basicGroupId = basicGroupId;
            this.basicGroupFullInfo = basicGroupFullInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1391881151;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data in supergroupFullInfo has been changed.
     */
    public static class UpdateSupergroupFullInfo extends Update {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * New full information about the supergroup.
         */
        public SupergroupFullInfo supergroupFullInfo;

        /**
         * Some data in supergroupFullInfo has been changed.
         */
        public UpdateSupergroupFullInfo() {
        }

        /**
         * Some data in supergroupFullInfo has been changed.
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param supergroupFullInfo New full information about the supergroup.
         */
        public UpdateSupergroupFullInfo(long supergroupId, SupergroupFullInfo supergroupFullInfo) {
            this.supergroupId = supergroupId;
            this.supergroupFullInfo = supergroupFullInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 435539214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A service notification from the server was received. Upon receiving this the application must show a popup with the content of the notification.
     */
    public static class UpdateServiceNotification extends Update {
        /**
         * Notification type. If type begins with &quot;AUTH_KEY_DROP_&quot;, then two buttons &quot;Cancel&quot; and &quot;Log out&quot; must be shown under notification; if user presses the second, all local data must be destroyed using Destroy method.
         */
        public String type;
        /**
         * Notification content.
         */
        public MessageContent content;

        /**
         * A service notification from the server was received. Upon receiving this the application must show a popup with the content of the notification.
         */
        public UpdateServiceNotification() {
        }

        /**
         * A service notification from the server was received. Upon receiving this the application must show a popup with the content of the notification.
         *
         * @param type Notification type. If type begins with &quot;AUTH_KEY_DROP_&quot;, then two buttons &quot;Cancel&quot; and &quot;Log out&quot; must be shown under notification; if user presses the second, all local data must be destroyed using Destroy method.
         * @param content Notification content.
         */
        public UpdateServiceNotification(String type, MessageContent content) {
            this.type = type;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1318622637;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a file was updated.
     */
    public static class UpdateFile extends Update {
        /**
         * New data about the file.
         */
        public File file;

        /**
         * Information about a file was updated.
         */
        public UpdateFile() {
        }

        /**
         * Information about a file was updated.
         *
         * @param file New data about the file.
         */
        public UpdateFile(File file) {
            this.file = file;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 114132831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file generation process needs to be started by the application.
     */
    public static class UpdateFileGenerationStart extends Update {
        /**
         * Unique identifier for the generation process.
         */
        public long generationId;
        /**
         * The path to a file from which a new file is generated; may be empty.
         */
        public String originalPath;
        /**
         * The path to a file that must be created and where the new file is generated.
         */
        public String destinationPath;
        /**
         * String specifying the conversion applied to the original file. If conversion is &quot;#url#&quot; than originalPath contains an HTTP/HTTPS URL of a file, which must be downloaded by the application.
         */
        public String conversion;

        /**
         * The file generation process needs to be started by the application.
         */
        public UpdateFileGenerationStart() {
        }

        /**
         * The file generation process needs to be started by the application.
         *
         * @param generationId Unique identifier for the generation process.
         * @param originalPath The path to a file from which a new file is generated; may be empty.
         * @param destinationPath The path to a file that must be created and where the new file is generated.
         * @param conversion String specifying the conversion applied to the original file. If conversion is &quot;#url#&quot; than originalPath contains an HTTP/HTTPS URL of a file, which must be downloaded by the application.
         */
        public UpdateFileGenerationStart(long generationId, String originalPath, String destinationPath, String conversion) {
            this.generationId = generationId;
            this.originalPath = originalPath;
            this.destinationPath = destinationPath;
            this.conversion = conversion;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 216817388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * File generation is no longer needed.
     */
    public static class UpdateFileGenerationStop extends Update {
        /**
         * Unique identifier for the generation process.
         */
        public long generationId;

        /**
         * File generation is no longer needed.
         */
        public UpdateFileGenerationStop() {
        }

        /**
         * File generation is no longer needed.
         *
         * @param generationId Unique identifier for the generation process.
         */
        public UpdateFileGenerationStop(long generationId) {
            this.generationId = generationId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1894449685;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The state of the file download list has changed.
     */
    public static class UpdateFileDownloads extends Update {
        /**
         * Total size of files in the file download list, in bytes.
         */
        public long totalSize;
        /**
         * Total number of files in the file download list.
         */
        public int totalCount;
        /**
         * Total downloaded size of files in the file download list, in bytes.
         */
        public long downloadedSize;

        /**
         * The state of the file download list has changed.
         */
        public UpdateFileDownloads() {
        }

        /**
         * The state of the file download list has changed.
         *
         * @param totalSize Total size of files in the file download list, in bytes.
         * @param totalCount Total number of files in the file download list.
         * @param downloadedSize Total downloaded size of files in the file download list, in bytes.
         */
        public UpdateFileDownloads(long totalSize, int totalCount, long downloadedSize) {
            this.totalSize = totalSize;
            this.totalCount = totalCount;
            this.downloadedSize = downloadedSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -389213497;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file was added to the file download list. This update is sent only after file download list is loaded for the first time.
     */
    public static class UpdateFileAddedToDownloads extends Update {
        /**
         * The added file download.
         */
        public FileDownload fileDownload;
        /**
         * New number of being downloaded and recently downloaded files found.
         */
        public DownloadedFileCounts counts;

        /**
         * A file was added to the file download list. This update is sent only after file download list is loaded for the first time.
         */
        public UpdateFileAddedToDownloads() {
        }

        /**
         * A file was added to the file download list. This update is sent only after file download list is loaded for the first time.
         *
         * @param fileDownload The added file download.
         * @param counts New number of being downloaded and recently downloaded files found.
         */
        public UpdateFileAddedToDownloads(FileDownload fileDownload, DownloadedFileCounts counts) {
            this.fileDownload = fileDownload;
            this.counts = counts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1609929242;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file download was changed. This update is sent only after file download list is loaded for the first time.
     */
    public static class UpdateFileDownload extends Update {
        /**
         * File identifier.
         */
        public int fileId;
        /**
         * Point in time (Unix timestamp) when the file downloading was completed; 0 if the file downloading isn't completed.
         */
        public int completeDate;
        /**
         * True, if downloading of the file is paused.
         */
        public boolean isPaused;
        /**
         * New number of being downloaded and recently downloaded files found.
         */
        public DownloadedFileCounts counts;

        /**
         * A file download was changed. This update is sent only after file download list is loaded for the first time.
         */
        public UpdateFileDownload() {
        }

        /**
         * A file download was changed. This update is sent only after file download list is loaded for the first time.
         *
         * @param fileId File identifier.
         * @param completeDate Point in time (Unix timestamp) when the file downloading was completed; 0 if the file downloading isn't completed.
         * @param isPaused True, if downloading of the file is paused.
         * @param counts New number of being downloaded and recently downloaded files found.
         */
        public UpdateFileDownload(int fileId, int completeDate, boolean isPaused, DownloadedFileCounts counts) {
            this.fileId = fileId;
            this.completeDate = completeDate;
            this.isPaused = isPaused;
            this.counts = counts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 875529162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file was removed from the file download list. This update is sent only after file download list is loaded for the first time.
     */
    public static class UpdateFileRemovedFromDownloads extends Update {
        /**
         * File identifier.
         */
        public int fileId;
        /**
         * New number of being downloaded and recently downloaded files found.
         */
        public DownloadedFileCounts counts;

        /**
         * A file was removed from the file download list. This update is sent only after file download list is loaded for the first time.
         */
        public UpdateFileRemovedFromDownloads() {
        }

        /**
         * A file was removed from the file download list. This update is sent only after file download list is loaded for the first time.
         *
         * @param fileId File identifier.
         * @param counts New number of being downloaded and recently downloaded files found.
         */
        public UpdateFileRemovedFromDownloads(int fileId, DownloadedFileCounts counts) {
            this.fileId = fileId;
            this.counts = counts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1853625576;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A request can't be completed unless application verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
     */
    public static class UpdateApplicationVerificationRequired extends Update {
        /**
         * Unique identifier for the verification process.
         */
        public long verificationId;
        /**
         * Unique base64url-encoded nonce for the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic) for Android, or a unique string to compare with verifyNonce field from a push notification for iOS.
         */
        public String nonce;
        /**
         * Cloud project number to pass to the Play Integrity API on Android.
         */
        public long cloudProjectNumber;

        /**
         * A request can't be completed unless application verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
         */
        public UpdateApplicationVerificationRequired() {
        }

        /**
         * A request can't be completed unless application verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
         *
         * @param verificationId Unique identifier for the verification process.
         * @param nonce Unique base64url-encoded nonce for the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic) for Android, or a unique string to compare with verifyNonce field from a push notification for iOS.
         * @param cloudProjectNumber Cloud project number to pass to the Play Integrity API on Android.
         */
        public UpdateApplicationVerificationRequired(long verificationId, String nonce, long cloudProjectNumber) {
            this.verificationId = verificationId;
            this.nonce = nonce;
            this.cloudProjectNumber = cloudProjectNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -979607081;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New call was created or information about a call was updated.
     */
    public static class UpdateCall extends Update {
        /**
         * New data about a call.
         */
        public Call call;

        /**
         * New call was created or information about a call was updated.
         */
        public UpdateCall() {
        }

        /**
         * New call was created or information about a call was updated.
         *
         * @param call New data about a call.
         */
        public UpdateCall(Call call) {
            this.call = call;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1337184477;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a group call was updated.
     */
    public static class UpdateGroupCall extends Update {
        /**
         * New data about a group call.
         */
        public GroupCall groupCall;

        /**
         * Information about a group call was updated.
         */
        public UpdateGroupCall() {
        }

        /**
         * Information about a group call was updated.
         *
         * @param groupCall New data about a group call.
         */
        public UpdateGroupCall(GroupCall groupCall) {
            this.groupCall = groupCall;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 808603136;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a group call participant was changed. The updates are sent only after the group call is received through getGroupCall and only if the call is joined or being joined.
     */
    public static class UpdateGroupCallParticipant extends Update {
        /**
         * Identifier of group call.
         */
        public int groupCallId;
        /**
         * New data about a participant.
         */
        public GroupCallParticipant participant;

        /**
         * Information about a group call participant was changed. The updates are sent only after the group call is received through getGroupCall and only if the call is joined or being joined.
         */
        public UpdateGroupCallParticipant() {
        }

        /**
         * Information about a group call participant was changed. The updates are sent only after the group call is received through getGroupCall and only if the call is joined or being joined.
         *
         * @param groupCallId Identifier of group call.
         * @param participant New data about a participant.
         */
        public UpdateGroupCallParticipant(int groupCallId, GroupCallParticipant participant) {
            this.groupCallId = groupCallId;
            this.participant = participant;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -803128071;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New call signaling data arrived.
     */
    public static class UpdateNewCallSignalingData extends Update {
        /**
         * The call identifier.
         */
        public int callId;
        /**
         * The data.
         */
        public byte[] data;

        /**
         * New call signaling data arrived.
         */
        public UpdateNewCallSignalingData() {
        }

        /**
         * New call signaling data arrived.
         *
         * @param callId The call identifier.
         * @param data The data.
         */
        public UpdateNewCallSignalingData(int callId, byte[] data) {
            this.callId = callId;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 583634317;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some privacy setting rules have been changed.
     */
    public static class UpdateUserPrivacySettingRules extends Update {
        /**
         * The privacy setting.
         */
        public UserPrivacySetting setting;
        /**
         * New privacy rules.
         */
        public UserPrivacySettingRules rules;

        /**
         * Some privacy setting rules have been changed.
         */
        public UpdateUserPrivacySettingRules() {
        }

        /**
         * Some privacy setting rules have been changed.
         *
         * @param setting The privacy setting.
         * @param rules New privacy rules.
         */
        public UpdateUserPrivacySettingRules(UserPrivacySetting setting, UserPrivacySettingRules rules) {
            this.setting = setting;
            this.rules = rules;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -912960778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of unread messages in a chat list has changed. This update is sent only if the message database is used.
     */
    public static class UpdateUnreadMessageCount extends Update {
        /**
         * The chat list with changed number of unread messages.
         */
        public ChatList chatList;
        /**
         * Total number of unread messages.
         */
        public int unreadCount;
        /**
         * Total number of unread messages in unmuted chats.
         */
        public int unreadUnmutedCount;

        /**
         * Number of unread messages in a chat list has changed. This update is sent only if the message database is used.
         */
        public UpdateUnreadMessageCount() {
        }

        /**
         * Number of unread messages in a chat list has changed. This update is sent only if the message database is used.
         *
         * @param chatList The chat list with changed number of unread messages.
         * @param unreadCount Total number of unread messages.
         * @param unreadUnmutedCount Total number of unread messages in unmuted chats.
         */
        public UpdateUnreadMessageCount(ChatList chatList, int unreadCount, int unreadUnmutedCount) {
            this.chatList = chatList;
            this.unreadCount = unreadCount;
            this.unreadUnmutedCount = unreadUnmutedCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 78987721;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of unread chats, i.e. with unread messages or marked as unread, has changed. This update is sent only if the message database is used.
     */
    public static class UpdateUnreadChatCount extends Update {
        /**
         * The chat list with changed number of unread messages.
         */
        public ChatList chatList;
        /**
         * Approximate total number of chats in the chat list.
         */
        public int totalCount;
        /**
         * Total number of unread chats.
         */
        public int unreadCount;
        /**
         * Total number of unread unmuted chats.
         */
        public int unreadUnmutedCount;
        /**
         * Total number of chats marked as unread.
         */
        public int markedAsUnreadCount;
        /**
         * Total number of unmuted chats marked as unread.
         */
        public int markedAsUnreadUnmutedCount;

        /**
         * Number of unread chats, i.e. with unread messages or marked as unread, has changed. This update is sent only if the message database is used.
         */
        public UpdateUnreadChatCount() {
        }

        /**
         * Number of unread chats, i.e. with unread messages or marked as unread, has changed. This update is sent only if the message database is used.
         *
         * @param chatList The chat list with changed number of unread messages.
         * @param totalCount Approximate total number of chats in the chat list.
         * @param unreadCount Total number of unread chats.
         * @param unreadUnmutedCount Total number of unread unmuted chats.
         * @param markedAsUnreadCount Total number of chats marked as unread.
         * @param markedAsUnreadUnmutedCount Total number of unmuted chats marked as unread.
         */
        public UpdateUnreadChatCount(ChatList chatList, int totalCount, int unreadCount, int unreadUnmutedCount, int markedAsUnreadCount, int markedAsUnreadUnmutedCount) {
            this.chatList = chatList;
            this.totalCount = totalCount;
            this.unreadCount = unreadCount;
            this.unreadUnmutedCount = unreadUnmutedCount;
            this.markedAsUnreadCount = markedAsUnreadCount;
            this.markedAsUnreadUnmutedCount = markedAsUnreadUnmutedCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1994494530;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story was changed.
     */
    public static class UpdateStory extends Update {
        /**
         * The new information about the story.
         */
        public Story story;

        /**
         * A story was changed.
         */
        public UpdateStory() {
        }

        /**
         * A story was changed.
         *
         * @param story The new information about the story.
         */
        public UpdateStory(Story story) {
            this.story = story;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 419845935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story became inaccessible.
     */
    public static class UpdateStoryDeleted extends Update {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storySenderChatId;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * A story became inaccessible.
         */
        public UpdateStoryDeleted() {
        }

        /**
         * A story became inaccessible.
         *
         * @param storySenderChatId Identifier of the chat that posted the story.
         * @param storyId Story identifier.
         */
        public UpdateStoryDeleted(long storySenderChatId, int storyId) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1879567261;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story has been successfully sent.
     */
    public static class UpdateStorySendSucceeded extends Update {
        /**
         * The sent story.
         */
        public Story story;
        /**
         * The previous temporary story identifier.
         */
        public int oldStoryId;

        /**
         * A story has been successfully sent.
         */
        public UpdateStorySendSucceeded() {
        }

        /**
         * A story has been successfully sent.
         *
         * @param story The sent story.
         * @param oldStoryId The previous temporary story identifier.
         */
        public UpdateStorySendSucceeded(Story story, int oldStoryId) {
            this.story = story;
            this.oldStoryId = oldStoryId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1188651433;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story failed to send. If the story sending is canceled, then updateStoryDeleted will be received instead of this update.
     */
    public static class UpdateStorySendFailed extends Update {
        /**
         * The failed to send story.
         */
        public Story story;
        /**
         * The cause of the story sending failure.
         */
        public Error error;
        /**
         * Type of the error; may be null if unknown.
         */
        @Nullable public CanSendStoryResult errorType;

        /**
         * A story failed to send. If the story sending is canceled, then updateStoryDeleted will be received instead of this update.
         */
        public UpdateStorySendFailed() {
        }

        /**
         * A story failed to send. If the story sending is canceled, then updateStoryDeleted will be received instead of this update.
         *
         * @param story The failed to send story.
         * @param error The cause of the story sending failure.
         * @param errorType Type of the error; may be null if unknown.
         */
        public UpdateStorySendFailed(Story story, Error error, CanSendStoryResult errorType) {
            this.story = story;
            this.error = error;
            this.errorType = errorType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -532221543;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of active stories posted by a specific chat has changed.
     */
    public static class UpdateChatActiveStories extends Update {
        /**
         * The new list of active stories.
         */
        public ChatActiveStories activeStories;

        /**
         * The list of active stories posted by a specific chat has changed.
         */
        public UpdateChatActiveStories() {
        }

        /**
         * The list of active stories posted by a specific chat has changed.
         *
         * @param activeStories The new list of active stories.
         */
        public UpdateChatActiveStories(ChatActiveStories activeStories) {
            this.activeStories = activeStories;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2037935148;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of chats in a story list has changed.
     */
    public static class UpdateStoryListChatCount extends Update {
        /**
         * The story list.
         */
        public StoryList storyList;
        /**
         * Approximate total number of chats with active stories in the list.
         */
        public int chatCount;

        /**
         * Number of chats in a story list has changed.
         */
        public UpdateStoryListChatCount() {
        }

        /**
         * Number of chats in a story list has changed.
         *
         * @param storyList The story list.
         * @param chatCount Approximate total number of chats with active stories in the list.
         */
        public UpdateStoryListChatCount(StoryList storyList, int chatCount) {
            this.storyList = storyList;
            this.chatCount = chatCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2009871041;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Story stealth mode settings have changed.
     */
    public static class UpdateStoryStealthMode extends Update {
        /**
         * Point in time (Unix timestamp) until stealth mode is active; 0 if it is disabled.
         */
        public int activeUntilDate;
        /**
         * Point in time (Unix timestamp) when stealth mode can be enabled again; 0 if there is no active cooldown.
         */
        public int cooldownUntilDate;

        /**
         * Story stealth mode settings have changed.
         */
        public UpdateStoryStealthMode() {
        }

        /**
         * Story stealth mode settings have changed.
         *
         * @param activeUntilDate Point in time (Unix timestamp) until stealth mode is active; 0 if it is disabled.
         * @param cooldownUntilDate Point in time (Unix timestamp) when stealth mode can be enabled again; 0 if there is no active cooldown.
         */
        public UpdateStoryStealthMode(int activeUntilDate, int cooldownUntilDate) {
            this.activeUntilDate = activeUntilDate;
            this.cooldownUntilDate = cooldownUntilDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1878506778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An option changed its value.
     */
    public static class UpdateOption extends Update {
        /**
         * The option name.
         */
        public String name;
        /**
         * The new option value.
         */
        public OptionValue value;

        /**
         * An option changed its value.
         */
        public UpdateOption() {
        }

        /**
         * An option changed its value.
         *
         * @param name The option name.
         * @param value The new option value.
         */
        public UpdateOption(String name, OptionValue value) {
            this.name = name;
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 900822020;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker set has changed.
     */
    public static class UpdateStickerSet extends Update {
        /**
         * The sticker set.
         */
        public StickerSet stickerSet;

        /**
         * A sticker set has changed.
         */
        public UpdateStickerSet() {
        }

        /**
         * A sticker set has changed.
         *
         * @param stickerSet The sticker set.
         */
        public UpdateStickerSet(StickerSet stickerSet) {
            this.stickerSet = stickerSet;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1879268812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of installed sticker sets was updated.
     */
    public static class UpdateInstalledStickerSets extends Update {
        /**
         * Type of the affected stickers.
         */
        public StickerType stickerType;
        /**
         * The new list of installed ordinary sticker sets.
         */
        public long[] stickerSetIds;

        /**
         * The list of installed sticker sets was updated.
         */
        public UpdateInstalledStickerSets() {
        }

        /**
         * The list of installed sticker sets was updated.
         *
         * @param stickerType Type of the affected stickers.
         * @param stickerSetIds The new list of installed ordinary sticker sets.
         */
        public UpdateInstalledStickerSets(StickerType stickerType, long[] stickerSetIds) {
            this.stickerType = stickerType;
            this.stickerSetIds = stickerSetIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1735084182;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of trending sticker sets was updated or some of them were viewed.
     */
    public static class UpdateTrendingStickerSets extends Update {
        /**
         * Type of the affected stickers.
         */
        public StickerType stickerType;
        /**
         * The prefix of the list of trending sticker sets with the newest trending sticker sets.
         */
        public TrendingStickerSets stickerSets;

        /**
         * The list of trending sticker sets was updated or some of them were viewed.
         */
        public UpdateTrendingStickerSets() {
        }

        /**
         * The list of trending sticker sets was updated or some of them were viewed.
         *
         * @param stickerType Type of the affected stickers.
         * @param stickerSets The prefix of the list of trending sticker sets with the newest trending sticker sets.
         */
        public UpdateTrendingStickerSets(StickerType stickerType, TrendingStickerSets stickerSets) {
            this.stickerType = stickerType;
            this.stickerSets = stickerSets;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1266307239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of recently used stickers was updated.
     */
    public static class UpdateRecentStickers extends Update {
        /**
         * True, if the list of stickers attached to photo or video files was updated; otherwise, the list of sent stickers is updated.
         */
        public boolean isAttached;
        /**
         * The new list of file identifiers of recently used stickers.
         */
        public int[] stickerIds;

        /**
         * The list of recently used stickers was updated.
         */
        public UpdateRecentStickers() {
        }

        /**
         * The list of recently used stickers was updated.
         *
         * @param isAttached True, if the list of stickers attached to photo or video files was updated; otherwise, the list of sent stickers is updated.
         * @param stickerIds The new list of file identifiers of recently used stickers.
         */
        public UpdateRecentStickers(boolean isAttached, int[] stickerIds) {
            this.isAttached = isAttached;
            this.stickerIds = stickerIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1906403540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of favorite stickers was updated.
     */
    public static class UpdateFavoriteStickers extends Update {
        /**
         * The new list of file identifiers of favorite stickers.
         */
        public int[] stickerIds;

        /**
         * The list of favorite stickers was updated.
         */
        public UpdateFavoriteStickers() {
        }

        /**
         * The list of favorite stickers was updated.
         *
         * @param stickerIds The new list of file identifiers of favorite stickers.
         */
        public UpdateFavoriteStickers(int[] stickerIds) {
            this.stickerIds = stickerIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1662240999;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of saved animations was updated.
     */
    public static class UpdateSavedAnimations extends Update {
        /**
         * The new list of file identifiers of saved animations.
         */
        public int[] animationIds;

        /**
         * The list of saved animations was updated.
         */
        public UpdateSavedAnimations() {
        }

        /**
         * The list of saved animations was updated.
         *
         * @param animationIds The new list of file identifiers of saved animations.
         */
        public UpdateSavedAnimations(int[] animationIds) {
            this.animationIds = animationIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 65563814;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of saved notification sounds was updated. This update may not be sent until information about a notification sound was requested for the first time.
     */
    public static class UpdateSavedNotificationSounds extends Update {
        /**
         * The new list of identifiers of saved notification sounds.
         */
        public long[] notificationSoundIds;

        /**
         * The list of saved notification sounds was updated. This update may not be sent until information about a notification sound was requested for the first time.
         */
        public UpdateSavedNotificationSounds() {
        }

        /**
         * The list of saved notification sounds was updated. This update may not be sent until information about a notification sound was requested for the first time.
         *
         * @param notificationSoundIds The new list of identifiers of saved notification sounds.
         */
        public UpdateSavedNotificationSounds(long[] notificationSoundIds) {
            this.notificationSoundIds = notificationSoundIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1052725698;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The default background has changed.
     */
    public static class UpdateDefaultBackground extends Update {
        /**
         * True, if default background for dark theme has changed.
         */
        public boolean forDarkTheme;
        /**
         * The new default background; may be null.
         */
        @Nullable public Background background;

        /**
         * The default background has changed.
         */
        public UpdateDefaultBackground() {
        }

        /**
         * The default background has changed.
         *
         * @param forDarkTheme True, if default background for dark theme has changed.
         * @param background The new default background; may be null.
         */
        public UpdateDefaultBackground(boolean forDarkTheme, Background background) {
            this.forDarkTheme = forDarkTheme;
            this.background = background;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -716139217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of available chat themes has changed.
     */
    public static class UpdateChatThemes extends Update {
        /**
         * The new list of chat themes.
         */
        public ChatTheme[] chatThemes;

        /**
         * The list of available chat themes has changed.
         */
        public UpdateChatThemes() {
        }

        /**
         * The list of available chat themes has changed.
         *
         * @param chatThemes The new list of chat themes.
         */
        public UpdateChatThemes(ChatTheme[] chatThemes) {
            this.chatThemes = chatThemes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1588098376;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of supported accent colors has changed.
     */
    public static class UpdateAccentColors extends Update {
        /**
         * Information about supported colors; colors with identifiers 0 (red), 1 (orange), 2 (purple/violet), 3 (green), 4 (cyan), 5 (blue), 6 (pink) must always be supported and aren't included in the list. The exact colors for the accent colors with identifiers 0-6 must be taken from the app theme.
         */
        public AccentColor[] colors;
        /**
         * The list of accent color identifiers, which can be set through setAccentColor and setChatAccentColor. The colors must be shown in the specififed order.
         */
        public int[] availableAccentColorIds;

        /**
         * The list of supported accent colors has changed.
         */
        public UpdateAccentColors() {
        }

        /**
         * The list of supported accent colors has changed.
         *
         * @param colors Information about supported colors; colors with identifiers 0 (red), 1 (orange), 2 (purple/violet), 3 (green), 4 (cyan), 5 (blue), 6 (pink) must always be supported and aren't included in the list. The exact colors for the accent colors with identifiers 0-6 must be taken from the app theme.
         * @param availableAccentColorIds The list of accent color identifiers, which can be set through setAccentColor and setChatAccentColor. The colors must be shown in the specififed order.
         */
        public UpdateAccentColors(AccentColor[] colors, int[] availableAccentColorIds) {
            this.colors = colors;
            this.availableAccentColorIds = availableAccentColorIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1197047738;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of supported accent colors for user profiles has changed.
     */
    public static class UpdateProfileAccentColors extends Update {
        /**
         * Information about supported colors.
         */
        public ProfileAccentColor[] colors;
        /**
         * The list of accent color identifiers, which can be set through setProfileAccentColor and setChatProfileAccentColor. The colors must be shown in the specififed order.
         */
        public int[] availableAccentColorIds;

        /**
         * The list of supported accent colors for user profiles has changed.
         */
        public UpdateProfileAccentColors() {
        }

        /**
         * The list of supported accent colors for user profiles has changed.
         *
         * @param colors Information about supported colors.
         * @param availableAccentColorIds The list of accent color identifiers, which can be set through setProfileAccentColor and setChatProfileAccentColor. The colors must be shown in the specififed order.
         */
        public UpdateProfileAccentColors(ProfileAccentColor[] colors, int[] availableAccentColorIds) {
            this.colors = colors;
            this.availableAccentColorIds = availableAccentColorIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 605202104;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some language pack strings have been updated.
     */
    public static class UpdateLanguagePackStrings extends Update {
        /**
         * Localization target to which the language pack belongs.
         */
        public String localizationTarget;
        /**
         * Identifier of the updated language pack.
         */
        public String languagePackId;
        /**
         * List of changed language pack strings; empty if all strings have changed.
         */
        public LanguagePackString[] strings;

        /**
         * Some language pack strings have been updated.
         */
        public UpdateLanguagePackStrings() {
        }

        /**
         * Some language pack strings have been updated.
         *
         * @param localizationTarget Localization target to which the language pack belongs.
         * @param languagePackId Identifier of the updated language pack.
         * @param strings List of changed language pack strings; empty if all strings have changed.
         */
        public UpdateLanguagePackStrings(String localizationTarget, String languagePackId, LanguagePackString[] strings) {
            this.localizationTarget = localizationTarget;
            this.languagePackId = languagePackId;
            this.strings = strings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1056319886;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The connection state has changed. This update must be used only to show a human-readable description of the connection state.
     */
    public static class UpdateConnectionState extends Update {
        /**
         * The new connection state.
         */
        public ConnectionState state;

        /**
         * The connection state has changed. This update must be used only to show a human-readable description of the connection state.
         */
        public UpdateConnectionState() {
        }

        /**
         * The connection state has changed. This update must be used only to show a human-readable description of the connection state.
         *
         * @param state The new connection state.
         */
        public UpdateConnectionState(ConnectionState state) {
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1469292078;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New terms of service must be accepted by the user. If the terms of service are declined, then the deleteAccount method must be called with the reason &quot;Decline ToS update&quot;.
     */
    public static class UpdateTermsOfService extends Update {
        /**
         * Identifier of the terms of service.
         */
        public String termsOfServiceId;
        /**
         * The new terms of service.
         */
        public TermsOfService termsOfService;

        /**
         * New terms of service must be accepted by the user. If the terms of service are declined, then the deleteAccount method must be called with the reason &quot;Decline ToS update&quot;.
         */
        public UpdateTermsOfService() {
        }

        /**
         * New terms of service must be accepted by the user. If the terms of service are declined, then the deleteAccount method must be called with the reason &quot;Decline ToS update&quot;.
         *
         * @param termsOfServiceId Identifier of the terms of service.
         * @param termsOfService The new terms of service.
         */
        public UpdateTermsOfService(String termsOfServiceId, TermsOfService termsOfService) {
            this.termsOfServiceId = termsOfServiceId;
            this.termsOfService = termsOfService;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1304640162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of users nearby has changed. The update is guaranteed to be sent only 60 seconds after a successful searchChatsNearby request.
     */
    public static class UpdateUsersNearby extends Update {
        /**
         * The new list of users nearby.
         */
        public ChatNearby[] usersNearby;

        /**
         * The list of users nearby has changed. The update is guaranteed to be sent only 60 seconds after a successful searchChatsNearby request.
         */
        public UpdateUsersNearby() {
        }

        /**
         * The list of users nearby has changed. The update is guaranteed to be sent only 60 seconds after a successful searchChatsNearby request.
         *
         * @param usersNearby The new list of users nearby.
         */
        public UpdateUsersNearby(ChatNearby[] usersNearby) {
            this.usersNearby = usersNearby;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1517109163;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The first unconfirmed session has changed.
     */
    public static class UpdateUnconfirmedSession extends Update {
        /**
         * The unconfirmed session; may be null if none.
         */
        @Nullable public UnconfirmedSession session;

        /**
         * The first unconfirmed session has changed.
         */
        public UpdateUnconfirmedSession() {
        }

        /**
         * The first unconfirmed session has changed.
         *
         * @param session The unconfirmed session; may be null if none.
         */
        public UpdateUnconfirmedSession(UnconfirmedSession session) {
            this.session = session;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -22673268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of bots added to attachment or side menu has changed.
     */
    public static class UpdateAttachmentMenuBots extends Update {
        /**
         * The new list of bots. The bots must not be shown on scheduled messages screen.
         */
        public AttachmentMenuBot[] bots;

        /**
         * The list of bots added to attachment or side menu has changed.
         */
        public UpdateAttachmentMenuBots() {
        }

        /**
         * The list of bots added to attachment or side menu has changed.
         *
         * @param bots The new list of bots. The bots must not be shown on scheduled messages screen.
         */
        public UpdateAttachmentMenuBots(AttachmentMenuBot[] bots) {
            this.bots = bots;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 291369922;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was sent by an opened Web App, so the Web App needs to be closed.
     */
    public static class UpdateWebAppMessageSent extends Update {
        /**
         * Identifier of Web App launch.
         */
        public long webAppLaunchId;

        /**
         * A message was sent by an opened Web App, so the Web App needs to be closed.
         */
        public UpdateWebAppMessageSent() {
        }

        /**
         * A message was sent by an opened Web App, so the Web App needs to be closed.
         *
         * @param webAppLaunchId Identifier of Web App launch.
         */
        public UpdateWebAppMessageSent(long webAppLaunchId) {
            this.webAppLaunchId = webAppLaunchId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1480790569;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of active emoji reactions has changed.
     */
    public static class UpdateActiveEmojiReactions extends Update {
        /**
         * The new list of active emoji reactions.
         */
        public String[] emojis;

        /**
         * The list of active emoji reactions has changed.
         */
        public UpdateActiveEmojiReactions() {
        }

        /**
         * The list of active emoji reactions has changed.
         *
         * @param emojis The new list of active emoji reactions.
         */
        public UpdateActiveEmojiReactions(String[] emojis) {
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 77556818;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of available message effects has changed.
     */
    public static class UpdateAvailableMessageEffects extends Update {
        /**
         * The new list of available message effects from emoji reactions.
         */
        public long[] reactionEffectIds;
        /**
         * The new list of available message effects from Premium stickers.
         */
        public long[] stickerEffectIds;

        /**
         * The list of available message effects has changed.
         */
        public UpdateAvailableMessageEffects() {
        }

        /**
         * The list of available message effects has changed.
         *
         * @param reactionEffectIds The new list of available message effects from emoji reactions.
         * @param stickerEffectIds The new list of available message effects from Premium stickers.
         */
        public UpdateAvailableMessageEffects(long[] reactionEffectIds, long[] stickerEffectIds) {
            this.reactionEffectIds = reactionEffectIds;
            this.stickerEffectIds = stickerEffectIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1964701061;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The type of default reaction has changed.
     */
    public static class UpdateDefaultReactionType extends Update {
        /**
         * The new type of the default reaction.
         */
        public ReactionType reactionType;

        /**
         * The type of default reaction has changed.
         */
        public UpdateDefaultReactionType() {
        }

        /**
         * The type of default reaction has changed.
         *
         * @param reactionType The new type of the default reaction.
         */
        public UpdateDefaultReactionType(ReactionType reactionType) {
            this.reactionType = reactionType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1264668933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Tags used in Saved Messages or a Saved Messages topic have changed.
     */
    public static class UpdateSavedMessagesTags extends Update {
        /**
         * Identifier of Saved Messages topic which tags were changed; 0 if tags for the whole chat has changed.
         */
        public long savedMessagesTopicId;
        /**
         * The new tags.
         */
        public SavedMessagesTags tags;

        /**
         * Tags used in Saved Messages or a Saved Messages topic have changed.
         */
        public UpdateSavedMessagesTags() {
        }

        /**
         * Tags used in Saved Messages or a Saved Messages topic have changed.
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which tags were changed; 0 if tags for the whole chat has changed.
         * @param tags The new tags.
         */
        public UpdateSavedMessagesTags(long savedMessagesTopicId, SavedMessagesTags tags) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.tags = tags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1938178634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The number of Telegram stars owned by the current user has changed.
     */
    public static class UpdateOwnedStarCount extends Update {
        /**
         * The new number of Telegram stars owned.
         */
        public long starCount;

        /**
         * The number of Telegram stars owned by the current user has changed.
         */
        public UpdateOwnedStarCount() {
        }

        /**
         * The number of Telegram stars owned by the current user has changed.
         *
         * @param starCount The new number of Telegram stars owned.
         */
        public UpdateOwnedStarCount(long starCount) {
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -560374919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The revenue earned from sponsored messages in a chat has changed. If chat revenue screen is opened, then getChatRevenueTransactions may be called to fetch new transactions.
     */
    public static class UpdateChatRevenueAmount extends Update {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * New amount of earned revenue.
         */
        public ChatRevenueAmount revenueAmount;

        /**
         * The revenue earned from sponsored messages in a chat has changed. If chat revenue screen is opened, then getChatRevenueTransactions may be called to fetch new transactions.
         */
        public UpdateChatRevenueAmount() {
        }

        /**
         * The revenue earned from sponsored messages in a chat has changed. If chat revenue screen is opened, then getChatRevenueTransactions may be called to fetch new transactions.
         *
         * @param chatId Identifier of the chat.
         * @param revenueAmount New amount of earned revenue.
         */
        public UpdateChatRevenueAmount(long chatId, ChatRevenueAmount revenueAmount) {
            this.chatId = chatId;
            this.revenueAmount = revenueAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -959857468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The Telegram star revenue earned by a bot or a chat has changed. If star transactions screen of the chat is opened, then getStarTransactions may be called to fetch new transactions.
     */
    public static class UpdateStarRevenueStatus extends Update {
        /**
         * Identifier of the owner of the Telegram stars.
         */
        public MessageSender ownerId;
        /**
         * New Telegram star revenue status.
         */
        public StarRevenueStatus status;

        /**
         * The Telegram star revenue earned by a bot or a chat has changed. If star transactions screen of the chat is opened, then getStarTransactions may be called to fetch new transactions.
         */
        public UpdateStarRevenueStatus() {
        }

        /**
         * The Telegram star revenue earned by a bot or a chat has changed. If star transactions screen of the chat is opened, then getStarTransactions may be called to fetch new transactions.
         *
         * @param ownerId Identifier of the owner of the Telegram stars.
         * @param status New Telegram star revenue status.
         */
        public UpdateStarRevenueStatus(MessageSender ownerId, StarRevenueStatus status) {
            this.ownerId = ownerId;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -280232757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The parameters of speech recognition without Telegram Premium subscription has changed.
     */
    public static class UpdateSpeechRecognitionTrial extends Update {
        /**
         * The maximum allowed duration of media for speech recognition without Telegram Premium subscription, in seconds.
         */
        public int maxMediaDuration;
        /**
         * The total number of allowed speech recognitions per week; 0 if none.
         */
        public int weeklyCount;
        /**
         * Number of left speech recognition attempts this week.
         */
        public int leftCount;
        /**
         * Point in time (Unix timestamp) when the weekly number of tries will reset; 0 if unknown.
         */
        public int nextResetDate;

        /**
         * The parameters of speech recognition without Telegram Premium subscription has changed.
         */
        public UpdateSpeechRecognitionTrial() {
        }

        /**
         * The parameters of speech recognition without Telegram Premium subscription has changed.
         *
         * @param maxMediaDuration The maximum allowed duration of media for speech recognition without Telegram Premium subscription, in seconds.
         * @param weeklyCount The total number of allowed speech recognitions per week; 0 if none.
         * @param leftCount Number of left speech recognition attempts this week.
         * @param nextResetDate Point in time (Unix timestamp) when the weekly number of tries will reset; 0 if unknown.
         */
        public UpdateSpeechRecognitionTrial(int maxMediaDuration, int weeklyCount, int leftCount, int nextResetDate) {
            this.maxMediaDuration = maxMediaDuration;
            this.weeklyCount = weeklyCount;
            this.leftCount = leftCount;
            this.nextResetDate = nextResetDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -11600703;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of supported dice emojis has changed.
     */
    public static class UpdateDiceEmojis extends Update {
        /**
         * The new list of supported dice emojis.
         */
        public String[] emojis;

        /**
         * The list of supported dice emojis has changed.
         */
        public UpdateDiceEmojis() {
        }

        /**
         * The list of supported dice emojis has changed.
         *
         * @param emojis The new list of supported dice emojis.
         */
        public UpdateDiceEmojis(String[] emojis) {
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1069066940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some animated emoji message was clicked and a big animated sticker must be played if the message is visible on the screen. chatActionWatchingAnimations with the text of the message needs to be sent if the sticker is played.
     */
    public static class UpdateAnimatedEmojiMessageClicked extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The animated sticker to be played.
         */
        public Sticker sticker;

        /**
         * Some animated emoji message was clicked and a big animated sticker must be played if the message is visible on the screen. chatActionWatchingAnimations with the text of the message needs to be sent if the sticker is played.
         */
        public UpdateAnimatedEmojiMessageClicked() {
        }

        /**
         * Some animated emoji message was clicked and a big animated sticker must be played if the message is visible on the screen. chatActionWatchingAnimations with the text of the message needs to be sent if the sticker is played.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param sticker The animated sticker to be played.
         */
        public UpdateAnimatedEmojiMessageClicked(long chatId, long messageId, Sticker sticker) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1558809595;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The parameters of animation search through getOption(&quot;animation_search_bot_username&quot;) bot has changed.
     */
    public static class UpdateAnimationSearchParameters extends Update {
        /**
         * Name of the animation search provider.
         */
        public String provider;
        /**
         * The new list of emojis suggested for searching.
         */
        public String[] emojis;

        /**
         * The parameters of animation search through getOption(&quot;animation_search_bot_username&quot;) bot has changed.
         */
        public UpdateAnimationSearchParameters() {
        }

        /**
         * The parameters of animation search through getOption(&quot;animation_search_bot_username&quot;) bot has changed.
         *
         * @param provider Name of the animation search provider.
         * @param emojis The new list of emojis suggested for searching.
         */
        public UpdateAnimationSearchParameters(String provider, String[] emojis) {
            this.provider = provider;
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1144983202;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of suggested to the user actions has changed.
     */
    public static class UpdateSuggestedActions extends Update {
        /**
         * Added suggested actions.
         */
        public SuggestedAction[] addedActions;
        /**
         * Removed suggested actions.
         */
        public SuggestedAction[] removedActions;

        /**
         * The list of suggested to the user actions has changed.
         */
        public UpdateSuggestedActions() {
        }

        /**
         * The list of suggested to the user actions has changed.
         *
         * @param addedActions Added suggested actions.
         * @param removedActions Removed suggested actions.
         */
        public UpdateSuggestedActions(SuggestedAction[] addedActions, SuggestedAction[] removedActions) {
            this.addedActions = addedActions;
            this.removedActions = removedActions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1459452346;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Download or upload file speed for the user was limited, but it can be restored by subscription to Telegram Premium. The notification can be postponed until a being downloaded or uploaded file is visible to the user Use getOption(&quot;premium_download_speedup&quot;) or getOption(&quot;premium_upload_speedup&quot;) to get expected speedup after subscription to Telegram Premium.
     */
    public static class UpdateSpeedLimitNotification extends Update {
        /**
         * True, if upload speed was limited; false, if download speed was limited.
         */
        public boolean isUpload;

        /**
         * Download or upload file speed for the user was limited, but it can be restored by subscription to Telegram Premium. The notification can be postponed until a being downloaded or uploaded file is visible to the user Use getOption(&quot;premium_download_speedup&quot;) or getOption(&quot;premium_upload_speedup&quot;) to get expected speedup after subscription to Telegram Premium.
         */
        public UpdateSpeedLimitNotification() {
        }

        /**
         * Download or upload file speed for the user was limited, but it can be restored by subscription to Telegram Premium. The notification can be postponed until a being downloaded or uploaded file is visible to the user Use getOption(&quot;premium_download_speedup&quot;) or getOption(&quot;premium_upload_speedup&quot;) to get expected speedup after subscription to Telegram Premium.
         *
         * @param isUpload True, if upload speed was limited; false, if download speed was limited.
         */
        public UpdateSpeedLimitNotification(boolean isUpload) {
            this.isUpload = isUpload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -964437912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of contacts that had birthdays recently or will have birthday soon has changed.
     */
    public static class UpdateContactCloseBirthdays extends Update {
        /**
         * List of contact users with close birthday.
         */
        public CloseBirthdayUser[] closeBirthdayUsers;

        /**
         * The list of contacts that had birthdays recently or will have birthday soon has changed.
         */
        public UpdateContactCloseBirthdays() {
        }

        /**
         * The list of contacts that had birthdays recently or will have birthday soon has changed.
         *
         * @param closeBirthdayUsers List of contact users with close birthday.
         */
        public UpdateContactCloseBirthdays(CloseBirthdayUser[] closeBirthdayUsers) {
            this.closeBirthdayUsers = closeBirthdayUsers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -36007873;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Autosave settings for some type of chats were updated.
     */
    public static class UpdateAutosaveSettings extends Update {
        /**
         * Type of chats for which autosave settings were updated.
         */
        public AutosaveSettingsScope scope;
        /**
         * The new autosave settings; may be null if the settings are reset to default.
         */
        @Nullable public ScopeAutosaveSettings settings;

        /**
         * Autosave settings for some type of chats were updated.
         */
        public UpdateAutosaveSettings() {
        }

        /**
         * Autosave settings for some type of chats were updated.
         *
         * @param scope Type of chats for which autosave settings were updated.
         * @param settings The new autosave settings; may be null if the settings are reset to default.
         */
        public UpdateAutosaveSettings(AutosaveSettingsScope scope, ScopeAutosaveSettings settings) {
            this.scope = scope;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -634958069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A business connection has changed; for bots only.
     */
    public static class UpdateBusinessConnection extends Update {
        /**
         * New data about the connection.
         */
        public BusinessConnection connection;

        /**
         * A business connection has changed; for bots only.
         */
        public UpdateBusinessConnection() {
        }

        /**
         * A business connection has changed; for bots only.
         *
         * @param connection New data about the connection.
         */
        public UpdateBusinessConnection(BusinessConnection connection) {
            this.connection = connection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2043480970;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new message was added to a business account; for bots only.
     */
    public static class UpdateNewBusinessMessage extends Update {
        /**
         * Unique identifier of the business connection.
         */
        public String connectionId;
        /**
         * The new message.
         */
        public BusinessMessage message;

        /**
         * A new message was added to a business account; for bots only.
         */
        public UpdateNewBusinessMessage() {
        }

        /**
         * A new message was added to a business account; for bots only.
         *
         * @param connectionId Unique identifier of the business connection.
         * @param message The new message.
         */
        public UpdateNewBusinessMessage(String connectionId, BusinessMessage message) {
            this.connectionId = connectionId;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2034350524;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message in a business account was edited; for bots only.
     */
    public static class UpdateBusinessMessageEdited extends Update {
        /**
         * Unique identifier of the business connection.
         */
        public String connectionId;
        /**
         * The edited message.
         */
        public BusinessMessage message;

        /**
         * A message in a business account was edited; for bots only.
         */
        public UpdateBusinessMessageEdited() {
        }

        /**
         * A message in a business account was edited; for bots only.
         *
         * @param connectionId Unique identifier of the business connection.
         * @param message The edited message.
         */
        public UpdateBusinessMessageEdited(String connectionId, BusinessMessage message) {
            this.connectionId = connectionId;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2119799415;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Messages in a business account were deleted; for bots only.
     */
    public static class UpdateBusinessMessagesDeleted extends Update {
        /**
         * Unique identifier of the business connection.
         */
        public String connectionId;
        /**
         * Identifier of a chat in the business account in which messages were deleted.
         */
        public long chatId;
        /**
         * Unique message identifiers of the deleted messages.
         */
        public long[] messageIds;

        /**
         * Messages in a business account were deleted; for bots only.
         */
        public UpdateBusinessMessagesDeleted() {
        }

        /**
         * Messages in a business account were deleted; for bots only.
         *
         * @param connectionId Unique identifier of the business connection.
         * @param chatId Identifier of a chat in the business account in which messages were deleted.
         * @param messageIds Unique message identifiers of the deleted messages.
         */
        public UpdateBusinessMessagesDeleted(String connectionId, long chatId, long[] messageIds) {
            this.connectionId = connectionId;
            this.chatId = chatId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1106703050;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming inline query; for bots only.
     */
    public static class UpdateNewInlineQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * User location; may be null.
         */
        @Nullable public Location userLocation;
        /**
         * The type of the chat from which the query originated; may be null if unknown.
         */
        @Nullable public ChatType chatType;
        /**
         * Text of the query.
         */
        public String query;
        /**
         * Offset of the first entry to return.
         */
        public String offset;

        /**
         * A new incoming inline query; for bots only.
         */
        public UpdateNewInlineQuery() {
        }

        /**
         * A new incoming inline query; for bots only.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param userLocation User location; may be null.
         * @param chatType The type of the chat from which the query originated; may be null if unknown.
         * @param query Text of the query.
         * @param offset Offset of the first entry to return.
         */
        public UpdateNewInlineQuery(long id, long senderUserId, Location userLocation, ChatType chatType, String query, String offset) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.userLocation = userLocation;
            this.chatType = chatType;
            this.query = query;
            this.offset = offset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1903279924;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has chosen a result of an inline query; for bots only.
     */
    public static class UpdateNewChosenInlineResult extends Update {
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * User location; may be null.
         */
        @Nullable public Location userLocation;
        /**
         * Text of the query.
         */
        public String query;
        /**
         * Identifier of the chosen result.
         */
        public String resultId;
        /**
         * Identifier of the sent inline message, if known.
         */
        public String inlineMessageId;

        /**
         * The user has chosen a result of an inline query; for bots only.
         */
        public UpdateNewChosenInlineResult() {
        }

        /**
         * The user has chosen a result of an inline query; for bots only.
         *
         * @param senderUserId Identifier of the user who sent the query.
         * @param userLocation User location; may be null.
         * @param query Text of the query.
         * @param resultId Identifier of the chosen result.
         * @param inlineMessageId Identifier of the sent inline message, if known.
         */
        public UpdateNewChosenInlineResult(long senderUserId, Location userLocation, String query, String resultId, String inlineMessageId) {
            this.senderUserId = senderUserId;
            this.userLocation = userLocation;
            this.query = query;
            this.resultId = resultId;
            this.inlineMessageId = inlineMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -884191395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming callback query; for bots only.
     */
    public static class UpdateNewCallbackQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Identifier of the chat where the query was sent.
         */
        public long chatId;
        /**
         * Identifier of the message from which the query originated.
         */
        public long messageId;
        /**
         * Identifier that uniquely corresponds to the chat to which the message was sent.
         */
        public long chatInstance;
        /**
         * Query payload.
         */
        public CallbackQueryPayload payload;

        /**
         * A new incoming callback query; for bots only.
         */
        public UpdateNewCallbackQuery() {
        }

        /**
         * A new incoming callback query; for bots only.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param chatId Identifier of the chat where the query was sent.
         * @param messageId Identifier of the message from which the query originated.
         * @param chatInstance Identifier that uniquely corresponds to the chat to which the message was sent.
         * @param payload Query payload.
         */
        public UpdateNewCallbackQuery(long id, long senderUserId, long chatId, long messageId, long chatInstance, CallbackQueryPayload payload) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.chatInstance = chatInstance;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1989881762;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming callback query from a message sent via a bot; for bots only.
     */
    public static class UpdateNewInlineCallbackQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Identifier of the inline message from which the query originated.
         */
        public String inlineMessageId;
        /**
         * An identifier uniquely corresponding to the chat a message was sent to.
         */
        public long chatInstance;
        /**
         * Query payload.
         */
        public CallbackQueryPayload payload;

        /**
         * A new incoming callback query from a message sent via a bot; for bots only.
         */
        public UpdateNewInlineCallbackQuery() {
        }

        /**
         * A new incoming callback query from a message sent via a bot; for bots only.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param inlineMessageId Identifier of the inline message from which the query originated.
         * @param chatInstance An identifier uniquely corresponding to the chat a message was sent to.
         * @param payload Query payload.
         */
        public UpdateNewInlineCallbackQuery(long id, long senderUserId, String inlineMessageId, long chatInstance, CallbackQueryPayload payload) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.inlineMessageId = inlineMessageId;
            this.chatInstance = chatInstance;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -319212358;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming callback query from a business message; for bots only.
     */
    public static class UpdateNewBusinessCallbackQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Unique identifier of the business connection.
         */
        public String connectionId;
        /**
         * The message from the business account from which the query originated.
         */
        public BusinessMessage message;
        /**
         * An identifier uniquely corresponding to the chat a message was sent to.
         */
        public long chatInstance;
        /**
         * Query payload.
         */
        public CallbackQueryPayload payload;

        /**
         * A new incoming callback query from a business message; for bots only.
         */
        public UpdateNewBusinessCallbackQuery() {
        }

        /**
         * A new incoming callback query from a business message; for bots only.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param connectionId Unique identifier of the business connection.
         * @param message The message from the business account from which the query originated.
         * @param chatInstance An identifier uniquely corresponding to the chat a message was sent to.
         * @param payload Query payload.
         */
        public UpdateNewBusinessCallbackQuery(long id, long senderUserId, String connectionId, BusinessMessage message, long chatInstance, CallbackQueryPayload payload) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.connectionId = connectionId;
            this.message = message;
            this.chatInstance = chatInstance;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 336745316;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming shipping query; for bots only. Only for invoices with flexible price.
     */
    public static class UpdateNewShippingQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Invoice payload.
         */
        public String invoicePayload;
        /**
         * User shipping address.
         */
        public Address shippingAddress;

        /**
         * A new incoming shipping query; for bots only. Only for invoices with flexible price.
         */
        public UpdateNewShippingQuery() {
        }

        /**
         * A new incoming shipping query; for bots only. Only for invoices with flexible price.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param invoicePayload Invoice payload.
         * @param shippingAddress User shipping address.
         */
        public UpdateNewShippingQuery(long id, long senderUserId, String invoicePayload, Address shippingAddress) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.invoicePayload = invoicePayload;
            this.shippingAddress = shippingAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 693651058;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming pre-checkout query; for bots only. Contains full information about a checkout.
     */
    public static class UpdateNewPreCheckoutQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Currency for the product price.
         */
        public String currency;
        /**
         * Total price for the product, in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * Invoice payload.
         */
        public byte[] invoicePayload;
        /**
         * Identifier of a shipping option chosen by the user; may be empty if not applicable.
         */
        public String shippingOptionId;
        /**
         * Information about the order; may be null.
         */
        @Nullable public OrderInfo orderInfo;

        /**
         * A new incoming pre-checkout query; for bots only. Contains full information about a checkout.
         */
        public UpdateNewPreCheckoutQuery() {
        }

        /**
         * A new incoming pre-checkout query; for bots only. Contains full information about a checkout.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param currency Currency for the product price.
         * @param totalAmount Total price for the product, in the smallest units of the currency.
         * @param invoicePayload Invoice payload.
         * @param shippingOptionId Identifier of a shipping option chosen by the user; may be empty if not applicable.
         * @param orderInfo Information about the order; may be null.
         */
        public UpdateNewPreCheckoutQuery(long id, long senderUserId, String currency, long totalAmount, byte[] invoicePayload, String shippingOptionId, OrderInfo orderInfo) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.invoicePayload = invoicePayload;
            this.shippingOptionId = shippingOptionId;
            this.orderInfo = orderInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 708342217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming event; for bots only.
     */
    public static class UpdateNewCustomEvent extends Update {
        /**
         * A JSON-serialized event.
         */
        public String event;

        /**
         * A new incoming event; for bots only.
         */
        public UpdateNewCustomEvent() {
        }

        /**
         * A new incoming event; for bots only.
         *
         * @param event A JSON-serialized event.
         */
        public UpdateNewCustomEvent(String event) {
            this.event = event;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1994222092;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming query; for bots only.
     */
    public static class UpdateNewCustomQuery extends Update {
        /**
         * The query identifier.
         */
        public long id;
        /**
         * JSON-serialized query data.
         */
        public String data;
        /**
         * Query timeout.
         */
        public int timeout;

        /**
         * A new incoming query; for bots only.
         */
        public UpdateNewCustomQuery() {
        }

        /**
         * A new incoming query; for bots only.
         *
         * @param id The query identifier.
         * @param data JSON-serialized query data.
         * @param timeout Query timeout.
         */
        public UpdateNewCustomQuery(long id, String data, int timeout) {
            this.id = id;
            this.data = data;
            this.timeout = timeout;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -687670874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A poll was updated; for bots only.
     */
    public static class UpdatePoll extends Update {
        /**
         * New data about the poll.
         */
        public Poll poll;

        /**
         * A poll was updated; for bots only.
         */
        public UpdatePoll() {
        }

        /**
         * A poll was updated; for bots only.
         *
         * @param poll New data about the poll.
         */
        public UpdatePoll(Poll poll) {
            this.poll = poll;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1771342902;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user changed the answer to a poll; for bots only.
     */
    public static class UpdatePollAnswer extends Update {
        /**
         * Unique poll identifier.
         */
        public long pollId;
        /**
         * Identifier of the message sender that changed the answer to the poll.
         */
        public MessageSender voterId;
        /**
         * 0-based identifiers of answer options, chosen by the user.
         */
        public int[] optionIds;

        /**
         * A user changed the answer to a poll; for bots only.
         */
        public UpdatePollAnswer() {
        }

        /**
         * A user changed the answer to a poll; for bots only.
         *
         * @param pollId Unique poll identifier.
         * @param voterId Identifier of the message sender that changed the answer to the poll.
         * @param optionIds 0-based identifiers of answer options, chosen by the user.
         */
        public UpdatePollAnswer(long pollId, MessageSender voterId, int[] optionIds) {
            this.pollId = pollId;
            this.voterId = voterId;
            this.optionIds = optionIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1104905219;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * User rights changed in a chat; for bots only.
     */
    public static class UpdateChatMember extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user, changing the rights.
         */
        public long actorUserId;
        /**
         * Point in time (Unix timestamp) when the user rights were changed.
         */
        public int date;
        /**
         * If user has joined the chat using an invite link, the invite link; may be null.
         */
        @Nullable public ChatInviteLink inviteLink;
        /**
         * True, if the user has joined the chat after sending a join request and being approved by an administrator.
         */
        public boolean viaJoinRequest;
        /**
         * True, if the user has joined the chat using an invite link for a chat folder.
         */
        public boolean viaChatFolderInviteLink;
        /**
         * Previous chat member.
         */
        public ChatMember oldChatMember;
        /**
         * New chat member.
         */
        public ChatMember newChatMember;

        /**
         * User rights changed in a chat; for bots only.
         */
        public UpdateChatMember() {
        }

        /**
         * User rights changed in a chat; for bots only.
         *
         * @param chatId Chat identifier.
         * @param actorUserId Identifier of the user, changing the rights.
         * @param date Point in time (Unix timestamp) when the user rights were changed.
         * @param inviteLink If user has joined the chat using an invite link, the invite link; may be null.
         * @param viaJoinRequest True, if the user has joined the chat after sending a join request and being approved by an administrator.
         * @param viaChatFolderInviteLink True, if the user has joined the chat using an invite link for a chat folder.
         * @param oldChatMember Previous chat member.
         * @param newChatMember New chat member.
         */
        public UpdateChatMember(long chatId, long actorUserId, int date, ChatInviteLink inviteLink, boolean viaJoinRequest, boolean viaChatFolderInviteLink, ChatMember oldChatMember, ChatMember newChatMember) {
            this.chatId = chatId;
            this.actorUserId = actorUserId;
            this.date = date;
            this.inviteLink = inviteLink;
            this.viaJoinRequest = viaJoinRequest;
            this.viaChatFolderInviteLink = viaChatFolderInviteLink;
            this.oldChatMember = oldChatMember;
            this.newChatMember = newChatMember;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1736025145;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user sent a join request to a chat; for bots only.
     */
    public static class UpdateNewChatJoinRequest extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Join request.
         */
        public ChatJoinRequest request;
        /**
         * Chat identifier of the private chat with the user.
         */
        public long userChatId;
        /**
         * The invite link, which was used to send join request; may be null.
         */
        @Nullable public ChatInviteLink inviteLink;

        /**
         * A user sent a join request to a chat; for bots only.
         */
        public UpdateNewChatJoinRequest() {
        }

        /**
         * A user sent a join request to a chat; for bots only.
         *
         * @param chatId Chat identifier.
         * @param request Join request.
         * @param userChatId Chat identifier of the private chat with the user.
         * @param inviteLink The invite link, which was used to send join request; may be null.
         */
        public UpdateNewChatJoinRequest(long chatId, ChatJoinRequest request, long userChatId, ChatInviteLink inviteLink) {
            this.chatId = chatId;
            this.request = request;
            this.userChatId = userChatId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2118694979;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat boost has changed; for bots only.
     */
    public static class UpdateChatBoost extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New information about the boost.
         */
        public ChatBoost boost;

        /**
         * A chat boost has changed; for bots only.
         */
        public UpdateChatBoost() {
        }

        /**
         * A chat boost has changed; for bots only.
         *
         * @param chatId Chat identifier.
         * @param boost New information about the boost.
         */
        public UpdateChatBoost(long chatId, ChatBoost boost) {
            this.chatId = chatId;
            this.boost = boost;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1349680676;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * User changed its reactions on a message with public reactions; for bots only.
     */
    public static class UpdateMessageReaction extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Identifier of the user or chat that changed reactions.
         */
        public MessageSender actorId;
        /**
         * Point in time (Unix timestamp) when the reactions were changed.
         */
        public int date;
        /**
         * Old list of chosen reactions.
         */
        public ReactionType[] oldReactionTypes;
        /**
         * New list of chosen reactions.
         */
        public ReactionType[] newReactionTypes;

        /**
         * User changed its reactions on a message with public reactions; for bots only.
         */
        public UpdateMessageReaction() {
        }

        /**
         * User changed its reactions on a message with public reactions; for bots only.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param actorId Identifier of the user or chat that changed reactions.
         * @param date Point in time (Unix timestamp) when the reactions were changed.
         * @param oldReactionTypes Old list of chosen reactions.
         * @param newReactionTypes New list of chosen reactions.
         */
        public UpdateMessageReaction(long chatId, long messageId, MessageSender actorId, int date, ReactionType[] oldReactionTypes, ReactionType[] newReactionTypes) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.actorId = actorId;
            this.date = date;
            this.oldReactionTypes = oldReactionTypes;
            this.newReactionTypes = newReactionTypes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1084895706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reactions added to a message with anonymous reactions have changed; for bots only.
     */
    public static class UpdateMessageReactions extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Point in time (Unix timestamp) when the reactions were changed.
         */
        public int date;
        /**
         * The list of reactions added to the message.
         */
        public MessageReaction[] reactions;

        /**
         * Reactions added to a message with anonymous reactions have changed; for bots only.
         */
        public UpdateMessageReactions() {
        }

        /**
         * Reactions added to a message with anonymous reactions have changed; for bots only.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param date Point in time (Unix timestamp) when the reactions were changed.
         * @param reactions The list of reactions added to the message.
         */
        public UpdateMessageReactions(long chatId, long messageId, int date, MessageReaction[] reactions) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.date = date;
            this.reactions = reactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 955237189;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of updates.
     */
    public static class Updates extends Object {
        /**
         * List of updates.
         */
        public Update[] updates;

        /**
         * Contains a list of updates.
         */
        public Updates() {
        }

        /**
         * Contains a list of updates.
         *
         * @param updates List of updates.
         */
        public Updates(Update[] updates) {
            this.updates = updates;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 475842347;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a user.
     */
    public static class User extends Object {
        /**
         * User identifier.
         */
        public long id;
        /**
         * First name of the user.
         */
        public String firstName;
        /**
         * Last name of the user.
         */
        public String lastName;
        /**
         * Usernames of the user; may be null.
         */
        @Nullable public Usernames usernames;
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * Current online status of the user.
         */
        public UserStatus status;
        /**
         * Profile photo of the user; may be null.
         */
        @Nullable public ProfilePhoto profilePhoto;
        /**
         * Identifier of the accent color for name, and backgrounds of profile photo, reply header, and link preview. For Telegram Premium users only.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none. For Telegram Premium users only.
         */
        public long backgroundCustomEmojiId;
        /**
         * Identifier of the accent color for the user's profile; -1 if none. For Telegram Premium users only.
         */
        public int profileAccentColorId;
        /**
         * Identifier of a custom emoji to be shown on the background of the user's profile; 0 if none. For Telegram Premium users only.
         */
        public long profileBackgroundCustomEmojiId;
        /**
         * Emoji status to be shown instead of the default Telegram Premium badge; may be null. For Telegram Premium users only.
         */
        @Nullable public EmojiStatus emojiStatus;
        /**
         * The user is a contact of the current user.
         */
        public boolean isContact;
        /**
         * The user is a contact of the current user and the current user is a contact of the user.
         */
        public boolean isMutualContact;
        /**
         * The user is a close friend of the current user; implies that the user is a contact.
         */
        public boolean isCloseFriend;
        /**
         * True, if the user is verified.
         */
        public boolean isVerified;
        /**
         * True, if the user is a Telegram Premium user.
         */
        public boolean isPremium;
        /**
         * True, if the user is Telegram support account.
         */
        public boolean isSupport;
        /**
         * If non-empty, it contains a human-readable description of the reason why access to this user must be restricted.
         */
        public String restrictionReason;
        /**
         * True, if many users reported this user as a scam.
         */
        public boolean isScam;
        /**
         * True, if many users reported this user as a fake account.
         */
        public boolean isFake;
        /**
         * True, if the user has non-expired stories available to the current user.
         */
        public boolean hasActiveStories;
        /**
         * True, if the user has unread non-expired stories available to the current user.
         */
        public boolean hasUnreadActiveStories;
        /**
         * True, if the user may restrict new chats with non-contacts. Use canSendMessageToUser to check whether the current user can message the user or try to create a chat with them.
         */
        public boolean restrictsNewChats;
        /**
         * If false, the user is inaccessible, and the only information known about the user is inside this class. Identifier of the user can't be passed to any method.
         */
        public boolean haveAccess;
        /**
         * Type of the user.
         */
        public UserType type;
        /**
         * IETF language tag of the user's language; only available to bots.
         */
        public String languageCode;
        /**
         * True, if the user added the current bot to attachment menu; only available to bots.
         */
        public boolean addedToAttachmentMenu;

        /**
         * Represents a user.
         */
        public User() {
        }

        /**
         * Represents a user.
         *
         * @param id User identifier.
         * @param firstName First name of the user.
         * @param lastName Last name of the user.
         * @param usernames Usernames of the user; may be null.
         * @param phoneNumber Phone number of the user.
         * @param status Current online status of the user.
         * @param profilePhoto Profile photo of the user; may be null.
         * @param accentColorId Identifier of the accent color for name, and backgrounds of profile photo, reply header, and link preview. For Telegram Premium users only.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none. For Telegram Premium users only.
         * @param profileAccentColorId Identifier of the accent color for the user's profile; -1 if none. For Telegram Premium users only.
         * @param profileBackgroundCustomEmojiId Identifier of a custom emoji to be shown on the background of the user's profile; 0 if none. For Telegram Premium users only.
         * @param emojiStatus Emoji status to be shown instead of the default Telegram Premium badge; may be null. For Telegram Premium users only.
         * @param isContact The user is a contact of the current user.
         * @param isMutualContact The user is a contact of the current user and the current user is a contact of the user.
         * @param isCloseFriend The user is a close friend of the current user; implies that the user is a contact.
         * @param isVerified True, if the user is verified.
         * @param isPremium True, if the user is a Telegram Premium user.
         * @param isSupport True, if the user is Telegram support account.
         * @param restrictionReason If non-empty, it contains a human-readable description of the reason why access to this user must be restricted.
         * @param isScam True, if many users reported this user as a scam.
         * @param isFake True, if many users reported this user as a fake account.
         * @param hasActiveStories True, if the user has non-expired stories available to the current user.
         * @param hasUnreadActiveStories True, if the user has unread non-expired stories available to the current user.
         * @param restrictsNewChats True, if the user may restrict new chats with non-contacts. Use canSendMessageToUser to check whether the current user can message the user or try to create a chat with them.
         * @param haveAccess If false, the user is inaccessible, and the only information known about the user is inside this class. Identifier of the user can't be passed to any method.
         * @param type Type of the user.
         * @param languageCode IETF language tag of the user's language; only available to bots.
         * @param addedToAttachmentMenu True, if the user added the current bot to attachment menu; only available to bots.
         */
        public User(long id, String firstName, String lastName, Usernames usernames, String phoneNumber, UserStatus status, ProfilePhoto profilePhoto, int accentColorId, long backgroundCustomEmojiId, int profileAccentColorId, long profileBackgroundCustomEmojiId, EmojiStatus emojiStatus, boolean isContact, boolean isMutualContact, boolean isCloseFriend, boolean isVerified, boolean isPremium, boolean isSupport, String restrictionReason, boolean isScam, boolean isFake, boolean hasActiveStories, boolean hasUnreadActiveStories, boolean restrictsNewChats, boolean haveAccess, UserType type, String languageCode, boolean addedToAttachmentMenu) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
            this.usernames = usernames;
            this.phoneNumber = phoneNumber;
            this.status = status;
            this.profilePhoto = profilePhoto;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
            this.emojiStatus = emojiStatus;
            this.isContact = isContact;
            this.isMutualContact = isMutualContact;
            this.isCloseFriend = isCloseFriend;
            this.isVerified = isVerified;
            this.isPremium = isPremium;
            this.isSupport = isSupport;
            this.restrictionReason = restrictionReason;
            this.isScam = isScam;
            this.isFake = isFake;
            this.hasActiveStories = hasActiveStories;
            this.hasUnreadActiveStories = hasUnreadActiveStories;
            this.restrictsNewChats = restrictsNewChats;
            this.haveAccess = haveAccess;
            this.type = type;
            this.languageCode = languageCode;
            this.addedToAttachmentMenu = addedToAttachmentMenu;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 408235106;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains full information about a user.
     */
    public static class UserFullInfo extends Object {
        /**
         * User profile photo set by the current user for the contact; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null, then it is the same photo as in user.profilePhoto and chat.photo. This photo isn't returned in the list of user photos.
         */
        @Nullable public ChatPhoto personalPhoto;
        /**
         * User profile photo; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null and personalPhoto is null, then it is the same photo as in user.profilePhoto and chat.photo.
         */
        @Nullable public ChatPhoto photo;
        /**
         * User profile photo visible if the main photo is hidden by privacy settings; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null and both photo and personalPhoto are null, then it is the same photo as in user.profilePhoto and chat.photo. This photo isn't returned in the list of user photos.
         */
        @Nullable public ChatPhoto publicPhoto;
        /**
         * Block list to which the user is added; may be null if none.
         */
        @Nullable public BlockList blockList;
        /**
         * True, if the user can be called.
         */
        public boolean canBeCalled;
        /**
         * True, if a video call can be created with the user.
         */
        public boolean supportsVideoCalls;
        /**
         * True, if the user can't be called due to their privacy settings.
         */
        public boolean hasPrivateCalls;
        /**
         * True, if the user can't be linked in forwarded messages due to their privacy settings.
         */
        public boolean hasPrivateForwards;
        /**
         * True, if voice and video notes can't be sent or forwarded to the user.
         */
        public boolean hasRestrictedVoiceAndVideoNoteMessages;
        /**
         * True, if the user has posted to profile stories.
         */
        public boolean hasPostedToProfileStories;
        /**
         * True, if the user always enabled sponsored messages; known only for the current user.
         */
        public boolean hasSponsoredMessagesEnabled;
        /**
         * True, if the current user needs to explicitly allow to share their phone number with the user when the method addContact is used.
         */
        public boolean needPhoneNumberPrivacyException;
        /**
         * True, if the user set chat background for both chat users and it wasn't reverted yet.
         */
        public boolean setChatBackground;
        /**
         * A short user bio; may be null for bots.
         */
        @Nullable public FormattedText bio;
        /**
         * Birthdate of the user; may be null if unknown.
         */
        @Nullable public Birthdate birthdate;
        /**
         * Identifier of the personal chat of the user; 0 if none.
         */
        public long personalChatId;
        /**
         * The list of available options for gifting Telegram Premium to the user.
         */
        public PremiumPaymentOption[] premiumGiftOptions;
        /**
         * Number of group chats where both the other user and the current user are a member; 0 for the current user.
         */
        public int groupInCommonCount;
        /**
         * Information about business settings for Telegram Business accounts; may be null if none.
         */
        @Nullable public BusinessInfo businessInfo;
        /**
         * For bots, information about the bot; may be null if the user isn't a bot.
         */
        @Nullable public BotInfo botInfo;

        /**
         * Contains full information about a user.
         */
        public UserFullInfo() {
        }

        /**
         * Contains full information about a user.
         *
         * @param personalPhoto User profile photo set by the current user for the contact; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null, then it is the same photo as in user.profilePhoto and chat.photo. This photo isn't returned in the list of user photos.
         * @param photo User profile photo; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null and personalPhoto is null, then it is the same photo as in user.profilePhoto and chat.photo.
         * @param publicPhoto User profile photo visible if the main photo is hidden by privacy settings; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null and both photo and personalPhoto are null, then it is the same photo as in user.profilePhoto and chat.photo. This photo isn't returned in the list of user photos.
         * @param blockList Block list to which the user is added; may be null if none.
         * @param canBeCalled True, if the user can be called.
         * @param supportsVideoCalls True, if a video call can be created with the user.
         * @param hasPrivateCalls True, if the user can't be called due to their privacy settings.
         * @param hasPrivateForwards True, if the user can't be linked in forwarded messages due to their privacy settings.
         * @param hasRestrictedVoiceAndVideoNoteMessages True, if voice and video notes can't be sent or forwarded to the user.
         * @param hasPostedToProfileStories True, if the user has posted to profile stories.
         * @param hasSponsoredMessagesEnabled True, if the user always enabled sponsored messages; known only for the current user.
         * @param needPhoneNumberPrivacyException True, if the current user needs to explicitly allow to share their phone number with the user when the method addContact is used.
         * @param setChatBackground True, if the user set chat background for both chat users and it wasn't reverted yet.
         * @param bio A short user bio; may be null for bots.
         * @param birthdate Birthdate of the user; may be null if unknown.
         * @param personalChatId Identifier of the personal chat of the user; 0 if none.
         * @param premiumGiftOptions The list of available options for gifting Telegram Premium to the user.
         * @param groupInCommonCount Number of group chats where both the other user and the current user are a member; 0 for the current user.
         * @param businessInfo Information about business settings for Telegram Business accounts; may be null if none.
         * @param botInfo For bots, information about the bot; may be null if the user isn't a bot.
         */
        public UserFullInfo(ChatPhoto personalPhoto, ChatPhoto photo, ChatPhoto publicPhoto, BlockList blockList, boolean canBeCalled, boolean supportsVideoCalls, boolean hasPrivateCalls, boolean hasPrivateForwards, boolean hasRestrictedVoiceAndVideoNoteMessages, boolean hasPostedToProfileStories, boolean hasSponsoredMessagesEnabled, boolean needPhoneNumberPrivacyException, boolean setChatBackground, FormattedText bio, Birthdate birthdate, long personalChatId, PremiumPaymentOption[] premiumGiftOptions, int groupInCommonCount, BusinessInfo businessInfo, BotInfo botInfo) {
            this.personalPhoto = personalPhoto;
            this.photo = photo;
            this.publicPhoto = publicPhoto;
            this.blockList = blockList;
            this.canBeCalled = canBeCalled;
            this.supportsVideoCalls = supportsVideoCalls;
            this.hasPrivateCalls = hasPrivateCalls;
            this.hasPrivateForwards = hasPrivateForwards;
            this.hasRestrictedVoiceAndVideoNoteMessages = hasRestrictedVoiceAndVideoNoteMessages;
            this.hasPostedToProfileStories = hasPostedToProfileStories;
            this.hasSponsoredMessagesEnabled = hasSponsoredMessagesEnabled;
            this.needPhoneNumberPrivacyException = needPhoneNumberPrivacyException;
            this.setChatBackground = setChatBackground;
            this.bio = bio;
            this.birthdate = birthdate;
            this.personalChatId = personalChatId;
            this.premiumGiftOptions = premiumGiftOptions;
            this.groupInCommonCount = groupInCommonCount;
            this.businessInfo = businessInfo;
            this.botInfo = botInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 133343378;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an HTTPS URL, which can be used to get information about a user.
     */
    public static class UserLink extends Object {
        /**
         * The URL.
         */
        public String url;
        /**
         * Left time for which the link is valid, in seconds; 0 if the link is a public username link.
         */
        public int expiresIn;

        /**
         * Contains an HTTPS URL, which can be used to get information about a user.
         */
        public UserLink() {
        }

        /**
         * Contains an HTTPS URL, which can be used to get information about a user.
         *
         * @param url The URL.
         * @param expiresIn Left time for which the link is valid, in seconds; 0 if the link is a public username link.
         */
        public UserLink(String url, int expiresIn) {
            this.url = url;
            this.expiresIn = expiresIn;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 498138872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes available user privacy settings.
     */
    public abstract static class UserPrivacySetting extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UserPrivacySettingShowStatus.CONSTRUCTOR,
            UserPrivacySettingShowProfilePhoto.CONSTRUCTOR,
            UserPrivacySettingShowLinkInForwardedMessages.CONSTRUCTOR,
            UserPrivacySettingShowPhoneNumber.CONSTRUCTOR,
            UserPrivacySettingShowBio.CONSTRUCTOR,
            UserPrivacySettingShowBirthdate.CONSTRUCTOR,
            UserPrivacySettingAllowChatInvites.CONSTRUCTOR,
            UserPrivacySettingAllowCalls.CONSTRUCTOR,
            UserPrivacySettingAllowPeerToPeerCalls.CONSTRUCTOR,
            UserPrivacySettingAllowFindingByPhoneNumber.CONSTRUCTOR,
            UserPrivacySettingAllowPrivateVoiceAndVideoNoteMessages.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UserPrivacySetting() {
        }
    }

    /**
     * A privacy setting for managing whether the user's online status is visible.
     */
    public static class UserPrivacySettingShowStatus extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's online status is visible.
         */
        public UserPrivacySettingShowStatus() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1862829310;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's profile photo is visible.
     */
    public static class UserPrivacySettingShowProfilePhoto extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's profile photo is visible.
         */
        public UserPrivacySettingShowProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1408485877;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether a link to the user's account is included in forwarded messages.
     */
    public static class UserPrivacySettingShowLinkInForwardedMessages extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether a link to the user's account is included in forwarded messages.
         */
        public UserPrivacySettingShowLinkInForwardedMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 592688870;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's phone number is visible.
     */
    public static class UserPrivacySettingShowPhoneNumber extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's phone number is visible.
         */
        public UserPrivacySettingShowPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -791567831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's bio is visible.
     */
    public static class UserPrivacySettingShowBio extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's bio is visible.
         */
        public UserPrivacySettingShowBio() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 959981409;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's birthdate is visible.
     */
    public static class UserPrivacySettingShowBirthdate extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's birthdate is visible.
         */
        public UserPrivacySettingShowBirthdate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1167504607;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can be invited to chats.
     */
    public static class UserPrivacySettingAllowChatInvites extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can be invited to chats.
         */
        public UserPrivacySettingAllowChatInvites() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1271668007;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can be called.
     */
    public static class UserPrivacySettingAllowCalls extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can be called.
         */
        public UserPrivacySettingAllowCalls() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -906967291;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether peer-to-peer connections can be used for calls.
     */
    public static class UserPrivacySettingAllowPeerToPeerCalls extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether peer-to-peer connections can be used for calls.
         */
        public UserPrivacySettingAllowPeerToPeerCalls() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 352500032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can be found by their phone number. Checked only if the phone number is not known to the other user. Can be set only to &quot;Allow contacts&quot; or &quot;Allow all&quot;.
     */
    public static class UserPrivacySettingAllowFindingByPhoneNumber extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can be found by their phone number. Checked only if the phone number is not known to the other user. Can be set only to &quot;Allow contacts&quot; or &quot;Allow all&quot;.
         */
        public UserPrivacySettingAllowFindingByPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1846645423;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can receive voice and video messages in private chats; for Telegram Premium users only.
     */
    public static class UserPrivacySettingAllowPrivateVoiceAndVideoNoteMessages extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can receive voice and video messages in private chats; for Telegram Premium users only.
         */
        public UserPrivacySettingAllowPrivateVoiceAndVideoNoteMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 338112060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a single rule for managing user privacy settings.
     */
    public abstract static class UserPrivacySettingRule extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UserPrivacySettingRuleAllowAll.CONSTRUCTOR,
            UserPrivacySettingRuleAllowContacts.CONSTRUCTOR,
            UserPrivacySettingRuleAllowPremiumUsers.CONSTRUCTOR,
            UserPrivacySettingRuleAllowUsers.CONSTRUCTOR,
            UserPrivacySettingRuleAllowChatMembers.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictAll.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictContacts.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictUsers.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictChatMembers.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UserPrivacySettingRule() {
        }
    }

    /**
     * A rule to allow all users to do something.
     */
    public static class UserPrivacySettingRuleAllowAll extends UserPrivacySettingRule {

        /**
         * A rule to allow all users to do something.
         */
        public UserPrivacySettingRuleAllowAll() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1967186881;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow all contacts of the user to do something.
     */
    public static class UserPrivacySettingRuleAllowContacts extends UserPrivacySettingRule {

        /**
         * A rule to allow all contacts of the user to do something.
         */
        public UserPrivacySettingRuleAllowContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1892733680;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow all Premium Users to do something; currently, allowed only for userPrivacySettingAllowChatInvites.
     */
    public static class UserPrivacySettingRuleAllowPremiumUsers extends UserPrivacySettingRule {

        /**
         * A rule to allow all Premium Users to do something; currently, allowed only for userPrivacySettingAllowChatInvites.
         */
        public UserPrivacySettingRuleAllowPremiumUsers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1624147265;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow certain specified users to do something.
     */
    public static class UserPrivacySettingRuleAllowUsers extends UserPrivacySettingRule {
        /**
         * The user identifiers, total number of users in all rules must not exceed 1000.
         */
        public long[] userIds;

        /**
         * A rule to allow certain specified users to do something.
         */
        public UserPrivacySettingRuleAllowUsers() {
        }

        /**
         * A rule to allow certain specified users to do something.
         *
         * @param userIds The user identifiers, total number of users in all rules must not exceed 1000.
         */
        public UserPrivacySettingRuleAllowUsers(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1110988334;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow all members of certain specified basic groups and supergroups to doing something.
     */
    public static class UserPrivacySettingRuleAllowChatMembers extends UserPrivacySettingRule {
        /**
         * The chat identifiers, total number of chats in all rules must not exceed 20.
         */
        public long[] chatIds;

        /**
         * A rule to allow all members of certain specified basic groups and supergroups to doing something.
         */
        public UserPrivacySettingRuleAllowChatMembers() {
        }

        /**
         * A rule to allow all members of certain specified basic groups and supergroups to doing something.
         *
         * @param chatIds The chat identifiers, total number of chats in all rules must not exceed 20.
         */
        public UserPrivacySettingRuleAllowChatMembers(long[] chatIds) {
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2048749863;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all users from doing something.
     */
    public static class UserPrivacySettingRuleRestrictAll extends UserPrivacySettingRule {

        /**
         * A rule to restrict all users from doing something.
         */
        public UserPrivacySettingRuleRestrictAll() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1406495408;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all contacts of the user from doing something.
     */
    public static class UserPrivacySettingRuleRestrictContacts extends UserPrivacySettingRule {

        /**
         * A rule to restrict all contacts of the user from doing something.
         */
        public UserPrivacySettingRuleRestrictContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1008389378;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all specified users from doing something.
     */
    public static class UserPrivacySettingRuleRestrictUsers extends UserPrivacySettingRule {
        /**
         * The user identifiers, total number of users in all rules must not exceed 1000.
         */
        public long[] userIds;

        /**
         * A rule to restrict all specified users from doing something.
         */
        public UserPrivacySettingRuleRestrictUsers() {
        }

        /**
         * A rule to restrict all specified users from doing something.
         *
         * @param userIds The user identifiers, total number of users in all rules must not exceed 1000.
         */
        public UserPrivacySettingRuleRestrictUsers(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 622796522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all members of specified basic groups and supergroups from doing something.
     */
    public static class UserPrivacySettingRuleRestrictChatMembers extends UserPrivacySettingRule {
        /**
         * The chat identifiers, total number of chats in all rules must not exceed 20.
         */
        public long[] chatIds;

        /**
         * A rule to restrict all members of specified basic groups and supergroups from doing something.
         */
        public UserPrivacySettingRuleRestrictChatMembers() {
        }

        /**
         * A rule to restrict all members of specified basic groups and supergroups from doing something.
         *
         * @param chatIds The chat identifiers, total number of chats in all rules must not exceed 20.
         */
        public UserPrivacySettingRuleRestrictChatMembers(long[] chatIds) {
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 392530897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed.
     */
    public static class UserPrivacySettingRules extends Object {
        /**
         * A list of rules.
         */
        public UserPrivacySettingRule[] rules;

        /**
         * A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed.
         */
        public UserPrivacySettingRules() {
        }

        /**
         * A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed.
         *
         * @param rules A list of rules.
         */
        public UserPrivacySettingRules(UserPrivacySettingRule[] rules) {
            this.rules = rules;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 322477541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the last time the user was online.
     */
    public abstract static class UserStatus extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UserStatusEmpty.CONSTRUCTOR,
            UserStatusOnline.CONSTRUCTOR,
            UserStatusOffline.CONSTRUCTOR,
            UserStatusRecently.CONSTRUCTOR,
            UserStatusLastWeek.CONSTRUCTOR,
            UserStatusLastMonth.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UserStatus() {
        }
    }

    /**
     * The user's status has never been changed.
     */
    public static class UserStatusEmpty extends UserStatus {

        /**
         * The user's status has never been changed.
         */
        public UserStatusEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164646985;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is online.
     */
    public static class UserStatusOnline extends UserStatus {
        /**
         * Point in time (Unix timestamp) when the user's online status will expire.
         */
        public int expires;

        /**
         * The user is online.
         */
        public UserStatusOnline() {
        }

        /**
         * The user is online.
         *
         * @param expires Point in time (Unix timestamp) when the user's online status will expire.
         */
        public UserStatusOnline(int expires) {
            this.expires = expires;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1529460876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is offline.
     */
    public static class UserStatusOffline extends UserStatus {
        /**
         * Point in time (Unix timestamp) when the user was last online.
         */
        public int wasOnline;

        /**
         * The user is offline.
         */
        public UserStatusOffline() {
        }

        /**
         * The user is offline.
         *
         * @param wasOnline Point in time (Unix timestamp) when the user was last online.
         */
        public UserStatusOffline(int wasOnline) {
            this.wasOnline = wasOnline;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -759984891;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user was online recently.
     */
    public static class UserStatusRecently extends UserStatus {
        /**
         * Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public boolean byMyPrivacySettings;

        /**
         * The user was online recently.
         */
        public UserStatusRecently() {
        }

        /**
         * The user was online recently.
         *
         * @param byMyPrivacySettings Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public UserStatusRecently(boolean byMyPrivacySettings) {
            this.byMyPrivacySettings = byMyPrivacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 262824117;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is offline, but was online last week.
     */
    public static class UserStatusLastWeek extends UserStatus {
        /**
         * Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public boolean byMyPrivacySettings;

        /**
         * The user is offline, but was online last week.
         */
        public UserStatusLastWeek() {
        }

        /**
         * The user is offline, but was online last week.
         *
         * @param byMyPrivacySettings Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public UserStatusLastWeek(boolean byMyPrivacySettings) {
            this.byMyPrivacySettings = byMyPrivacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 310385495;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is offline, but was online last month.
     */
    public static class UserStatusLastMonth extends UserStatus {
        /**
         * Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public boolean byMyPrivacySettings;

        /**
         * The user is offline, but was online last month.
         */
        public UserStatusLastMonth() {
        }

        /**
         * The user is offline, but was online last month.
         *
         * @param byMyPrivacySettings Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public UserStatusLastMonth(boolean byMyPrivacySettings) {
            this.byMyPrivacySettings = byMyPrivacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1194644996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains custom information about the user.
     */
    public static class UserSupportInfo extends Object {
        /**
         * Information message.
         */
        public FormattedText message;
        /**
         * Information author.
         */
        public String author;
        /**
         * Information change date.
         */
        public int date;

        /**
         * Contains custom information about the user.
         */
        public UserSupportInfo() {
        }

        /**
         * Contains custom information about the user.
         *
         * @param message Information message.
         * @param author Information author.
         * @param date Information change date.
         */
        public UserSupportInfo(FormattedText message, String author, int date) {
            this.message = message;
            this.author = author;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1257366487;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the type of user. The following types are possible: regular users, deleted users and bots.
     */
    public abstract static class UserType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UserTypeRegular.CONSTRUCTOR,
            UserTypeDeleted.CONSTRUCTOR,
            UserTypeBot.CONSTRUCTOR,
            UserTypeUnknown.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UserType() {
        }
    }

    /**
     * A regular user.
     */
    public static class UserTypeRegular extends UserType {

        /**
         * A regular user.
         */
        public UserTypeRegular() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -598644325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A deleted user or deleted bot. No information on the user besides the user identifier is available. It is not possible to perform any active actions on this type of user.
     */
    public static class UserTypeDeleted extends UserType {

        /**
         * A deleted user or deleted bot. No information on the user besides the user identifier is available. It is not possible to perform any active actions on this type of user.
         */
        public UserTypeDeleted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1807729372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bot (see https://core.telegram.org/bots).
     */
    public static class UserTypeBot extends UserType {
        /**
         * True, if the bot is owned by the current user and can be edited using the methods toggleBotUsernameIsActive, reorderBotActiveUsernames, setBotProfilePhoto, setBotName, setBotInfoDescription, and setBotInfoShortDescription.
         */
        public boolean canBeEdited;
        /**
         * True, if the bot can be invited to basic group and supergroup chats.
         */
        public boolean canJoinGroups;
        /**
         * True, if the bot can read all messages in basic group or supergroup chats and not just those addressed to the bot. In private and channel chats a bot can always read all messages.
         */
        public boolean canReadAllGroupMessages;
        /**
         * True, if the bot supports inline queries.
         */
        public boolean isInline;
        /**
         * Placeholder for inline queries (displayed on the application input field).
         */
        public String inlineQueryPlaceholder;
        /**
         * True, if the location of the user is expected to be sent with every inline query to this bot.
         */
        public boolean needLocation;
        /**
         * True, if the bot supports connection to Telegram Business accounts.
         */
        public boolean canConnectToBusiness;
        /**
         * True, if the bot can be added to attachment or side menu.
         */
        public boolean canBeAddedToAttachmentMenu;

        /**
         * A bot (see https://core.telegram.org/bots).
         */
        public UserTypeBot() {
        }

        /**
         * A bot (see https://core.telegram.org/bots).
         *
         * @param canBeEdited True, if the bot is owned by the current user and can be edited using the methods toggleBotUsernameIsActive, reorderBotActiveUsernames, setBotProfilePhoto, setBotName, setBotInfoDescription, and setBotInfoShortDescription.
         * @param canJoinGroups True, if the bot can be invited to basic group and supergroup chats.
         * @param canReadAllGroupMessages True, if the bot can read all messages in basic group or supergroup chats and not just those addressed to the bot. In private and channel chats a bot can always read all messages.
         * @param isInline True, if the bot supports inline queries.
         * @param inlineQueryPlaceholder Placeholder for inline queries (displayed on the application input field).
         * @param needLocation True, if the location of the user is expected to be sent with every inline query to this bot.
         * @param canConnectToBusiness True, if the bot supports connection to Telegram Business accounts.
         * @param canBeAddedToAttachmentMenu True, if the bot can be added to attachment or side menu.
         */
        public UserTypeBot(boolean canBeEdited, boolean canJoinGroups, boolean canReadAllGroupMessages, boolean isInline, String inlineQueryPlaceholder, boolean needLocation, boolean canConnectToBusiness, boolean canBeAddedToAttachmentMenu) {
            this.canBeEdited = canBeEdited;
            this.canJoinGroups = canJoinGroups;
            this.canReadAllGroupMessages = canReadAllGroupMessages;
            this.isInline = isInline;
            this.inlineQueryPlaceholder = inlineQueryPlaceholder;
            this.needLocation = needLocation;
            this.canConnectToBusiness = canConnectToBusiness;
            this.canBeAddedToAttachmentMenu = canBeAddedToAttachmentMenu;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1372542918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * No information on the user besides the user identifier is available, yet this user has not been deleted. This object is extremely rare and must be handled like a deleted user. It is not possible to perform any actions on users of this type.
     */
    public static class UserTypeUnknown extends UserType {

        /**
         * No information on the user besides the user identifier is available, yet this user has not been deleted. This object is extremely rare and must be handled like a deleted user. It is not possible to perform any actions on users of this type.
         */
        public UserTypeUnknown() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -724541123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes usernames assigned to a user, a supergroup, or a channel.
     */
    public static class Usernames extends Object {
        /**
         * List of active usernames; the first one must be shown as the primary username. The order of active usernames can be changed with reorderActiveUsernames, reorderBotActiveUsernames or reorderSupergroupActiveUsernames.
         */
        public String[] activeUsernames;
        /**
         * List of currently disabled usernames; the username can be activated with toggleUsernameIsActive, toggleBotUsernameIsActive, or toggleSupergroupUsernameIsActive.
         */
        public String[] disabledUsernames;
        /**
         * The active username, which can be changed with setUsername or setSupergroupUsername. Information about other active usernames can be received using getCollectibleItemInfo.
         */
        public String editableUsername;

        /**
         * Describes usernames assigned to a user, a supergroup, or a channel.
         */
        public Usernames() {
        }

        /**
         * Describes usernames assigned to a user, a supergroup, or a channel.
         *
         * @param activeUsernames List of active usernames; the first one must be shown as the primary username. The order of active usernames can be changed with reorderActiveUsernames, reorderBotActiveUsernames or reorderSupergroupActiveUsernames.
         * @param disabledUsernames List of currently disabled usernames; the username can be activated with toggleUsernameIsActive, toggleBotUsernameIsActive, or toggleSupergroupUsernameIsActive.
         * @param editableUsername The active username, which can be changed with setUsername or setSupergroupUsername. Information about other active usernames can be received using getCollectibleItemInfo.
         */
        public Usernames(String[] activeUsernames, String[] disabledUsernames, String editableUsername) {
            this.activeUsernames = activeUsernames;
            this.disabledUsernames = disabledUsernames;
            this.editableUsername = editableUsername;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 799608565;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of users.
     */
    public static class Users extends Object {
        /**
         * Approximate total number of users found.
         */
        public int totalCount;
        /**
         * A list of user identifiers.
         */
        public long[] userIds;

        /**
         * Represents a list of users.
         */
        public Users() {
        }

        /**
         * Represents a list of users.
         *
         * @param totalCount Approximate total number of users found.
         * @param userIds A list of user identifiers.
         */
        public Users(int totalCount, long[] userIds) {
            this.totalCount = totalCount;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 171203420;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a temporary identifier of validated order information, which is stored for one hour, and the available shipping options.
     */
    public static class ValidatedOrderInfo extends Object {
        /**
         * Temporary identifier of the order information.
         */
        public String orderInfoId;
        /**
         * Available shipping options.
         */
        public ShippingOption[] shippingOptions;

        /**
         * Contains a temporary identifier of validated order information, which is stored for one hour, and the available shipping options.
         */
        public ValidatedOrderInfo() {
        }

        /**
         * Contains a temporary identifier of validated order information, which is stored for one hour, and the available shipping options.
         *
         * @param orderInfoId Temporary identifier of the order information.
         * @param shippingOptions Available shipping options.
         */
        public ValidatedOrderInfo(String orderInfoId, ShippingOption[] shippingOptions) {
            this.orderInfoId = orderInfoId;
            this.shippingOptions = shippingOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1511451484;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a vector path command.
     */
    public abstract static class VectorPathCommand extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            VectorPathCommandLine.CONSTRUCTOR,
            VectorPathCommandCubicBezierCurve.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public VectorPathCommand() {
        }
    }

    /**
     * A straight line to a given point.
     */
    public static class VectorPathCommandLine extends VectorPathCommand {
        /**
         * The end point of the straight line.
         */
        public Point endPoint;

        /**
         * A straight line to a given point.
         */
        public VectorPathCommandLine() {
        }

        /**
         * A straight line to a given point.
         *
         * @param endPoint The end point of the straight line.
         */
        public VectorPathCommandLine(Point endPoint) {
            this.endPoint = endPoint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -614056822;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A cubic Bézier curve to a given point.
     */
    public static class VectorPathCommandCubicBezierCurve extends VectorPathCommand {
        /**
         * The start control point of the curve.
         */
        public Point startControlPoint;
        /**
         * The end control point of the curve.
         */
        public Point endControlPoint;
        /**
         * The end point of the curve.
         */
        public Point endPoint;

        /**
         * A cubic Bézier curve to a given point.
         */
        public VectorPathCommandCubicBezierCurve() {
        }

        /**
         * A cubic Bézier curve to a given point.
         *
         * @param startControlPoint The start control point of the curve.
         * @param endControlPoint The end control point of the curve.
         * @param endPoint The end point of the curve.
         */
        public VectorPathCommandCubicBezierCurve(Point startControlPoint, Point endControlPoint, Point endPoint) {
            this.startControlPoint = startControlPoint;
            this.endControlPoint = endControlPoint;
            this.endPoint = endPoint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1229733434;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a venue.
     */
    public static class Venue extends Object {
        /**
         * Venue location; as defined by the sender.
         */
        public Location location;
        /**
         * Venue name; as defined by the sender.
         */
        public String title;
        /**
         * Venue address; as defined by the sender.
         */
        public String address;
        /**
         * Provider of the venue database; as defined by the sender. Currently, only &quot;foursquare&quot; and &quot;gplaces&quot; (Google Places) need to be supported.
         */
        public String provider;
        /**
         * Identifier of the venue in the provider database; as defined by the sender.
         */
        public String id;
        /**
         * Type of the venue in the provider database; as defined by the sender.
         */
        public String type;

        /**
         * Describes a venue.
         */
        public Venue() {
        }

        /**
         * Describes a venue.
         *
         * @param location Venue location; as defined by the sender.
         * @param title Venue name; as defined by the sender.
         * @param address Venue address; as defined by the sender.
         * @param provider Provider of the venue database; as defined by the sender. Currently, only &quot;foursquare&quot; and &quot;gplaces&quot; (Google Places) need to be supported.
         * @param id Identifier of the venue in the provider database; as defined by the sender.
         * @param type Type of the venue in the provider database; as defined by the sender.
         */
        public Venue(Location location, String title, String address, String provider, String id, String type) {
            this.location = location;
            this.title = title;
            this.address = address;
            this.provider = provider;
            this.id = id;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1070406393;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a video file.
     */
    public static class Video extends Object {
        /**
         * Duration of the video, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * Video width; as defined by the sender.
         */
        public int width;
        /**
         * Video height; as defined by the sender.
         */
        public int height;
        /**
         * Original name of the file; as defined by the sender.
         */
        public String fileName;
        /**
         * MIME type of the file; as defined by the sender.
         */
        public String mimeType;
        /**
         * True, if stickers were added to the video. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         */
        public boolean hasStickers;
        /**
         * True, if the video is supposed to be streamed.
         */
        public boolean supportsStreaming;
        /**
         * Video minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Video thumbnail in JPEG or MPEG4 format; as defined by the sender; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * File containing the video.
         */
        public File video;

        /**
         * Describes a video file.
         */
        public Video() {
        }

        /**
         * Describes a video file.
         *
         * @param duration Duration of the video, in seconds; as defined by the sender.
         * @param width Video width; as defined by the sender.
         * @param height Video height; as defined by the sender.
         * @param fileName Original name of the file; as defined by the sender.
         * @param mimeType MIME type of the file; as defined by the sender.
         * @param hasStickers True, if stickers were added to the video. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         * @param supportsStreaming True, if the video is supposed to be streamed.
         * @param minithumbnail Video minithumbnail; may be null.
         * @param thumbnail Video thumbnail in JPEG or MPEG4 format; as defined by the sender; may be null.
         * @param video File containing the video.
         */
        public Video(int duration, int width, int height, String fileName, String mimeType, boolean hasStickers, boolean supportsStreaming, Minithumbnail minithumbnail, Thumbnail thumbnail, File video) {
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.fileName = fileName;
            this.mimeType = mimeType;
            this.hasStickers = hasStickers;
            this.supportsStreaming = supportsStreaming;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 832856268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a video chat.
     */
    public static class VideoChat extends Object {
        /**
         * Group call identifier of an active video chat; 0 if none. Full information about the video chat can be received through the method getGroupCall.
         */
        public int groupCallId;
        /**
         * True, if the video chat has participants.
         */
        public boolean hasParticipants;
        /**
         * Default group call participant identifier to join the video chat; may be null.
         */
        @Nullable public MessageSender defaultParticipantId;

        /**
         * Describes a video chat.
         */
        public VideoChat() {
        }

        /**
         * Describes a video chat.
         *
         * @param groupCallId Group call identifier of an active video chat; 0 if none. Full information about the video chat can be received through the method getGroupCall.
         * @param hasParticipants True, if the video chat has participants.
         * @param defaultParticipantId Default group call participant identifier to join the video chat; may be null.
         */
        public VideoChat(int groupCallId, boolean hasParticipants, MessageSender defaultParticipantId) {
            this.groupCallId = groupCallId;
            this.hasParticipants = hasParticipants;
            this.defaultParticipantId = defaultParticipantId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1374319320;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format.
     */
    public static class VideoNote extends Object {
        /**
         * Duration of the video, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * A waveform representation of the video note's audio in 5-bit format; may be empty if unknown.
         */
        public byte[] waveform;
        /**
         * Video width and height; as defined by the sender.
         */
        public int length;
        /**
         * Video minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Video thumbnail in JPEG format; as defined by the sender; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * Result of speech recognition in the video note; may be null.
         */
        @Nullable public SpeechRecognitionResult speechRecognitionResult;
        /**
         * File containing the video.
         */
        public File video;

        /**
         * Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format.
         */
        public VideoNote() {
        }

        /**
         * Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format.
         *
         * @param duration Duration of the video, in seconds; as defined by the sender.
         * @param waveform A waveform representation of the video note's audio in 5-bit format; may be empty if unknown.
         * @param length Video width and height; as defined by the sender.
         * @param minithumbnail Video minithumbnail; may be null.
         * @param thumbnail Video thumbnail in JPEG format; as defined by the sender; may be null.
         * @param speechRecognitionResult Result of speech recognition in the video note; may be null.
         * @param video File containing the video.
         */
        public VideoNote(int duration, byte[] waveform, int length, Minithumbnail minithumbnail, Thumbnail thumbnail, SpeechRecognitionResult speechRecognitionResult, File video) {
            this.duration = duration;
            this.waveform = waveform;
            this.length = length;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.speechRecognitionResult = speechRecognitionResult;
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2062096581;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a voice note.
     */
    public static class VoiceNote extends Object {
        /**
         * Duration of the voice note, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * A waveform representation of the voice note in 5-bit format.
         */
        public byte[] waveform;
        /**
         * MIME type of the file; as defined by the sender. Usually, one of &quot;audio/ogg&quot; for Opus in an OGG container, &quot;audio/mpeg&quot; for an MP3 audio, or &quot;audio/mp4&quot; for an M4A audio.
         */
        public String mimeType;
        /**
         * Result of speech recognition in the voice note; may be null.
         */
        @Nullable public SpeechRecognitionResult speechRecognitionResult;
        /**
         * File containing the voice note.
         */
        public File voice;

        /**
         * Describes a voice note.
         */
        public VoiceNote() {
        }

        /**
         * Describes a voice note.
         *
         * @param duration Duration of the voice note, in seconds; as defined by the sender.
         * @param waveform A waveform representation of the voice note in 5-bit format.
         * @param mimeType MIME type of the file; as defined by the sender. Usually, one of &quot;audio/ogg&quot; for Opus in an OGG container, &quot;audio/mpeg&quot; for an MP3 audio, or &quot;audio/mp4&quot; for an M4A audio.
         * @param speechRecognitionResult Result of speech recognition in the voice note; may be null.
         * @param voice File containing the voice note.
         */
        public VoiceNote(int duration, byte[] waveform, String mimeType, SpeechRecognitionResult speechRecognitionResult, File voice) {
            this.duration = duration;
            this.waveform = waveform;
            this.mimeType = mimeType;
            this.speechRecognitionResult = speechRecognitionResult;
            this.voice = voice;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1175302923;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a Web App. Use getInternalLink with internalLinkTypeWebApp to share the Web App.
     */
    public static class WebApp extends Object {
        /**
         * Web App short name.
         */
        public String shortName;
        /**
         * Web App title.
         */
        public String title;
        /**
         * Web App description.
         */
        public String description;
        /**
         * Web App photo.
         */
        public Photo photo;
        /**
         * Web App animation; may be null.
         */
        @Nullable public Animation animation;

        /**
         * Describes a Web App. Use getInternalLink with internalLinkTypeWebApp to share the Web App.
         */
        public WebApp() {
        }

        /**
         * Describes a Web App. Use getInternalLink with internalLinkTypeWebApp to share the Web App.
         *
         * @param shortName Web App short name.
         * @param title Web App title.
         * @param description Web App description.
         * @param photo Web App photo.
         * @param animation Web App animation; may be null.
         */
        public WebApp(String shortName, String title, String description, Photo photo, Animation animation) {
            this.shortName = shortName;
            this.title = title;
            this.description = description;
            this.photo = photo;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1616619763;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Web App.
     */
    public static class WebAppInfo extends Object {
        /**
         * Unique identifier for the Web App launch.
         */
        public long launchId;
        /**
         * A Web App URL to open in a web view.
         */
        public String url;

        /**
         * Contains information about a Web App.
         */
        public WebAppInfo() {
        }

        /**
         * Contains information about a Web App.
         *
         * @param launchId Unique identifier for the Web App launch.
         * @param url A Web App URL to open in a web view.
         */
        public WebAppInfo(long launchId, String url) {
            this.launchId = launchId;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 788378344;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an instant view page for a web page.
     */
    public static class WebPageInstantView extends Object {
        /**
         * Content of the instant view page.
         */
        public PageBlock[] pageBlocks;
        /**
         * Number of the instant view views; 0 if unknown.
         */
        public int viewCount;
        /**
         * Version of the instant view; currently, can be 1 or 2.
         */
        public int version;
        /**
         * True, if the instant view must be shown from right to left.
         */
        public boolean isRtl;
        /**
         * True, if the instant view contains the full page. A network request might be needed to get the full instant view.
         */
        public boolean isFull;
        /**
         * An internal link to be opened to leave feedback about the instant view.
         */
        public InternalLinkType feedbackLink;

        /**
         * Describes an instant view page for a web page.
         */
        public WebPageInstantView() {
        }

        /**
         * Describes an instant view page for a web page.
         *
         * @param pageBlocks Content of the instant view page.
         * @param viewCount Number of the instant view views; 0 if unknown.
         * @param version Version of the instant view; currently, can be 1 or 2.
         * @param isRtl True, if the instant view must be shown from right to left.
         * @param isFull True, if the instant view contains the full page. A network request might be needed to get the full instant view.
         * @param feedbackLink An internal link to be opened to leave feedback about the instant view.
         */
        public WebPageInstantView(PageBlock[] pageBlocks, int viewCount, int version, boolean isRtl, boolean isFull, InternalLinkType feedbackLink) {
            this.pageBlocks = pageBlocks;
            this.viewCount = viewCount;
            this.version = version;
            this.isRtl = isRtl;
            this.isFull = isFull;
            this.feedbackLink = feedbackLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 778202453;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Accepts an incoming call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AcceptCall extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * The call protocols supported by the application.
         */
        public CallProtocol protocol;

        /**
         * Default constructor for a function, which accepts an incoming call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AcceptCall() {
        }

        /**
         * Creates a function, which accepts an incoming call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param protocol The call protocols supported by the application.
         */
        public AcceptCall(int callId, CallProtocol protocol) {
            this.callId = callId;
            this.protocol = protocol;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -646618416;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Accepts Telegram terms of services.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AcceptTermsOfService extends Function<Ok> {
        /**
         * Terms of service identifier.
         */
        public String termsOfServiceId;

        /**
         * Default constructor for a function, which accepts Telegram terms of services.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AcceptTermsOfService() {
        }

        /**
         * Creates a function, which accepts Telegram terms of services.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param termsOfServiceId Terms of service identifier.
         */
        public AcceptTermsOfService(String termsOfServiceId) {
            this.termsOfServiceId = termsOfServiceId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2130576356;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Activates stealth mode for stories, which hides all views of stories from the current user in the last &quot;story_stealth_mode_past_period&quot; seconds and for the next &quot;story_stealth_mode_future_period&quot; seconds; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ActivateStoryStealthMode extends Function<Ok> {

        /**
         * Default constructor for a function, which activates stealth mode for stories, which hides all views of stories from the current user in the last &quot;story_stealth_mode_past_period&quot; seconds and for the next &quot;story_stealth_mode_future_period&quot; seconds; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ActivateStoryStealthMode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1009023855;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a chat folder by an invite link.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddChatFolderByInviteLink extends Function<Ok> {
        /**
         * Invite link for the chat folder.
         */
        public String inviteLink;
        /**
         * Identifiers of the chats added to the chat folder. The chats are automatically joined if they aren't joined yet.
         */
        public long[] chatIds;

        /**
         * Default constructor for a function, which adds a chat folder by an invite link.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddChatFolderByInviteLink() {
        }

        /**
         * Creates a function, which adds a chat folder by an invite link.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inviteLink Invite link for the chat folder.
         * @param chatIds Identifiers of the chats added to the chat folder. The chats are automatically joined if they aren't joined yet.
         */
        public AddChatFolderByInviteLink(String inviteLink, long[] chatIds) {
            this.inviteLink = inviteLink;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -858593816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new member to a chat; requires canInviteUsers member right. Members can't be added to private or secret chats. Returns information about members that weren't added.
     *
     * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
     */
    public static class AddChatMember extends Function<FailedToAddMembers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user.
         */
        public long userId;
        /**
         * The number of earlier messages from the chat to be forwarded to the new member; up to 100. Ignored for supergroups and channels, or if the added user is a bot.
         */
        public int forwardLimit;

        /**
         * Default constructor for a function, which adds a new member to a chat; requires canInviteUsers member right. Members can't be added to private or secret chats. Returns information about members that weren't added.
         *
         * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
         */
        public AddChatMember() {
        }

        /**
         * Creates a function, which adds a new member to a chat; requires canInviteUsers member right. Members can't be added to private or secret chats. Returns information about members that weren't added.
         *
         * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
         *
         * @param chatId Chat identifier.
         * @param userId Identifier of the user.
         * @param forwardLimit The number of earlier messages from the chat to be forwarded to the new member; up to 100. Ignored for supergroups and channels, or if the added user is a bot.
         */
        public AddChatMember(long chatId, long userId, int forwardLimit) {
            this.chatId = chatId;
            this.userId = userId;
            this.forwardLimit = forwardLimit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1720144407;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds multiple new members to a chat; requires canInviteUsers member right. Currently, this method is only available for supergroups and channels. This method can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Returns information about members that weren't added.
     *
     * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
     */
    public static class AddChatMembers extends Function<FailedToAddMembers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifiers of the users to be added to the chat. The maximum number of added users is 20 for supergroups and 100 for channels.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which adds multiple new members to a chat; requires canInviteUsers member right. Currently, this method is only available for supergroups and channels. This method can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Returns information about members that weren't added.
         *
         * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
         */
        public AddChatMembers() {
        }

        /**
         * Creates a function, which adds multiple new members to a chat; requires canInviteUsers member right. Currently, this method is only available for supergroups and channels. This method can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Returns information about members that weren't added.
         *
         * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
         *
         * @param chatId Chat identifier.
         * @param userIds Identifiers of the users to be added to the chat. The maximum number of added users is 20 for supergroups and 100 for channels.
         */
        public AddChatMembers(long chatId, long[] userIds) {
            this.chatId = chatId;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1675991329;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a chat to a chat list. A chat can't be simultaneously in Main and Archive chat lists, so it is automatically removed from another one if needed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddChatToList extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The chat list. Use getChatListsToAddChat to get suitable chat lists.
         */
        public ChatList chatList;

        /**
         * Default constructor for a function, which adds a chat to a chat list. A chat can't be simultaneously in Main and Archive chat lists, so it is automatically removed from another one if needed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddChatToList() {
        }

        /**
         * Creates a function, which adds a chat to a chat list. A chat can't be simultaneously in Main and Archive chat lists, so it is automatically removed from another one if needed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param chatList The chat list. Use getChatListsToAddChat to get suitable chat lists.
         */
        public AddChatToList(long chatId, ChatList chatList) {
            this.chatId = chatId;
            this.chatList = chatList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -80523595;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a user to the contact list or edits an existing contact by their user identifier.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddContact extends Function<Ok> {
        /**
         * The contact to add or edit; phone number may be empty and needs to be specified only if known, vCard is ignored.
         */
        public Contact contact;
        /**
         * Pass true to share the current user's phone number with the new contact. A corresponding rule to userPrivacySettingShowPhoneNumber will be added if needed. Use the field userFullInfo.needPhoneNumberPrivacyException to check whether the current user needs to be asked to share their phone number.
         */
        public boolean sharePhoneNumber;

        /**
         * Default constructor for a function, which adds a user to the contact list or edits an existing contact by their user identifier.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddContact() {
        }

        /**
         * Creates a function, which adds a user to the contact list or edits an existing contact by their user identifier.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param contact The contact to add or edit; phone number may be empty and needs to be specified only if known, vCard is ignored.
         * @param sharePhoneNumber Pass true to share the current user's phone number with the new contact. A corresponding rule to userPrivacySettingShowPhoneNumber will be added if needed. Use the field userFullInfo.needPhoneNumberPrivacyException to check whether the current user needs to be asked to share their phone number.
         */
        public AddContact(Contact contact, boolean sharePhoneNumber) {
            this.contact = contact;
            this.sharePhoneNumber = sharePhoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1869640000;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a custom server language pack to the list of installed language packs in current localization target. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddCustomServerLanguagePack extends Function<Ok> {
        /**
         * Identifier of a language pack to be added.
         */
        public String languagePackId;

        /**
         * Default constructor for a function, which adds a custom server language pack to the list of installed language packs in current localization target. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddCustomServerLanguagePack() {
        }

        /**
         * Creates a function, which adds a custom server language pack to the list of installed language packs in current localization target. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param languagePackId Identifier of a language pack to be added.
         */
        public AddCustomServerLanguagePack(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 4492771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to favorite stickers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddFavoriteSticker extends Function<Ok> {
        /**
         * Sticker file to add.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to favorite stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddFavoriteSticker() {
        }

        /**
         * Creates a function, which adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to favorite stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker file to add.
         */
        public AddFavoriteSticker(InputFile sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 324504799;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a file from a message to the list of file downloads. Download progress and completion of the download will be notified through updateFile updates. If message database is used, the list of file downloads is persistent across application restarts. The downloading is independent of download using downloadFile, i.e. it continues if downloadFile is canceled or is used to download a part of the file.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class AddFileToDownloads extends Function<File> {
        /**
         * Identifier of the file to download.
         */
        public int fileId;
        /**
         * Chat identifier of the message with the file.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first.
         */
        public int priority;

        /**
         * Default constructor for a function, which adds a file from a message to the list of file downloads. Download progress and completion of the download will be notified through updateFile updates. If message database is used, the list of file downloads is persistent across application restarts. The downloading is independent of download using downloadFile, i.e. it continues if downloadFile is canceled or is used to download a part of the file.
         *
         * <p> Returns {@link File File} </p>
         */
        public AddFileToDownloads() {
        }

        /**
         * Creates a function, which adds a file from a message to the list of file downloads. Download progress and completion of the download will be notified through updateFile updates. If message database is used, the list of file downloads is persistent across application restarts. The downloading is independent of download using downloadFile, i.e. it continues if downloadFile is canceled or is used to download a part of the file.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param fileId Identifier of the file to download.
         * @param chatId Chat identifier of the message with the file.
         * @param messageId Message identifier.
         * @param priority Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first.
         */
        public AddFileToDownloads(int fileId, long chatId, long messageId, int priority) {
            this.fileId = fileId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.priority = priority;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 867533751;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class AddLocalMessage extends Function<Message> {
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * Identifier of the sender of the message.
         */
        public MessageSender senderId;
        /**
         * Information about the message or story to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Pass true to disable notification for the message.
         */
        public boolean disableNotification;
        /**
         * The content of the message to be added.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public AddLocalMessage() {
        }

        /**
         * Creates a function, which adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Target chat.
         * @param senderId Identifier of the sender of the message.
         * @param replyTo Information about the message or story to be replied; pass null if none.
         * @param disableNotification Pass true to disable notification for the message.
         * @param inputMessageContent The content of the message to be added.
         */
        public AddLocalMessage(long chatId, MessageSender senderId, InputMessageReplyTo replyTo, boolean disableNotification, InputMessageContent inputMessageContent) {
            this.chatId = chatId;
            this.senderId = senderId;
            this.replyTo = replyTo;
            this.disableNotification = disableNotification;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -166217823;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a message to TDLib internal log. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddLogMessage extends Function<Ok> {
        /**
         * The minimum verbosity level needed for the message to be logged; 0-1023.
         */
        public int verbosityLevel;
        /**
         * Text of a message to log.
         */
        public String text;

        /**
         * Default constructor for a function, which adds a message to TDLib internal log. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddLogMessage() {
        }

        /**
         * Creates a function, which adds a message to TDLib internal log. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param verbosityLevel The minimum verbosity level needed for the message to be logged; 0-1023.
         * @param text Text of a message to log.
         */
        public AddLogMessage(int verbosityLevel, String text) {
            this.verbosityLevel = verbosityLevel;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1597427692;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a reaction or a tag to a message. Use getMessageAvailableReactions to receive the list of available reactions for the message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddMessageReaction extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Type of the reaction to add.
         */
        public ReactionType reactionType;
        /**
         * Pass true if the reaction is added with a big animation.
         */
        public boolean isBig;
        /**
         * Pass true if the reaction needs to be added to recent reactions; tags are never added to the list of recent reactions.
         */
        public boolean updateRecentReactions;

        /**
         * Default constructor for a function, which adds a reaction or a tag to a message. Use getMessageAvailableReactions to receive the list of available reactions for the message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddMessageReaction() {
        }

        /**
         * Creates a function, which adds a reaction or a tag to a message. Use getMessageAvailableReactions to receive the list of available reactions for the message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param reactionType Type of the reaction to add.
         * @param isBig Pass true if the reaction is added with a big animation.
         * @param updateRecentReactions Pass true if the reaction needs to be added to recent reactions; tags are never added to the list of recent reactions.
         */
        public AddMessageReaction(long chatId, long messageId, ReactionType reactionType, boolean isBig, boolean updateRecentReactions) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.reactionType = reactionType;
            this.isBig = isBig;
            this.updateRecentReactions = updateRecentReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1419269613;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds the specified data to data usage statistics. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddNetworkStatistics extends Function<Ok> {
        /**
         * The network statistics entry with the data to be added to statistics.
         */
        public NetworkStatisticsEntry entry;

        /**
         * Default constructor for a function, which adds the specified data to data usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddNetworkStatistics() {
        }

        /**
         * Creates a function, which adds the specified data to data usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param entry The network statistics entry with the data to be added to statistics.
         */
        public AddNetworkStatistics(NetworkStatisticsEntry entry) {
            this.entry = entry;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1264825305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a proxy server for network requests. Can be called before authorization.
     *
     * <p> Returns {@link Proxy Proxy} </p>
     */
    public static class AddProxy extends Function<Proxy> {
        /**
         * Proxy server domain or IP address.
         */
        public String server;
        /**
         * Proxy server port.
         */
        public int port;
        /**
         * Pass true to immediately enable the proxy.
         */
        public boolean enable;
        /**
         * Proxy type.
         */
        public ProxyType type;

        /**
         * Default constructor for a function, which adds a proxy server for network requests. Can be called before authorization.
         *
         * <p> Returns {@link Proxy Proxy} </p>
         */
        public AddProxy() {
        }

        /**
         * Creates a function, which adds a proxy server for network requests. Can be called before authorization.
         *
         * <p> Returns {@link Proxy Proxy} </p>
         *
         * @param server Proxy server domain or IP address.
         * @param port Proxy server port.
         * @param enable Pass true to immediately enable the proxy.
         * @param type Proxy type.
         */
        public AddProxy(String server, int port, boolean enable, ProxyType type) {
            this.server = server;
            this.port = port;
            this.enable = enable;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 331529432;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a message to a quick reply shortcut via inline bot. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
     *
     * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
     */
    public static class AddQuickReplyShortcutInlineQueryResultMessage extends Function<QuickReplyMessage> {
        /**
         * Name of the target shortcut.
         */
        public String shortcutName;
        /**
         * Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         */
        public long replyToMessageId;
        /**
         * Identifier of the inline query.
         */
        public long queryId;
        /**
         * Identifier of the inline query result.
         */
        public String resultId;
        /**
         * Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption(&quot;animation_search_bot_username&quot;), getOption(&quot;photo_search_bot_username&quot;), and getOption(&quot;venue_search_bot_username&quot;).
         */
        public boolean hideViaBot;

        /**
         * Default constructor for a function, which adds a message to a quick reply shortcut via inline bot. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
         *
         * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
         */
        public AddQuickReplyShortcutInlineQueryResultMessage() {
        }

        /**
         * Creates a function, which adds a message to a quick reply shortcut via inline bot. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
         *
         * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
         *
         * @param shortcutName Name of the target shortcut.
         * @param replyToMessageId Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         * @param queryId Identifier of the inline query.
         * @param resultId Identifier of the inline query result.
         * @param hideViaBot Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption(&quot;animation_search_bot_username&quot;), getOption(&quot;photo_search_bot_username&quot;), and getOption(&quot;venue_search_bot_username&quot;).
         */
        public AddQuickReplyShortcutInlineQueryResultMessage(String shortcutName, long replyToMessageId, long queryId, String resultId, boolean hideViaBot) {
            this.shortcutName = shortcutName;
            this.replyToMessageId = replyToMessageId;
            this.queryId = queryId;
            this.resultId = resultId;
            this.hideViaBot = hideViaBot;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2017449468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a message to a quick reply shortcut. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
     *
     * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
     */
    public static class AddQuickReplyShortcutMessage extends Function<QuickReplyMessage> {
        /**
         * Name of the target shortcut.
         */
        public String shortcutName;
        /**
         * Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         */
        public long replyToMessageId;
        /**
         * The content of the message to be added; inputMessagePoll, inputMessageForwarded and inputMessageLocation with livePeriod aren't supported.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which adds a message to a quick reply shortcut. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
         *
         * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
         */
        public AddQuickReplyShortcutMessage() {
        }

        /**
         * Creates a function, which adds a message to a quick reply shortcut. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
         *
         * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
         *
         * @param shortcutName Name of the target shortcut.
         * @param replyToMessageId Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         * @param inputMessageContent The content of the message to be added; inputMessagePoll, inputMessageForwarded and inputMessageLocation with livePeriod aren't supported.
         */
        public AddQuickReplyShortcutMessage(String shortcutName, long replyToMessageId, InputMessageContent inputMessageContent) {
            this.shortcutName = shortcutName;
            this.replyToMessageId = replyToMessageId;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1058573098;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds 2-10 messages grouped together into an album to a quick reply shortcut. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
     *
     * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
     */
    public static class AddQuickReplyShortcutMessageAlbum extends Function<QuickReplyMessages> {
        /**
         * Name of the target shortcut.
         */
        public String shortcutName;
        /**
         * Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         */
        public long replyToMessageId;
        /**
         * Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public InputMessageContent[] inputMessageContents;

        /**
         * Default constructor for a function, which adds 2-10 messages grouped together into an album to a quick reply shortcut. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
         */
        public AddQuickReplyShortcutMessageAlbum() {
        }

        /**
         * Creates a function, which adds 2-10 messages grouped together into an album to a quick reply shortcut. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
         *
         * @param shortcutName Name of the target shortcut.
         * @param replyToMessageId Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         * @param inputMessageContents Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public AddQuickReplyShortcutMessageAlbum(String shortcutName, long replyToMessageId, InputMessageContent[] inputMessageContents) {
            this.shortcutName = shortcutName;
            this.replyToMessageId = replyToMessageId;
            this.inputMessageContents = inputMessageContents;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1348436244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to recent stickers.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class AddRecentSticker extends Function<Stickers> {
        /**
         * Pass true to add the sticker to the list of stickers recently attached to photo or video files; pass false to add the sticker to the list of recently sent stickers.
         */
        public boolean isAttached;
        /**
         * Sticker file to add.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to recent stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public AddRecentSticker() {
        }

        /**
         * Creates a function, which manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to recent stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param isAttached Pass true to add the sticker to the list of stickers recently attached to photo or video files; pass false to add the sticker to the list of recently sent stickers.
         * @param sticker Sticker file to add.
         */
        public AddRecentSticker(boolean isAttached, InputFile sticker) {
            this.isAttached = isAttached;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1478109026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddRecentlyFoundChat extends Function<Ok> {
        /**
         * Identifier of the chat to add.
         */
        public long chatId;

        /**
         * Default constructor for a function, which adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddRecentlyFoundChat() {
        }

        /**
         * Creates a function, which adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to add.
         */
        public AddRecentlyFoundChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1746396787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type &quot;video/mp4&quot; can be added to the list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddSavedAnimation extends Function<Ok> {
        /**
         * The animation file to be added. Only animations known to the server (i.e., successfully sent via a message) can be added to the list.
         */
        public InputFile animation;

        /**
         * Default constructor for a function, which manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type &quot;video/mp4&quot; can be added to the list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddSavedAnimation() {
        }

        /**
         * Creates a function, which manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type &quot;video/mp4&quot; can be added to the list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param animation The animation file to be added. Only animations known to the server (i.e., successfully sent via a message) can be added to the list.
         */
        public AddSavedAnimation(InputFile animation) {
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1538525088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new notification sound to the list of saved notification sounds. The new notification sound is added to the top of the list. If it is already in the list, its position isn't changed.
     *
     * <p> Returns {@link NotificationSound NotificationSound} </p>
     */
    public static class AddSavedNotificationSound extends Function<NotificationSound> {
        /**
         * Notification sound file to add.
         */
        public InputFile sound;

        /**
         * Default constructor for a function, which adds a new notification sound to the list of saved notification sounds. The new notification sound is added to the top of the list. If it is already in the list, its position isn't changed.
         *
         * <p> Returns {@link NotificationSound NotificationSound} </p>
         */
        public AddSavedNotificationSound() {
        }

        /**
         * Creates a function, which adds a new notification sound to the list of saved notification sounds. The new notification sound is added to the top of the list. If it is already in the list, its position isn't changed.
         *
         * <p> Returns {@link NotificationSound NotificationSound} </p>
         *
         * @param sound Notification sound file to add.
         */
        public AddSavedNotificationSound(InputFile sound) {
            this.sound = sound;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1043956975;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new sticker to a set.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddStickerToSet extends Function<Ok> {
        /**
         * Sticker set owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker set name. The sticker set must be owned by the current user, and contain less than 200 stickers for custom emoji sticker sets and less than 120 otherwise.
         */
        public String name;
        /**
         * Sticker to add to the set.
         */
        public InputSticker sticker;

        /**
         * Default constructor for a function, which adds a new sticker to a set.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddStickerToSet() {
        }

        /**
         * Creates a function, which adds a new sticker to a set.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Sticker set owner; ignored for regular users.
         * @param name Sticker set name. The sticker set must be owned by the current user, and contain less than 200 stickers for custom emoji sticker sets and less than 120 otherwise.
         * @param sticker Sticker to add to the set.
         */
        public AddStickerToSet(long userId, String name, InputSticker sticker) {
            this.userId = userId;
            this.name = name;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1457266235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allows the specified bot to send messages to the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AllowBotToSendMessages extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which allows the specified bot to send messages to the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AllowBotToSendMessages() {
        }

        /**
         * Creates a function, which allows the specified bot to send messages to the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         */
        public AllowBotToSendMessages(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1776928142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of a callback query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerCallbackQuery extends Function<Ok> {
        /**
         * Identifier of the callback query.
         */
        public long callbackQueryId;
        /**
         * Text of the answer.
         */
        public String text;
        /**
         * Pass true to show an alert to the user instead of a toast notification.
         */
        public boolean showAlert;
        /**
         * URL to be opened.
         */
        public String url;
        /**
         * Time during which the result of the query can be cached, in seconds.
         */
        public int cacheTime;

        /**
         * Default constructor for a function, which sets the result of a callback query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerCallbackQuery() {
        }

        /**
         * Creates a function, which sets the result of a callback query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callbackQueryId Identifier of the callback query.
         * @param text Text of the answer.
         * @param showAlert Pass true to show an alert to the user instead of a toast notification.
         * @param url URL to be opened.
         * @param cacheTime Time during which the result of the query can be cached, in seconds.
         */
        public AnswerCallbackQuery(long callbackQueryId, String text, boolean showAlert, String url, int cacheTime) {
            this.callbackQueryId = callbackQueryId;
            this.text = text;
            this.showAlert = showAlert;
            this.url = url;
            this.cacheTime = cacheTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1153028490;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Answers a custom query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerCustomQuery extends Function<Ok> {
        /**
         * Identifier of a custom query.
         */
        public long customQueryId;
        /**
         * JSON-serialized answer to the query.
         */
        public String data;

        /**
         * Default constructor for a function, which answers a custom query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerCustomQuery() {
        }

        /**
         * Creates a function, which answers a custom query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param customQueryId Identifier of a custom query.
         * @param data JSON-serialized answer to the query.
         */
        public AnswerCustomQuery(long customQueryId, String data) {
            this.customQueryId = customQueryId;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1293603521;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of an inline query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerInlineQuery extends Function<Ok> {
        /**
         * Identifier of the inline query.
         */
        public long inlineQueryId;
        /**
         * Pass true if results may be cached and returned only for the user that sent the query. By default, results may be returned to any user who sends the same query.
         */
        public boolean isPersonal;
        /**
         * Button to be shown above inline query results; pass null if none.
         */
        public InlineQueryResultsButton button;
        /**
         * The results of the query.
         */
        public InputInlineQueryResult[] results;
        /**
         * Allowed time to cache the results of the query, in seconds.
         */
        public int cacheTime;
        /**
         * Offset for the next inline query; pass an empty string if there are no more results.
         */
        public String nextOffset;

        /**
         * Default constructor for a function, which sets the result of an inline query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerInlineQuery() {
        }

        /**
         * Creates a function, which sets the result of an inline query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineQueryId Identifier of the inline query.
         * @param isPersonal Pass true if results may be cached and returned only for the user that sent the query. By default, results may be returned to any user who sends the same query.
         * @param button Button to be shown above inline query results; pass null if none.
         * @param results The results of the query.
         * @param cacheTime Allowed time to cache the results of the query, in seconds.
         * @param nextOffset Offset for the next inline query; pass an empty string if there are no more results.
         */
        public AnswerInlineQuery(long inlineQueryId, boolean isPersonal, InlineQueryResultsButton button, InputInlineQueryResult[] results, int cacheTime, String nextOffset) {
            this.inlineQueryId = inlineQueryId;
            this.isPersonal = isPersonal;
            this.button = button;
            this.results = results;
            this.cacheTime = cacheTime;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1343853844;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of a pre-checkout query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerPreCheckoutQuery extends Function<Ok> {
        /**
         * Identifier of the pre-checkout query.
         */
        public long preCheckoutQueryId;
        /**
         * An error message, empty on success.
         */
        public String errorMessage;

        /**
         * Default constructor for a function, which sets the result of a pre-checkout query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerPreCheckoutQuery() {
        }

        /**
         * Creates a function, which sets the result of a pre-checkout query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param preCheckoutQueryId Identifier of the pre-checkout query.
         * @param errorMessage An error message, empty on success.
         */
        public AnswerPreCheckoutQuery(long preCheckoutQueryId, String errorMessage) {
            this.preCheckoutQueryId = preCheckoutQueryId;
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1486789653;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of a shipping query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerShippingQuery extends Function<Ok> {
        /**
         * Identifier of the shipping query.
         */
        public long shippingQueryId;
        /**
         * Available shipping options.
         */
        public ShippingOption[] shippingOptions;
        /**
         * An error message, empty on success.
         */
        public String errorMessage;

        /**
         * Default constructor for a function, which sets the result of a shipping query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerShippingQuery() {
        }

        /**
         * Creates a function, which sets the result of a shipping query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shippingQueryId Identifier of the shipping query.
         * @param shippingOptions Available shipping options.
         * @param errorMessage An error message, empty on success.
         */
        public AnswerShippingQuery(long shippingQueryId, ShippingOption[] shippingOptions, String errorMessage) {
            this.shippingQueryId = shippingQueryId;
            this.shippingOptions = shippingOptions;
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -434601324;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of interaction with a Web App and sends corresponding message on behalf of the user to the chat from which the query originated; for bots only.
     *
     * <p> Returns {@link SentWebAppMessage SentWebAppMessage} </p>
     */
    public static class AnswerWebAppQuery extends Function<SentWebAppMessage> {
        /**
         * Identifier of the Web App query.
         */
        public String webAppQueryId;
        /**
         * The result of the query.
         */
        public InputInlineQueryResult result;

        /**
         * Default constructor for a function, which sets the result of interaction with a Web App and sends corresponding message on behalf of the user to the chat from which the query originated; for bots only.
         *
         * <p> Returns {@link SentWebAppMessage SentWebAppMessage} </p>
         */
        public AnswerWebAppQuery() {
        }

        /**
         * Creates a function, which sets the result of interaction with a Web App and sends corresponding message on behalf of the user to the chat from which the query originated; for bots only.
         *
         * <p> Returns {@link SentWebAppMessage SentWebAppMessage} </p>
         *
         * @param webAppQueryId Identifier of the Web App query.
         * @param result The result of the query.
         */
        public AnswerWebAppQuery(String webAppQueryId, InputInlineQueryResult result) {
            this.webAppQueryId = webAppQueryId;
            this.result = result;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1598776079;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies a Telegram Premium gift code.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ApplyPremiumGiftCode extends Function<Ok> {
        /**
         * The code to apply.
         */
        public String code;

        /**
         * Default constructor for a function, which applies a Telegram Premium gift code.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ApplyPremiumGiftCode() {
        }

        /**
         * Creates a function, which applies a Telegram Premium gift code.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code The code to apply.
         */
        public ApplyPremiumGiftCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1347138530;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs server about a purchase through App Store. For official applications only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AssignAppStoreTransaction extends Function<Ok> {
        /**
         * App Store receipt.
         */
        public byte[] receipt;
        /**
         * Transaction purpose.
         */
        public StorePaymentPurpose purpose;

        /**
         * Default constructor for a function, which informs server about a purchase through App Store. For official applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AssignAppStoreTransaction() {
        }

        /**
         * Creates a function, which informs server about a purchase through App Store. For official applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param receipt App Store receipt.
         * @param purpose Transaction purpose.
         */
        public AssignAppStoreTransaction(byte[] receipt, StorePaymentPurpose purpose) {
            this.receipt = receipt;
            this.purpose = purpose;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2030892112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs server about a purchase through Google Play. For official applications only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AssignGooglePlayTransaction extends Function<Ok> {
        /**
         * Application package name.
         */
        public String packageName;
        /**
         * Identifier of the purchased store product.
         */
        public String storeProductId;
        /**
         * Google Play purchase token.
         */
        public String purchaseToken;
        /**
         * Transaction purpose.
         */
        public StorePaymentPurpose purpose;

        /**
         * Default constructor for a function, which informs server about a purchase through Google Play. For official applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AssignGooglePlayTransaction() {
        }

        /**
         * Creates a function, which informs server about a purchase through Google Play. For official applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param packageName Application package name.
         * @param storeProductId Identifier of the purchased store product.
         * @param purchaseToken Google Play purchase token.
         * @param purpose Transaction purpose.
         */
        public AssignGooglePlayTransaction(String packageName, String storeProductId, String purchaseToken, StorePaymentPurpose purpose) {
            this.packageName = packageName;
            this.storeProductId = storeProductId;
            this.purchaseToken = purchaseToken;
            this.purpose = purpose;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1992704860;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Bans a member in a chat; requires canRestrictMembers administrator right. Members can't be banned in private or secret chats. In supergroups and channels, the user will not be able to return to the group on their own using invite links, etc., unless unbanned first.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class BanChatMember extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Member identifier.
         */
        public MessageSender memberId;
        /**
         * Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever. Ignored in basic groups and if a chat is banned.
         */
        public int bannedUntilDate;
        /**
         * Pass true to delete all messages in the chat for the user that is being removed. Always true for supergroups and channels.
         */
        public boolean revokeMessages;

        /**
         * Default constructor for a function, which bans a member in a chat; requires canRestrictMembers administrator right. Members can't be banned in private or secret chats. In supergroups and channels, the user will not be able to return to the group on their own using invite links, etc., unless unbanned first.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public BanChatMember() {
        }

        /**
         * Creates a function, which bans a member in a chat; requires canRestrictMembers administrator right. Members can't be banned in private or secret chats. In supergroups and channels, the user will not be able to return to the group on their own using invite links, etc., unless unbanned first.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param memberId Member identifier.
         * @param bannedUntilDate Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever. Ignored in basic groups and if a chat is banned.
         * @param revokeMessages Pass true to delete all messages in the chat for the user that is being removed. Always true for supergroups and channels.
         */
        public BanChatMember(long chatId, MessageSender memberId, int bannedUntilDate, boolean revokeMessages) {
            this.chatId = chatId;
            this.memberId = memberId;
            this.bannedUntilDate = bannedUntilDate;
            this.revokeMessages = revokeMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -888111748;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Blocks an original sender of a message in the Replies chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class BlockMessageSenderFromReplies extends Function<Ok> {
        /**
         * The identifier of an incoming message in the Replies chat.
         */
        public long messageId;
        /**
         * Pass true to delete the message.
         */
        public boolean deleteMessage;
        /**
         * Pass true to delete all messages from the same sender.
         */
        public boolean deleteAllMessages;
        /**
         * Pass true to report the sender to the Telegram moderators.
         */
        public boolean reportSpam;

        /**
         * Default constructor for a function, which blocks an original sender of a message in the Replies chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public BlockMessageSenderFromReplies() {
        }

        /**
         * Creates a function, which blocks an original sender of a message in the Replies chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param messageId The identifier of an incoming message in the Replies chat.
         * @param deleteMessage Pass true to delete the message.
         * @param deleteAllMessages Pass true to delete all messages from the same sender.
         * @param reportSpam Pass true to report the sender to the Telegram moderators.
         */
        public BlockMessageSenderFromReplies(long messageId, boolean deleteMessage, boolean deleteAllMessages, boolean reportSpam) {
            this.messageId = messageId;
            this.deleteMessage = deleteMessage;
            this.deleteAllMessages = deleteAllMessages;
            this.reportSpam = reportSpam;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1214384757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Boosts a chat and returns the list of available chat boost slots for the current user after the boost.
     *
     * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
     */
    public static class BoostChat extends Function<ChatBoostSlots> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifiers of boost slots of the current user from which to apply boosts to the chat.
         */
        public int[] slotIds;

        /**
         * Default constructor for a function, which boosts a chat and returns the list of available chat boost slots for the current user after the boost.
         *
         * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
         */
        public BoostChat() {
        }

        /**
         * Creates a function, which boosts a chat and returns the list of available chat boost slots for the current user after the boost.
         *
         * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
         *
         * @param chatId Identifier of the chat.
         * @param slotIds Identifiers of boost slots of the current user from which to apply boosts to the chat.
         */
        public BoostChat(long chatId, int[] slotIds) {
            this.chatId = chatId;
            this.slotIds = slotIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1945750252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the specified bot can send messages to the user. Returns a 404 error if can't and the access can be granted by call to allowBotToSendMessages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CanBotSendMessages extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which checks whether the specified bot can send messages to the user. Returns a 404 error if can't and the access can be granted by call to allowBotToSendMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CanBotSendMessages() {
        }

        /**
         * Creates a function, which checks whether the specified bot can send messages to the user. Returns a 404 error if can't and the access can be granted by call to allowBotToSendMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         */
        public CanBotSendMessages(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 544052364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether an in-store purchase is possible. Must be called before any in-store purchase.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CanPurchaseFromStore extends Function<Ok> {
        /**
         * Transaction purpose.
         */
        public StorePaymentPurpose purpose;

        /**
         * Default constructor for a function, which checks whether an in-store purchase is possible. Must be called before any in-store purchase.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CanPurchaseFromStore() {
        }

        /**
         * Creates a function, which checks whether an in-store purchase is possible. Must be called before any in-store purchase.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param purpose Transaction purpose.
         */
        public CanPurchaseFromStore(StorePaymentPurpose purpose) {
            this.purpose = purpose;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1017811816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Check whether the current user can message another user or try to create a chat with them.
     *
     * <p> Returns {@link CanSendMessageToUserResult CanSendMessageToUserResult} </p>
     */
    public static class CanSendMessageToUser extends Function<CanSendMessageToUserResult> {
        /**
         * Identifier of the other user.
         */
        public long userId;
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which check whether the current user can message another user or try to create a chat with them.
         *
         * <p> Returns {@link CanSendMessageToUserResult CanSendMessageToUserResult} </p>
         */
        public CanSendMessageToUser() {
        }

        /**
         * Creates a function, which check whether the current user can message another user or try to create a chat with them.
         *
         * <p> Returns {@link CanSendMessageToUserResult CanSendMessageToUserResult} </p>
         *
         * @param userId Identifier of the other user.
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public CanSendMessageToUser(long userId, boolean onlyLocal) {
            this.userId = userId;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1529489462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the current user can send a story on behalf of a chat; requires canPostStories right for supergroup and channel chats.
     *
     * <p> Returns {@link CanSendStoryResult CanSendStoryResult} </p>
     */
    public static class CanSendStory extends Function<CanSendStoryResult> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which checks whether the current user can send a story on behalf of a chat; requires canPostStories right for supergroup and channel chats.
         *
         * <p> Returns {@link CanSendStoryResult CanSendStoryResult} </p>
         */
        public CanSendStory() {
        }

        /**
         * Creates a function, which checks whether the current user can send a story on behalf of a chat; requires canPostStories right for supergroup and channel chats.
         *
         * <p> Returns {@link CanSendStoryResult CanSendStoryResult} </p>
         *
         * @param chatId Chat identifier.
         */
        public CanSendStory(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1226825365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the current session can be used to transfer a chat ownership to another user.
     *
     * <p> Returns {@link CanTransferOwnershipResult CanTransferOwnershipResult} </p>
     */
    public static class CanTransferOwnership extends Function<CanTransferOwnershipResult> {

        /**
         * Default constructor for a function, which checks whether the current session can be used to transfer a chat ownership to another user.
         *
         * <p> Returns {@link CanTransferOwnershipResult CanTransferOwnershipResult} </p>
         */
        public CanTransferOwnership() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 634602508;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stops the downloading of a file. If a file has already been downloaded, does nothing.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CancelDownloadFile extends Function<Ok> {
        /**
         * Identifier of a file to stop downloading.
         */
        public int fileId;
        /**
         * Pass true to stop downloading only if it hasn't been started, i.e. request hasn't been sent to server.
         */
        public boolean onlyIfPending;

        /**
         * Default constructor for a function, which stops the downloading of a file. If a file has already been downloaded, does nothing.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CancelDownloadFile() {
        }

        /**
         * Creates a function, which stops the downloading of a file. If a file has already been downloaded, does nothing.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of a file to stop downloading.
         * @param onlyIfPending Pass true to stop downloading only if it hasn't been started, i.e. request hasn't been sent to server.
         */
        public CancelDownloadFile(int fileId, boolean onlyIfPending) {
            this.fileId = fileId;
            this.onlyIfPending = onlyIfPending;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1954524450;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Cancels reset of 2-step verification password. The method can be called if passwordState.pendingResetDate &gt; 0.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CancelPasswordReset extends Function<Ok> {

        /**
         * Default constructor for a function, which cancels reset of 2-step verification password. The method can be called if passwordState.pendingResetDate &gt; 0.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CancelPasswordReset() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 940733538;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stops the preliminary uploading of a file. Supported only for files uploaded by using preliminaryUploadFile. For other files the behavior is undefined.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CancelPreliminaryUploadFile extends Function<Ok> {
        /**
         * Identifier of the file to stop uploading.
         */
        public int fileId;

        /**
         * Default constructor for a function, which stops the preliminary uploading of a file. Supported only for files uploaded by using preliminaryUploadFile. For other files the behavior is undefined.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CancelPreliminaryUploadFile() {
        }

        /**
         * Creates a function, which stops the preliminary uploading of a file. Supported only for files uploaded by using preliminaryUploadFile. For other files the behavior is undefined.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the file to stop uploading.
         */
        public CancelPreliminaryUploadFile(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 823412414;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Cancels verification of the 2-step verification recovery email address.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class CancelRecoveryEmailAddressVerification extends Function<PasswordState> {

        /**
         * Default constructor for a function, which cancels verification of the 2-step verification recovery email address.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public CancelRecoveryEmailAddressVerification() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1516728691;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes imported contacts using the list of contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. Query result depends on the result of the previous query, so only one query is possible at the same time.
     *
     * <p> Returns {@link ImportedContacts ImportedContacts} </p>
     */
    public static class ChangeImportedContacts extends Function<ImportedContacts> {
        /**
         * The new list of contacts, contact's vCard are ignored and are not imported.
         */
        public Contact[] contacts;

        /**
         * Default constructor for a function, which changes imported contacts using the list of contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. Query result depends on the result of the previous query, so only one query is possible at the same time.
         *
         * <p> Returns {@link ImportedContacts ImportedContacts} </p>
         */
        public ChangeImportedContacts() {
        }

        /**
         * Creates a function, which changes imported contacts using the list of contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. Query result depends on the result of the previous query, so only one query is possible at the same time.
         *
         * <p> Returns {@link ImportedContacts ImportedContacts} </p>
         *
         * @param contacts The new list of contacts, contact's vCard are ignored and are not imported.
         */
        public ChangeImportedContacts(Contact[] contacts) {
            this.contacts = contacts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1968207955;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Installs/uninstalls or activates/archives a sticker set.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ChangeStickerSet extends Function<Ok> {
        /**
         * Identifier of the sticker set.
         */
        public long setId;
        /**
         * The new value of isInstalled.
         */
        public boolean isInstalled;
        /**
         * The new value of isArchived. A sticker set can't be installed and archived simultaneously.
         */
        public boolean isArchived;

        /**
         * Default constructor for a function, which installs/uninstalls or activates/archives a sticker set.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ChangeStickerSet() {
        }

        /**
         * Creates a function, which installs/uninstalls or activates/archives a sticker set.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param setId Identifier of the sticker set.
         * @param isInstalled The new value of isInstalled.
         * @param isArchived The new value of isArchived. A sticker set can't be installed and archived simultaneously.
         */
        public ChangeStickerSet(long setId, boolean isInstalled, boolean isArchived) {
            this.setId = setId;
            this.isInstalled = isInstalled;
            this.isArchived = isArchived;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 449357293;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationBotToken extends Function<Ok> {
        /**
         * The bot token.
         */
        public String token;

        /**
         * Default constructor for a function, which checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationBotToken() {
        }

        /**
         * Creates a function, which checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param token The bot token.
         */
        public CheckAuthenticationBotToken(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 639321206;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationCode extends Function<Ok> {
        /**
         * Authentication code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationCode() {
        }

        /**
         * Creates a function, which checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Authentication code to check.
         */
        public CheckAuthenticationCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -302103382;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the authentication of an email address. Works only when the current authorization state is authorizationStateWaitEmailCode.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationEmailCode extends Function<Ok> {
        /**
         * Email address authentication to check.
         */
        public EmailAddressAuthentication code;

        /**
         * Default constructor for a function, which checks the authentication of an email address. Works only when the current authorization state is authorizationStateWaitEmailCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationEmailCode() {
        }

        /**
         * Creates a function, which checks the authentication of an email address. Works only when the current authorization state is authorizationStateWaitEmailCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Email address authentication to check.
         */
        public CheckAuthenticationEmailCode(EmailAddressAuthentication code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -582827361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the 2-step verification password for correctness. Works only when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationPassword extends Function<Ok> {
        /**
         * The 2-step verification password to check.
         */
        public String password;

        /**
         * Default constructor for a function, which checks the 2-step verification password for correctness. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationPassword() {
        }

        /**
         * Creates a function, which checks the 2-step verification password for correctness. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param password The 2-step verification password to check.
         */
        public CheckAuthenticationPassword(String password) {
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2025698400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a 2-step verification password recovery code sent to an email address is valid. Works only when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationPasswordRecoveryCode extends Function<Ok> {
        /**
         * Recovery code to check.
         */
        public String recoveryCode;

        /**
         * Default constructor for a function, which checks whether a 2-step verification password recovery code sent to an email address is valid. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationPasswordRecoveryCode() {
        }

        /**
         * Creates a function, which checks whether a 2-step verification password recovery code sent to an email address is valid. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param recoveryCode Recovery code to check.
         */
        public CheckAuthenticationPasswordRecoveryCode(String recoveryCode) {
            this.recoveryCode = recoveryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -603309083;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the validity of an invite link for a chat folder and returns information about the corresponding chat folder.
     *
     * <p> Returns {@link ChatFolderInviteLinkInfo ChatFolderInviteLinkInfo} </p>
     */
    public static class CheckChatFolderInviteLink extends Function<ChatFolderInviteLinkInfo> {
        /**
         * Invite link to be checked.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which checks the validity of an invite link for a chat folder and returns information about the corresponding chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLinkInfo ChatFolderInviteLinkInfo} </p>
         */
        public CheckChatFolderInviteLink() {
        }

        /**
         * Creates a function, which checks the validity of an invite link for a chat folder and returns information about the corresponding chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLinkInfo ChatFolderInviteLinkInfo} </p>
         *
         * @param inviteLink Invite link to be checked.
         */
        public CheckChatFolderInviteLink(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 522557851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the validity of an invite link for a chat and returns information about the corresponding chat.
     *
     * <p> Returns {@link ChatInviteLinkInfo ChatInviteLinkInfo} </p>
     */
    public static class CheckChatInviteLink extends Function<ChatInviteLinkInfo> {
        /**
         * Invite link to be checked.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which checks the validity of an invite link for a chat and returns information about the corresponding chat.
         *
         * <p> Returns {@link ChatInviteLinkInfo ChatInviteLinkInfo} </p>
         */
        public CheckChatInviteLink() {
        }

        /**
         * Creates a function, which checks the validity of an invite link for a chat and returns information about the corresponding chat.
         *
         * <p> Returns {@link ChatInviteLinkInfo ChatInviteLinkInfo} </p>
         *
         * @param inviteLink Invite link to be checked.
         */
        public CheckChatInviteLink(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -496940997;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a username can be set for a chat.
     *
     * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
     */
    public static class CheckChatUsername extends Function<CheckChatUsernameResult> {
        /**
         * Chat identifier; must be identifier of a supergroup chat, or a channel chat, or a private chat with self, or 0 if the chat is being created.
         */
        public long chatId;
        /**
         * Username to be checked.
         */
        public String username;

        /**
         * Default constructor for a function, which checks whether a username can be set for a chat.
         *
         * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
         */
        public CheckChatUsername() {
        }

        /**
         * Creates a function, which checks whether a username can be set for a chat.
         *
         * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
         *
         * @param chatId Chat identifier; must be identifier of a supergroup chat, or a channel chat, or a private chat with self, or 0 if the chat is being created.
         * @param username Username to be checked.
         */
        public CheckChatUsername(long chatId, String username) {
            this.chatId = chatId;
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -119119344;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the maximum number of owned public chats has been reached. Returns corresponding error if the limit was reached. The limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckCreatedPublicChatsLimit extends Function<Ok> {
        /**
         * Type of the public chats, for which to check the limit.
         */
        public PublicChatType type;

        /**
         * Default constructor for a function, which checks whether the maximum number of owned public chats has been reached. Returns corresponding error if the limit was reached. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckCreatedPublicChatsLimit() {
        }

        /**
         * Creates a function, which checks whether the maximum number of owned public chats has been reached. Returns corresponding error if the limit was reached. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param type Type of the public chats, for which to check the limit.
         */
        public CheckCreatedPublicChatsLimit(PublicChatType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -445546591;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the email address verification code for Telegram Passport.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckEmailAddressVerificationCode extends Function<Ok> {
        /**
         * Verification code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which checks the email address verification code for Telegram Passport.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckEmailAddressVerificationCode() {
        }

        /**
         * Creates a function, which checks the email address verification code for Telegram Passport.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Verification code to check.
         */
        public CheckEmailAddressVerificationCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -426386685;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the login email address authentication.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckLoginEmailAddressCode extends Function<Ok> {
        /**
         * Email address authentication to check.
         */
        public EmailAddressAuthentication code;

        /**
         * Default constructor for a function, which checks the login email address authentication.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckLoginEmailAddressCode() {
        }

        /**
         * Creates a function, which checks the login email address authentication.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Email address authentication to check.
         */
        public CheckLoginEmailAddressCode(EmailAddressAuthentication code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1454244766;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a 2-step verification password recovery code sent to an email address is valid.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckPasswordRecoveryCode extends Function<Ok> {
        /**
         * Recovery code to check.
         */
        public String recoveryCode;

        /**
         * Default constructor for a function, which checks whether a 2-step verification password recovery code sent to an email address is valid.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckPasswordRecoveryCode() {
        }

        /**
         * Creates a function, which checks whether a 2-step verification password recovery code sent to an email address is valid.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param recoveryCode Recovery code to check.
         */
        public CheckPasswordRecoveryCode(String recoveryCode) {
            this.recoveryCode = recoveryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -200794600;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Check the authentication code and completes the request for which the code was sent if appropriate.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckPhoneNumberCode extends Function<Ok> {
        /**
         * Authentication code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which check the authentication code and completes the request for which the code was sent if appropriate.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckPhoneNumberCode() {
        }

        /**
         * Creates a function, which check the authentication code and completes the request for which the code was sent if appropriate.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Authentication code to check.
         */
        public CheckPhoneNumberCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -603626079;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Return information about a Telegram Premium gift code.
     *
     * <p> Returns {@link PremiumGiftCodeInfo PremiumGiftCodeInfo} </p>
     */
    public static class CheckPremiumGiftCode extends Function<PremiumGiftCodeInfo> {
        /**
         * The code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which return information about a Telegram Premium gift code.
         *
         * <p> Returns {@link PremiumGiftCodeInfo PremiumGiftCodeInfo} </p>
         */
        public CheckPremiumGiftCode() {
        }

        /**
         * Creates a function, which return information about a Telegram Premium gift code.
         *
         * <p> Returns {@link PremiumGiftCodeInfo PremiumGiftCodeInfo} </p>
         *
         * @param code The code to check.
         */
        public CheckPremiumGiftCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1786063260;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks validness of a name for a quick reply shortcut. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckQuickReplyShortcutName extends Function<Ok> {
        /**
         * The name of the shortcut; 1-32 characters.
         */
        public String name;

        /**
         * Default constructor for a function, which checks validness of a name for a quick reply shortcut. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckQuickReplyShortcutName() {
        }

        /**
         * Creates a function, which checks validness of a name for a quick reply shortcut. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name The name of the shortcut; 1-32 characters.
         */
        public CheckQuickReplyShortcutName(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2101203241;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the 2-step verification recovery email address verification code.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class CheckRecoveryEmailAddressCode extends Function<PasswordState> {
        /**
         * Verification code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which checks the 2-step verification recovery email address verification code.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public CheckRecoveryEmailAddressCode() {
        }

        /**
         * Creates a function, which checks the 2-step verification recovery email address verification code.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         *
         * @param code Verification code to check.
         */
        public CheckRecoveryEmailAddressCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1997039589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a name can be used for a new sticker set.
     *
     * <p> Returns {@link CheckStickerSetNameResult CheckStickerSetNameResult} </p>
     */
    public static class CheckStickerSetName extends Function<CheckStickerSetNameResult> {
        /**
         * Name to be checked.
         */
        public String name;

        /**
         * Default constructor for a function, which checks whether a name can be used for a new sticker set.
         *
         * <p> Returns {@link CheckStickerSetNameResult CheckStickerSetNameResult} </p>
         */
        public CheckStickerSetName() {
        }

        /**
         * Creates a function, which checks whether a name can be used for a new sticker set.
         *
         * <p> Returns {@link CheckStickerSetNameResult CheckStickerSetNameResult} </p>
         *
         * @param name Name to be checked.
         */
        public CheckStickerSetName(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1789392642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes potentially dangerous characters from the name of a file. The encoding of the file name is supposed to be UTF-8. Returns an empty string on failure. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class CleanFileName extends Function<Text> {
        /**
         * File name or path to the file.
         */
        public String fileName;

        /**
         * Default constructor for a function, which removes potentially dangerous characters from the name of a file. The encoding of the file name is supposed to be UTF-8. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public CleanFileName() {
        }

        /**
         * Creates a function, which removes potentially dangerous characters from the name of a file. The encoding of the file name is supposed to be UTF-8. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param fileName File name or path to the file.
         */
        public CleanFileName(String fileName) {
            this.fileName = fileName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 967964667;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears message drafts in all chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearAllDraftMessages extends Function<Ok> {
        /**
         * Pass true to keep local message drafts in secret chats.
         */
        public boolean excludeSecretChats;

        /**
         * Default constructor for a function, which clears message drafts in all chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearAllDraftMessages() {
        }

        /**
         * Creates a function, which clears message drafts in all chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param excludeSecretChats Pass true to keep local message drafts in secret chats.
         */
        public ClearAllDraftMessages(boolean excludeSecretChats) {
            this.excludeSecretChats = excludeSecretChats;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -46369573;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of all autosave settings exceptions. The method is guaranteed to work only after at least one call to getAutosaveSettings.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearAutosaveSettingsExceptions extends Function<Ok> {

        /**
         * Default constructor for a function, which clears the list of all autosave settings exceptions. The method is guaranteed to work only after at least one call to getAutosaveSettings.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearAutosaveSettingsExceptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1475109874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears all imported contacts, contact list remains unchanged.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearImportedContacts extends Function<Ok> {

        /**
         * Default constructor for a function, which clears all imported contacts, contact list remains unchanged.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearImportedContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 869503298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently used emoji statuses for self status.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearRecentEmojiStatuses extends Function<Ok> {

        /**
         * Default constructor for a function, which clears the list of recently used emoji statuses for self status.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearRecentEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -428749986;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently used reactions.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearRecentReactions extends Function<Ok> {

        /**
         * Default constructor for a function, which clears the list of recently used reactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearRecentReactions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1298253650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently used stickers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearRecentStickers extends Function<Ok> {
        /**
         * Pass true to clear the list of stickers recently attached to photo or video files; pass false to clear the list of recently sent stickers.
         */
        public boolean isAttached;

        /**
         * Default constructor for a function, which clears the list of recently used stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearRecentStickers() {
        }

        /**
         * Creates a function, which clears the list of recently used stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param isAttached Pass true to clear the list of stickers recently attached to photo or video files; pass false to clear the list of recently sent stickers.
         */
        public ClearRecentStickers(boolean isAttached) {
            this.isAttached = isAttached;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -321242684;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently found chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearRecentlyFoundChats extends Function<Ok> {

        /**
         * Default constructor for a function, which clears the list of recently found chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearRecentlyFoundChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -285582542;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently searched for hashtags or cashtags.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearSearchedForTags extends Function<Ok> {
        /**
         * Pass true to clear the list of recently searched for cashtags; otherwise, the list of recently searched for hashtags will be cleared.
         */
        public boolean clearCashtags;

        /**
         * Default constructor for a function, which clears the list of recently searched for hashtags or cashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearSearchedForTags() {
        }

        /**
         * Creates a function, which clears the list of recently searched for hashtags or cashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param clearCashtags Pass true to clear the list of recently searched for cashtags; otherwise, the list of recently searched for hashtags will be cleared.
         */
        public ClearSearchedForTags(boolean clearCashtags) {
            this.clearCashtags = clearCashtags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 512017238;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a message with an animated emoji was clicked by the user. Returns a big animated sticker to be played or a 404 error if usual animation needs to be played.
     *
     * <p> Returns {@link Sticker Sticker} </p>
     */
    public static class ClickAnimatedEmojiMessage extends Function<Sticker> {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Identifier of the clicked message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which informs TDLib that a message with an animated emoji was clicked by the user. Returns a big animated sticker to be played or a 404 error if usual animation needs to be played.
         *
         * <p> Returns {@link Sticker Sticker} </p>
         */
        public ClickAnimatedEmojiMessage() {
        }

        /**
         * Creates a function, which informs TDLib that a message with an animated emoji was clicked by the user. Returns a big animated sticker to be played or a 404 error if usual animation needs to be played.
         *
         * <p> Returns {@link Sticker Sticker} </p>
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Identifier of the clicked message.
         */
        public ClickAnimatedEmojiMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 196179554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user opened the sponsored chat via the button, the name, the photo, or a mention in the sponsored message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClickChatSponsoredMessage extends Function<Ok> {
        /**
         * Chat identifier of the sponsored message.
         */
        public long chatId;
        /**
         * Identifier of the sponsored message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which informs TDLib that the user opened the sponsored chat via the button, the name, the photo, or a mention in the sponsored message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClickChatSponsoredMessage() {
        }

        /**
         * Creates a function, which informs TDLib that the user opened the sponsored chat via the button, the name, the photo, or a mention in the sponsored message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the sponsored message.
         * @param messageId Identifier of the sponsored message.
         */
        public ClickChatSponsoredMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -641687573;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user clicked Premium subscription button on the Premium features screen.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClickPremiumSubscriptionButton extends Function<Ok> {

        /**
         * Default constructor for a function, which informs TDLib that the user clicked Premium subscription button on the Premium features screen.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClickPremiumSubscriptionButton() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -369319162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Closes the TDLib instance. All databases will be flushed to disk and properly closed. After the close completes, updateAuthorizationState with authorizationStateClosed will be sent. Can be called before initialization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class Close extends Function<Ok> {

        /**
         * Default constructor for a function, which closes the TDLib instance. All databases will be flushed to disk and properly closed. After the close completes, updateAuthorizationState with authorizationStateClosed will be sent. Can be called before initialization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public Close() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1187782273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the chat is closed by the user. Many useful activities depend on the chat being opened or closed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which informs TDLib that the chat is closed by the user. Many useful activities depend on the chat being opened or closed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseChat() {
        }

        /**
         * Creates a function, which informs TDLib that the chat is closed by the user. Many useful activities depend on the chat being opened or closed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public CloseChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 39749353;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Closes a secret chat, effectively transferring its state to secretChatStateClosed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseSecretChat extends Function<Ok> {
        /**
         * Secret chat identifier.
         */
        public int secretChatId;

        /**
         * Default constructor for a function, which closes a secret chat, effectively transferring its state to secretChatStateClosed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseSecretChat() {
        }

        /**
         * Creates a function, which closes a secret chat, effectively transferring its state to secretChatStateClosed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param secretChatId Secret chat identifier.
         */
        public CloseSecretChat(int secretChatId) {
            this.secretChatId = secretChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -471006133;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a story is closed by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseStory extends Function<Ok> {
        /**
         * The identifier of the sender of the story to close.
         */
        public long storySenderChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;

        /**
         * Default constructor for a function, which informs TDLib that a story is closed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseStory() {
        }

        /**
         * Creates a function, which informs TDLib that a story is closed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storySenderChatId The identifier of the sender of the story to close.
         * @param storyId The identifier of the story.
         */
        public CloseStory(long storySenderChatId, int storyId) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1144852309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a previously opened Web App was closed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseWebApp extends Function<Ok> {
        /**
         * Identifier of Web App launch, received from openWebApp.
         */
        public long webAppLaunchId;

        /**
         * Default constructor for a function, which informs TDLib that a previously opened Web App was closed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseWebApp() {
        }

        /**
         * Creates a function, which informs TDLib that a previously opened Web App was closed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param webAppLaunchId Identifier of Web App launch, received from openWebApp.
         */
        public CloseWebApp(long webAppLaunchId) {
            this.webAppLaunchId = webAppLaunchId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1755391174;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Confirms QR code authentication on another device. Returns created session on success.
     *
     * <p> Returns {@link Session Session} </p>
     */
    public static class ConfirmQrCodeAuthentication extends Function<Session> {
        /**
         * A link from a QR code. The link must be scanned by the in-app camera.
         */
        public String link;

        /**
         * Default constructor for a function, which confirms QR code authentication on another device. Returns created session on success.
         *
         * <p> Returns {@link Session Session} </p>
         */
        public ConfirmQrCodeAuthentication() {
        }

        /**
         * Creates a function, which confirms QR code authentication on another device. Returns created session on success.
         *
         * <p> Returns {@link Session Session} </p>
         *
         * @param link A link from a QR code. The link must be scanned by the in-app camera.
         */
        public ConfirmQrCodeAuthentication(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -376199379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Confirms an unconfirmed session of the current user from another device.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ConfirmSession extends Function<Ok> {
        /**
         * Session identifier.
         */
        public long sessionId;

        /**
         * Default constructor for a function, which confirms an unconfirmed session of the current user from another device.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ConfirmSession() {
        }

        /**
         * Creates a function, which confirms an unconfirmed session of the current user from another device.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sessionId Session identifier.
         */
        public ConfirmSession(long sessionId) {
            this.sessionId = sessionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -674647009;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an existing chat corresponding to a known basic group.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateBasicGroupChat extends Function<Chat> {
        /**
         * Basic group identifier.
         */
        public long basicGroupId;
        /**
         * Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public boolean force;

        /**
         * Default constructor for a function, which returns an existing chat corresponding to a known basic group.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateBasicGroupChat() {
        }

        /**
         * Creates a function, which returns an existing chat corresponding to a known basic group.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param basicGroupId Basic group identifier.
         * @param force Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public CreateBasicGroupChat(long basicGroupId, boolean force) {
            this.basicGroupId = basicGroupId;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1972024548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a business chat link for the current account. Requires Telegram Business subscription. There can be up to getOption(&quot;business_chat_link_count_max&quot;) links created. Returns the created link.
     *
     * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
     */
    public static class CreateBusinessChatLink extends Function<BusinessChatLink> {
        /**
         * Information about the link to create.
         */
        public InputBusinessChatLink linkInfo;

        /**
         * Default constructor for a function, which creates a business chat link for the current account. Requires Telegram Business subscription. There can be up to getOption(&quot;business_chat_link_count_max&quot;) links created. Returns the created link.
         *
         * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
         */
        public CreateBusinessChatLink() {
        }

        /**
         * Creates a function, which creates a business chat link for the current account. Requires Telegram Business subscription. There can be up to getOption(&quot;business_chat_link_count_max&quot;) links created. Returns the created link.
         *
         * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
         *
         * @param linkInfo Information about the link to create.
         */
        public CreateBusinessChatLink(InputBusinessChatLink linkInfo) {
            this.linkInfo = linkInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1861018304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new call.
     *
     * <p> Returns {@link CallId CallId} </p>
     */
    public static class CreateCall extends Function<CallId> {
        /**
         * Identifier of the user to be called.
         */
        public long userId;
        /**
         * The call protocols supported by the application.
         */
        public CallProtocol protocol;
        /**
         * Pass true to create a video call.
         */
        public boolean isVideo;

        /**
         * Default constructor for a function, which creates a new call.
         *
         * <p> Returns {@link CallId CallId} </p>
         */
        public CreateCall() {
        }

        /**
         * Creates a function, which creates a new call.
         *
         * <p> Returns {@link CallId CallId} </p>
         *
         * @param userId Identifier of the user to be called.
         * @param protocol The call protocols supported by the application.
         * @param isVideo Pass true to create a video call.
         */
        public CreateCall(long userId, CallProtocol protocol, boolean isVideo) {
            this.userId = userId;
            this.protocol = protocol;
            this.isVideo = isVideo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1104663024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates new chat folder. Returns information about the created chat folder. There can be up to getOption(&quot;chat_folder_count_max&quot;) chat folders, but the limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
     */
    public static class CreateChatFolder extends Function<ChatFolderInfo> {
        /**
         * The new chat folder.
         */
        public ChatFolder folder;

        /**
         * Default constructor for a function, which creates new chat folder. Returns information about the created chat folder. There can be up to getOption(&quot;chat_folder_count_max&quot;) chat folders, but the limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
         */
        public CreateChatFolder() {
        }

        /**
         * Creates a function, which creates new chat folder. Returns information about the created chat folder. There can be up to getOption(&quot;chat_folder_count_max&quot;) chat folders, but the limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
         *
         * @param folder The new chat folder.
         */
        public CreateChatFolder(ChatFolder folder) {
            this.folder = folder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1015399680;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new invite link for a chat folder. A link can be created for a chat folder if it has only pinned and included chats.
     *
     * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
     */
    public static class CreateChatFolderInviteLink extends Function<ChatFolderInviteLink> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Name of the link; 0-32 characters.
         */
        public String name;
        /**
         * Identifiers of chats to be accessible by the invite link. Use getChatsForChatFolderInviteLink to get suitable chats. Basic groups will be automatically converted to supergroups before link creation.
         */
        public long[] chatIds;

        /**
         * Default constructor for a function, which creates a new invite link for a chat folder. A link can be created for a chat folder if it has only pinned and included chats.
         *
         * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
         */
        public CreateChatFolderInviteLink() {
        }

        /**
         * Creates a function, which creates a new invite link for a chat folder. A link can be created for a chat folder if it has only pinned and included chats.
         *
         * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param name Name of the link; 0-32 characters.
         * @param chatIds Identifiers of chats to be accessible by the invite link. Use getChatsForChatFolderInviteLink to get suitable chats. Basic groups will be automatically converted to supergroups before link creation.
         */
        public CreateChatFolderInviteLink(int chatFolderId, String name, long[] chatIds) {
            this.chatFolderId = chatFolderId;
            this.name = name;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2037911099;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class CreateChatInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link name; 0-32 characters.
         */
        public String name;
        /**
         * Point in time (Unix timestamp) when the link will expire; pass 0 if never.
         */
        public int expirationDate;
        /**
         * The maximum number of chat members that can join the chat via the link simultaneously; 0-99999; pass 0 if not limited.
         */
        public int memberLimit;
        /**
         * Pass true if users joining the chat via the link need to be approved by chat administrators. In this case, memberLimit must be 0.
         */
        public boolean createsJoinRequest;

        /**
         * Default constructor for a function, which creates a new invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public CreateChatInviteLink() {
        }

        /**
         * Creates a function, which creates a new invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         * @param name Invite link name; 0-32 characters.
         * @param expirationDate Point in time (Unix timestamp) when the link will expire; pass 0 if never.
         * @param memberLimit The maximum number of chat members that can join the chat via the link simultaneously; 0-99999; pass 0 if not limited.
         * @param createsJoinRequest Pass true if users joining the chat via the link need to be approved by chat administrators. In this case, memberLimit must be 0.
         */
        public CreateChatInviteLink(long chatId, String name, int expirationDate, int memberLimit, boolean createsJoinRequest) {
            this.chatId = chatId;
            this.name = name;
            this.expirationDate = expirationDate;
            this.memberLimit = memberLimit;
            this.createsJoinRequest = createsJoinRequest;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 287744833;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a topic in a forum supergroup chat; requires canManageTopics administrator or canCreateTopics member right in the supergroup.
     *
     * <p> Returns {@link ForumTopicInfo ForumTopicInfo} </p>
     */
    public static class CreateForumTopic extends Function<ForumTopicInfo> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Name of the topic; 1-128 characters.
         */
        public String name;
        /**
         * Icon of the topic. Icon color must be one of 0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, or 0xFB6F5F. Telegram Premium users can use any custom emoji as topic icon, other users can use only a custom emoji returned by getForumTopicDefaultIcons.
         */
        public ForumTopicIcon icon;

        /**
         * Default constructor for a function, which creates a topic in a forum supergroup chat; requires canManageTopics administrator or canCreateTopics member right in the supergroup.
         *
         * <p> Returns {@link ForumTopicInfo ForumTopicInfo} </p>
         */
        public CreateForumTopic() {
        }

        /**
         * Creates a function, which creates a topic in a forum supergroup chat; requires canManageTopics administrator or canCreateTopics member right in the supergroup.
         *
         * <p> Returns {@link ForumTopicInfo ForumTopicInfo} </p>
         *
         * @param chatId Identifier of the chat.
         * @param name Name of the topic; 1-128 characters.
         * @param icon Icon of the topic. Icon color must be one of 0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, or 0xFB6F5F. Telegram Premium users can use any custom emoji as topic icon, other users can use only a custom emoji returned by getForumTopicDefaultIcons.
         */
        public CreateForumTopic(long chatId, String name, ForumTopicIcon icon) {
            this.chatId = chatId;
            this.name = name;
            this.icon = icon;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1040570140;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a link for the given invoice; for bots only.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class CreateInvoiceLink extends Function<HttpUrl> {
        /**
         * Information about the invoice of the type inputMessageInvoice.
         */
        public InputMessageContent invoice;

        /**
         * Default constructor for a function, which creates a link for the given invoice; for bots only.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public CreateInvoiceLink() {
        }

        /**
         * Creates a function, which creates a link for the given invoice; for bots only.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param invoice Information about the invoice of the type inputMessageInvoice.
         */
        public CreateInvoiceLink(InputMessageContent invoice) {
            this.invoice = invoice;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 216787233;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns information about the newly created chat.
     *
     * <p> Returns {@link CreatedBasicGroupChat CreatedBasicGroupChat} </p>
     */
    public static class CreateNewBasicGroupChat extends Function<CreatedBasicGroupChat> {
        /**
         * Identifiers of users to be added to the basic group; may be empty to create a basic group without other members.
         */
        public long[] userIds;
        /**
         * Title of the new basic group; 1-128 characters.
         */
        public String title;
        /**
         * Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public int messageAutoDeleteTime;

        /**
         * Default constructor for a function, which creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns information about the newly created chat.
         *
         * <p> Returns {@link CreatedBasicGroupChat CreatedBasicGroupChat} </p>
         */
        public CreateNewBasicGroupChat() {
        }

        /**
         * Creates a function, which creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns information about the newly created chat.
         *
         * <p> Returns {@link CreatedBasicGroupChat CreatedBasicGroupChat} </p>
         *
         * @param userIds Identifiers of users to be added to the basic group; may be empty to create a basic group without other members.
         * @param title Title of the new basic group; 1-128 characters.
         * @param messageAutoDeleteTime Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public CreateNewBasicGroupChat(long[] userIds, String title, int messageAutoDeleteTime) {
            this.userIds = userIds;
            this.title = title;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1806454709;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new secret chat. Returns the newly created chat.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateNewSecretChat extends Function<Chat> {
        /**
         * Identifier of the target user.
         */
        public long userId;

        /**
         * Default constructor for a function, which creates a new secret chat. Returns the newly created chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateNewSecretChat() {
        }

        /**
         * Creates a function, which creates a new secret chat. Returns the newly created chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param userId Identifier of the target user.
         */
        public CreateNewSecretChat(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -620682651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new sticker set. Returns the newly created sticker set.
     *
     * <p> Returns {@link StickerSet StickerSet} </p>
     */
    public static class CreateNewStickerSet extends Function<StickerSet> {
        /**
         * Sticker set owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker set title; 1-64 characters.
         */
        public String title;
        /**
         * Sticker set name. Can contain only English letters, digits and underscores. Must end with *&quot;_by_&lt;bot username&gt;&quot;* (*&lt;botUsername&gt;* is case insensitive) for bots; 0-64 characters. If empty, then the name returned by getSuggestedStickerSetName will be used automatically.
         */
        public String name;
        /**
         * Type of the stickers in the set.
         */
        public StickerType stickerType;
        /**
         * Pass true if stickers in the sticker set must be repainted; for custom emoji sticker sets only.
         */
        public boolean needsRepainting;
        /**
         * List of stickers to be added to the set; 1-200 stickers for custom emoji sticker sets, and 1-120 stickers otherwise. For TGS stickers, uploadStickerFile must be used before the sticker is shown.
         */
        public InputSticker[] stickers;
        /**
         * Source of the sticker set; may be empty if unknown.
         */
        public String source;

        /**
         * Default constructor for a function, which creates a new sticker set. Returns the newly created sticker set.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         */
        public CreateNewStickerSet() {
        }

        /**
         * Creates a function, which creates a new sticker set. Returns the newly created sticker set.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         *
         * @param userId Sticker set owner; ignored for regular users.
         * @param title Sticker set title; 1-64 characters.
         * @param name Sticker set name. Can contain only English letters, digits and underscores. Must end with *&quot;_by_&lt;bot username&gt;&quot;* (*&lt;botUsername&gt;* is case insensitive) for bots; 0-64 characters. If empty, then the name returned by getSuggestedStickerSetName will be used automatically.
         * @param stickerType Type of the stickers in the set.
         * @param needsRepainting Pass true if stickers in the sticker set must be repainted; for custom emoji sticker sets only.
         * @param stickers List of stickers to be added to the set; 1-200 stickers for custom emoji sticker sets, and 1-120 stickers otherwise. For TGS stickers, uploadStickerFile must be used before the sticker is shown.
         * @param source Source of the sticker set; may be empty if unknown.
         */
        public CreateNewStickerSet(long userId, String title, String name, StickerType stickerType, boolean needsRepainting, InputSticker[] stickers, String source) {
            this.userId = userId;
            this.title = title;
            this.name = name;
            this.stickerType = stickerType;
            this.needsRepainting = needsRepainting;
            this.stickers = stickers;
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -481065727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateNewSupergroupChat extends Function<Chat> {
        /**
         * Title of the new chat; 1-128 characters.
         */
        public String title;
        /**
         * Pass true to create a forum supergroup chat.
         */
        public boolean isForum;
        /**
         * Pass true to create a channel chat; ignored if a forum is created.
         */
        public boolean isChannel;
        /**
         * Chat description; 0-255 characters.
         */
        public String description;
        /**
         * Chat location if a location-based supergroup is being created; pass null to create an ordinary supergroup chat.
         */
        public ChatLocation location;
        /**
         * Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public int messageAutoDeleteTime;
        /**
         * Pass true to create a supergroup for importing messages using importMessages.
         */
        public boolean forImport;

        /**
         * Default constructor for a function, which creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateNewSupergroupChat() {
        }

        /**
         * Creates a function, which creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param title Title of the new chat; 1-128 characters.
         * @param isForum Pass true to create a forum supergroup chat.
         * @param isChannel Pass true to create a channel chat; ignored if a forum is created.
         * @param description Chat description; 0-255 characters.
         * @param location Chat location if a location-based supergroup is being created; pass null to create an ordinary supergroup chat.
         * @param messageAutoDeleteTime Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         * @param forImport Pass true to create a supergroup for importing messages using importMessages.
         */
        public CreateNewSupergroupChat(String title, boolean isForum, boolean isChannel, String description, ChatLocation location, int messageAutoDeleteTime, boolean forImport) {
            this.title = title;
            this.isForum = isForum;
            this.isChannel = isChannel;
            this.description = description;
            this.location = location;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
            this.forImport = forImport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 804058822;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an existing chat corresponding to a given user.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreatePrivateChat extends Function<Chat> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public boolean force;

        /**
         * Default constructor for a function, which returns an existing chat corresponding to a given user.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreatePrivateChat() {
        }

        /**
         * Creates a function, which returns an existing chat corresponding to a given user.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param userId User identifier.
         * @param force Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public CreatePrivateChat(long userId, boolean force) {
            this.userId = userId;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -947758327;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an existing chat corresponding to a known secret chat.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateSecretChat extends Function<Chat> {
        /**
         * Secret chat identifier.
         */
        public int secretChatId;

        /**
         * Default constructor for a function, which returns an existing chat corresponding to a known secret chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateSecretChat() {
        }

        /**
         * Creates a function, which returns an existing chat corresponding to a known secret chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param secretChatId Secret chat identifier.
         */
        public CreateSecretChat(int secretChatId) {
            this.secretChatId = secretChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1930285615;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an existing chat corresponding to a known supergroup or channel.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateSupergroupChat extends Function<Chat> {
        /**
         * Supergroup or channel identifier.
         */
        public long supergroupId;
        /**
         * Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public boolean force;

        /**
         * Default constructor for a function, which returns an existing chat corresponding to a known supergroup or channel.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateSupergroupChat() {
        }

        /**
         * Creates a function, which returns an existing chat corresponding to a known supergroup or channel.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param supergroupId Supergroup or channel identifier.
         * @param force Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public CreateSupergroupChat(long supergroupId, boolean force) {
            this.supergroupId = supergroupId;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1187475691;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new temporary password for processing payments.
     *
     * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
     */
    public static class CreateTemporaryPassword extends Function<TemporaryPasswordState> {
        /**
         * The 2-step verification password of the current user.
         */
        public String password;
        /**
         * Time during which the temporary password will be valid, in seconds; must be between 60 and 86400.
         */
        public int validFor;

        /**
         * Default constructor for a function, which creates a new temporary password for processing payments.
         *
         * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
         */
        public CreateTemporaryPassword() {
        }

        /**
         * Creates a function, which creates a new temporary password for processing payments.
         *
         * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
         *
         * @param password The 2-step verification password of the current user.
         * @param validFor Time during which the temporary password will be valid, in seconds; must be between 60 and 86400.
         */
        public CreateTemporaryPassword(String password, int validFor) {
            this.password = password;
            this.validFor = validFor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1626509434;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a video chat (a group call bound to a chat). Available only for basic groups, supergroups and channels; requires canManageVideoChats administrator right.
     *
     * <p> Returns {@link GroupCallId GroupCallId} </p>
     */
    public static class CreateVideoChat extends Function<GroupCallId> {
        /**
         * Identifier of a chat in which the video chat will be created.
         */
        public long chatId;
        /**
         * Group call title; if empty, chat title will be used.
         */
        public String title;
        /**
         * Point in time (Unix timestamp) when the group call is supposed to be started by an administrator; 0 to start the video chat immediately. The date must be at least 10 seconds and at most 8 days in the future.
         */
        public int startDate;
        /**
         * Pass true to create an RTMP stream instead of an ordinary video chat; requires owner privileges.
         */
        public boolean isRtmpStream;

        /**
         * Default constructor for a function, which creates a video chat (a group call bound to a chat). Available only for basic groups, supergroups and channels; requires canManageVideoChats administrator right.
         *
         * <p> Returns {@link GroupCallId GroupCallId} </p>
         */
        public CreateVideoChat() {
        }

        /**
         * Creates a function, which creates a video chat (a group call bound to a chat). Available only for basic groups, supergroups and channels; requires canManageVideoChats administrator right.
         *
         * <p> Returns {@link GroupCallId GroupCallId} </p>
         *
         * @param chatId Identifier of a chat in which the video chat will be created.
         * @param title Group call title; if empty, chat title will be used.
         * @param startDate Point in time (Unix timestamp) when the group call is supposed to be started by an administrator; 0 to start the video chat immediately. The date must be at least 10 seconds and at most 8 days in the future.
         * @param isRtmpStream Pass true to create an RTMP stream instead of an ordinary video chat; requires owner privileges.
         */
        public CreateVideoChat(long chatId, String title, int startDate, boolean isRtmpStream) {
            this.chatId = chatId;
            this.title = title;
            this.startDate = startDate;
            this.isRtmpStream = isRtmpStream;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2124715405;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account. Can be called before authorization when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteAccount extends Function<Ok> {
        /**
         * The reason why the account was deleted; optional.
         */
        public String reason;
        /**
         * The 2-step verification password of the current user. If the current user isn't authorized, then an empty string can be passed and account deletion can be canceled within one week.
         */
        public String password;

        /**
         * Default constructor for a function, which deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account. Can be called before authorization when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteAccount() {
        }

        /**
         * Creates a function, which deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account. Can be called before authorization when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param reason The reason why the account was deleted; optional.
         * @param password The 2-step verification password of the current user. If the current user isn't authorized, then an empty string can be passed and account deletion can be canceled within one week.
         */
        public DeleteAccount(String reason, String password) {
            this.reason = reason;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395816134;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all call messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteAllCallMessages extends Function<Ok> {
        /**
         * Pass true to delete the messages for all users.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which deletes all call messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteAllCallMessages() {
        }

        /**
         * Creates a function, which deletes all call messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param revoke Pass true to delete the messages for all users.
         */
        public DeleteAllCallMessages(boolean revoke) {
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1466445325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all revoked chat invite links created by a given chat administrator. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteAllRevokedChatInviteLinks extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * User identifier of a chat administrator, which links will be deleted. Must be an identifier of the current user for non-owner.
         */
        public long creatorUserId;

        /**
         * Default constructor for a function, which deletes all revoked chat invite links created by a given chat administrator. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteAllRevokedChatInviteLinks() {
        }

        /**
         * Creates a function, which deletes all revoked chat invite links created by a given chat administrator. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param creatorUserId User identifier of a chat administrator, which links will be deleted. Must be an identifier of the current user for non-owner.
         */
        public DeleteAllRevokedChatInviteLinks(long chatId, long creatorUserId) {
            this.chatId = chatId;
            this.creatorUserId = creatorUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1112020698;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a business chat link of the current account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteBusinessChatLink extends Function<Ok> {
        /**
         * The link to delete.
         */
        public String link;

        /**
         * Default constructor for a function, which deletes a business chat link of the current account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteBusinessChatLink() {
        }

        /**
         * Creates a function, which deletes a business chat link of the current account.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param link The link to delete.
         */
        public DeleteBusinessChatLink(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1101895865;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes the business bot that is connected to the current user account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteBusinessConnectedBot extends Function<Ok> {
        /**
         * Unique user identifier for the bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which deletes the business bot that is connected to the current user account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteBusinessConnectedBot() {
        }

        /**
         * Creates a function, which deletes the business bot that is connected to the current user account.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Unique user identifier for the bot.
         */
        public DeleteBusinessConnectedBot(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1633976747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a chat along with all messages in the corresponding chat for all chat members. For group chats this will release the usernames and remove all members. Use the field chat.canBeDeletedForAllUsers to find whether the method can be applied to the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which deletes a chat along with all messages in the corresponding chat for all chat members. For group chats this will release the usernames and remove all members. Use the field chat.canBeDeletedForAllUsers to find whether the method can be applied to the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChat() {
        }

        /**
         * Creates a function, which deletes a chat along with all messages in the corresponding chat for all chat members. For group chats this will release the usernames and remove all members. Use the field chat.canBeDeletedForAllUsers to find whether the method can be applied to the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public DeleteChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -171253666;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes background in a specific chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatBackground extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true to restore previously set background. Can be used only in private and secret chats with non-deleted users if userFullInfo.setChatBackground == true. Supposed to be used from messageChatSetBackground messages with the currently set background that was set for both sides by the other user.
         */
        public boolean restorePrevious;

        /**
         * Default constructor for a function, which deletes background in a specific chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatBackground() {
        }

        /**
         * Creates a function, which deletes background in a specific chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param restorePrevious Pass true to restore previously set background. Can be used only in private and secret chats with non-deleted users if userFullInfo.setChatBackground == true. Supposed to be used from messageChatSetBackground messages with the currently set background that was set for both sides by the other user.
         */
        public DeleteChatBackground(long chatId, boolean restorePrevious) {
            this.chatId = chatId;
            this.restorePrevious = restorePrevious;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 320267896;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes existing chat folder.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatFolder extends Function<Ok> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Identifiers of the chats to leave. The chats must be pinned or always included in the folder.
         */
        public long[] leaveChatIds;

        /**
         * Default constructor for a function, which deletes existing chat folder.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatFolder() {
        }

        /**
         * Creates a function, which deletes existing chat folder.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param leaveChatIds Identifiers of the chats to leave. The chats must be pinned or always included in the folder.
         */
        public DeleteChatFolder(int chatFolderId, long[] leaveChatIds) {
            this.chatFolderId = chatFolderId;
            this.leaveChatIds = leaveChatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1956364551;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes an invite link for a chat folder.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatFolderInviteLink extends Function<Ok> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Invite link to be deleted.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which deletes an invite link for a chat folder.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatFolderInviteLink() {
        }

        /**
         * Creates a function, which deletes an invite link for a chat folder.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param inviteLink Invite link to be deleted.
         */
        public DeleteChatFolderInviteLink(int chatFolderId, String inviteLink) {
            this.chatFolderId = chatFolderId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -930057858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages in the chat. Use chat.canBeDeletedOnlyForSelf and chat.canBeDeletedForAllUsers fields to find whether and how the method can be applied to the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatHistory extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true to remove the chat from all chat lists.
         */
        public boolean removeFromChatList;
        /**
         * Pass true to delete chat history for all users.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which deletes all messages in the chat. Use chat.canBeDeletedOnlyForSelf and chat.canBeDeletedForAllUsers fields to find whether and how the method can be applied to the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatHistory() {
        }

        /**
         * Creates a function, which deletes all messages in the chat. Use chat.canBeDeletedOnlyForSelf and chat.canBeDeletedForAllUsers fields to find whether and how the method can be applied to the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param removeFromChatList Pass true to remove the chat from all chat lists.
         * @param revoke Pass true to delete chat history for all users.
         */
        public DeleteChatHistory(long chatId, boolean removeFromChatList, boolean revoke) {
            this.chatId = chatId;
            this.removeFromChatList = removeFromChatList;
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1472081761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages between the specified dates in a chat. Supported only for private chats and basic groups. Messages sent in the last 30 seconds will not be deleted.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatMessagesByDate extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The minimum date of the messages to delete.
         */
        public int minDate;
        /**
         * The maximum date of the messages to delete.
         */
        public int maxDate;
        /**
         * Pass true to delete chat messages for all users; private chats only.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which deletes all messages between the specified dates in a chat. Supported only for private chats and basic groups. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatMessagesByDate() {
        }

        /**
         * Creates a function, which deletes all messages between the specified dates in a chat. Supported only for private chats and basic groups. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param minDate The minimum date of the messages to delete.
         * @param maxDate The maximum date of the messages to delete.
         * @param revoke Pass true to delete chat messages for all users; private chats only.
         */
        public DeleteChatMessagesByDate(long chatId, int minDate, int maxDate, boolean revoke) {
            this.chatId = chatId;
            this.minDate = minDate;
            this.maxDate = maxDate;
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1639653185;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages sent by the specified message sender in a chat. Supported only for supergroups; requires canDeleteMessages administrator privileges.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatMessagesBySender extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the sender of messages to delete.
         */
        public MessageSender senderId;

        /**
         * Default constructor for a function, which deletes all messages sent by the specified message sender in a chat. Supported only for supergroups; requires canDeleteMessages administrator privileges.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatMessagesBySender() {
        }

        /**
         * Creates a function, which deletes all messages sent by the specified message sender in a chat. Supported only for supergroups; requires canDeleteMessages administrator privileges.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param senderId Identifier of the sender of messages to delete.
         */
        public DeleteChatMessagesBySender(long chatId, MessageSender senderId) {
            this.chatId = chatId;
            this.senderId = senderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1164235161;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes the default reply markup from a chat. Must be called after a one-time keyboard or a replyMarkupForceReply reply markup has been used. An updateChatReplyMarkup update will be sent if the reply markup is changed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatReplyMarkup extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The message identifier of the used keyboard.
         */
        public long messageId;

        /**
         * Default constructor for a function, which deletes the default reply markup from a chat. Must be called after a one-time keyboard or a replyMarkupForceReply reply markup has been used. An updateChatReplyMarkup update will be sent if the reply markup is changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatReplyMarkup() {
        }

        /**
         * Creates a function, which deletes the default reply markup from a chat. Must be called after a one-time keyboard or a replyMarkupForceReply reply markup has been used. An updateChatReplyMarkup update will be sent if the reply markup is changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId The message identifier of the used keyboard.
         */
        public DeleteChatReplyMarkup(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 100637531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes commands supported by the bot for the given user scope and language; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteCommands extends Function<Ok> {
        /**
         * The scope to which the commands are relevant; pass null to delete commands in the default bot command scope.
         */
        public BotCommandScope scope;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which deletes commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteCommands() {
        }

        /**
         * Creates a function, which deletes commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param scope The scope to which the commands are relevant; pass null to delete commands in the default bot command scope.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public DeleteCommands(BotCommandScope scope, String languageCode) {
            this.scope = scope;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1002732586;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes default background for chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteDefaultBackground extends Function<Ok> {
        /**
         * Pass true if the background is deleted for a dark theme.
         */
        public boolean forDarkTheme;

        /**
         * Default constructor for a function, which deletes default background for chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteDefaultBackground() {
        }

        /**
         * Creates a function, which deletes default background for chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param forDarkTheme Pass true if the background is deleted for a dark theme.
         */
        public DeleteDefaultBackground(boolean forDarkTheme) {
            this.forDarkTheme = forDarkTheme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1297814210;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a file from the TDLib file cache.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteFile extends Function<Ok> {
        /**
         * Identifier of the file to delete.
         */
        public int fileId;

        /**
         * Default constructor for a function, which deletes a file from the TDLib file cache.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteFile() {
        }

        /**
         * Creates a function, which deletes a file from the TDLib file cache.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the file to delete.
         */
        public DeleteFile(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1807653676;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages in a forum topic; requires canDeleteMessages administrator right in the supergroup unless the user is creator of the topic, the topic has no messages from other users and has at most 11 messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteForumTopic extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Message thread identifier of the forum topic.
         */
        public long messageThreadId;

        /**
         * Default constructor for a function, which deletes all messages in a forum topic; requires canDeleteMessages administrator right in the supergroup unless the user is creator of the topic, the topic has no messages from other users and has at most 11 messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteForumTopic() {
        }

        /**
         * Creates a function, which deletes all messages in a forum topic; requires canDeleteMessages administrator right in the supergroup unless the user is creator of the topic, the topic has no messages from other users and has at most 11 messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageThreadId Message thread identifier of the forum topic.
         */
        public DeleteForumTopic(long chatId, long messageThreadId) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1864916152;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all information about a language pack in the current localization target. The language pack which is currently in use (including base language pack) or is being synchronized can't be deleted. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteLanguagePack extends Function<Ok> {
        /**
         * Identifier of the language pack to delete.
         */
        public String languagePackId;

        /**
         * Default constructor for a function, which deletes all information about a language pack in the current localization target. The language pack which is currently in use (including base language pack) or is being synchronized can't be deleted. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteLanguagePack() {
        }

        /**
         * Creates a function, which deletes all information about a language pack in the current localization target. The language pack which is currently in use (including base language pack) or is being synchronized can't be deleted. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param languagePackId Identifier of the language pack to delete.
         */
        public DeleteLanguagePack(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2108761026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteMessages extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifiers of the messages to be deleted.
         */
        public long[] messageIds;
        /**
         * Pass true to delete messages for all chat members. Always true for supergroups, channels and secret chats.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which deletes messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteMessages() {
        }

        /**
         * Creates a function, which deletes messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageIds Identifiers of the messages to be deleted.
         * @param revoke Pass true to delete messages for all chat members. Always true for supergroups, channels and secret chats.
         */
        public DeleteMessages(long chatId, long[] messageIds, boolean revoke) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1130090173;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a Telegram Passport element.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeletePassportElement extends Function<Ok> {
        /**
         * Element type.
         */
        public PassportElementType type;

        /**
         * Default constructor for a function, which deletes a Telegram Passport element.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeletePassportElement() {
        }

        /**
         * Creates a function, which deletes a Telegram Passport element.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param type Element type.
         */
        public DeletePassportElement(PassportElementType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1719555468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a profile photo.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteProfilePhoto extends Function<Ok> {
        /**
         * Identifier of the profile photo to delete.
         */
        public long profilePhotoId;

        /**
         * Default constructor for a function, which deletes a profile photo.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteProfilePhoto() {
        }

        /**
         * Creates a function, which deletes a profile photo.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param profilePhotoId Identifier of the profile photo to delete.
         */
        public DeleteProfilePhoto(long profilePhotoId) {
            this.profilePhotoId = profilePhotoId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1319794625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a quick reply shortcut.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteQuickReplyShortcut extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut.
         */
        public int shortcutId;

        /**
         * Default constructor for a function, which deletes a quick reply shortcut.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteQuickReplyShortcut() {
        }

        /**
         * Creates a function, which deletes a quick reply shortcut.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut.
         */
        public DeleteQuickReplyShortcut(int shortcutId) {
            this.shortcutId = shortcutId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -246911978;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes specified quick reply messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteQuickReplyShortcutMessages extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut to which the messages belong.
         */
        public int shortcutId;
        /**
         * Unique identifiers of the messages.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which deletes specified quick reply messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteQuickReplyShortcutMessages() {
        }

        /**
         * Creates a function, which deletes specified quick reply messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut to which the messages belong.
         * @param messageIds Unique identifiers of the messages.
         */
        public DeleteQuickReplyShortcutMessages(int shortcutId, long[] messageIds) {
            this.shortcutId = shortcutId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -40522947;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes revoked chat invite links. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteRevokedChatInviteLink extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to revoke.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which deletes revoked chat invite links. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteRevokedChatInviteLink() {
        }

        /**
         * Creates a function, which deletes revoked chat invite links. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to revoke.
         */
        public DeleteRevokedChatInviteLink(long chatId, String inviteLink) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1859711873;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes saved credentials for all payment provider bots.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteSavedCredentials extends Function<Ok> {

        /**
         * Default constructor for a function, which deletes saved credentials for all payment provider bots.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteSavedCredentials() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 826300114;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages in a Saved Messages topic.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteSavedMessagesTopicHistory extends Function<Ok> {
        /**
         * Identifier of Saved Messages topic which messages will be deleted.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which deletes all messages in a Saved Messages topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteSavedMessagesTopicHistory() {
        }

        /**
         * Creates a function, which deletes all messages in a Saved Messages topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which messages will be deleted.
         */
        public DeleteSavedMessagesTopicHistory(long savedMessagesTopicId) {
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1776237930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages between the specified dates in a Saved Messages topic. Messages sent in the last 30 seconds will not be deleted.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteSavedMessagesTopicMessagesByDate extends Function<Ok> {
        /**
         * Identifier of Saved Messages topic which messages will be deleted.
         */
        public long savedMessagesTopicId;
        /**
         * The minimum date of the messages to delete.
         */
        public int minDate;
        /**
         * The maximum date of the messages to delete.
         */
        public int maxDate;

        /**
         * Default constructor for a function, which deletes all messages between the specified dates in a Saved Messages topic. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteSavedMessagesTopicMessagesByDate() {
        }

        /**
         * Creates a function, which deletes all messages between the specified dates in a Saved Messages topic. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which messages will be deleted.
         * @param minDate The minimum date of the messages to delete.
         * @param maxDate The maximum date of the messages to delete.
         */
        public DeleteSavedMessagesTopicMessagesByDate(long savedMessagesTopicId, int minDate, int maxDate) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.minDate = minDate;
            this.maxDate = maxDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1444389;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes saved order information.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteSavedOrderInfo extends Function<Ok> {

        /**
         * Default constructor for a function, which deletes saved order information.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteSavedOrderInfo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1629058164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Completely deletes a sticker set.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteStickerSet extends Function<Ok> {
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;

        /**
         * Default constructor for a function, which completely deletes a sticker set.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteStickerSet() {
        }

        /**
         * Creates a function, which completely deletes a sticker set.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Sticker set name. The sticker set must be owned by the current user.
         */
        public DeleteStickerSet(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1577745325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a previously sent story. Can be called only if story.canBeDeleted == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteStory extends Function<Ok> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storySenderChatId;
        /**
         * Identifier of the story to delete.
         */
        public int storyId;

        /**
         * Default constructor for a function, which deletes a previously sent story. Can be called only if story.canBeDeleted == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteStory() {
        }

        /**
         * Creates a function, which deletes a previously sent story. Can be called only if story.canBeDeleted == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storySenderChatId Identifier of the chat that posted the story.
         * @param storyId Identifier of the story to delete.
         */
        public DeleteStory(long storySenderChatId, int storyId) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1623871722;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Closes the TDLib instance, destroying all local data without a proper logout. The current user session will remain in the list of all active sessions. All local data will be destroyed. After the destruction completes updateAuthorizationState with authorizationStateClosed will be sent. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class Destroy extends Function<Ok> {

        /**
         * Default constructor for a function, which closes the TDLib instance, destroying all local data without a proper logout. The current user session will remain in the list of all active sessions. All local data will be destroyed. After the destruction completes updateAuthorizationState with authorizationStateClosed will be sent. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public Destroy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 685331274;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disables all active non-editable usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DisableAllSupergroupUsernames extends Function<Ok> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;

        /**
         * Default constructor for a function, which disables all active non-editable usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DisableAllSupergroupUsernames() {
        }

        /**
         * Creates a function, which disables all active non-editable usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         */
        public DisableAllSupergroupUsernames(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 843511216;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disables the currently enabled proxy. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DisableProxy extends Function<Ok> {

        /**
         * Default constructor for a function, which disables the currently enabled proxy. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DisableProxy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2100095102;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Discards a call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DiscardCall extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * Pass true if the user was disconnected.
         */
        public boolean isDisconnected;
        /**
         * The call duration, in seconds.
         */
        public int duration;
        /**
         * Pass true if the call was a video call.
         */
        public boolean isVideo;
        /**
         * Identifier of the connection used during the call.
         */
        public long connectionId;

        /**
         * Default constructor for a function, which discards a call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DiscardCall() {
        }

        /**
         * Creates a function, which discards a call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param isDisconnected Pass true if the user was disconnected.
         * @param duration The call duration, in seconds.
         * @param isVideo Pass true if the call was a video call.
         * @param connectionId Identifier of the connection used during the call.
         */
        public DiscardCall(int callId, boolean isDisconnected, int duration, boolean isVideo, long connectionId) {
            this.callId = callId;
            this.isDisconnected = isDisconnected;
            this.duration = duration;
            this.isVideo = isVideo;
            this.connectionId = connectionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1784044162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disconnects all websites from the current user's Telegram account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DisconnectAllWebsites extends Function<Ok> {

        /**
         * Default constructor for a function, which disconnects all websites from the current user's Telegram account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DisconnectAllWebsites() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1082985981;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disconnects website from the current user's Telegram account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DisconnectWebsite extends Function<Ok> {
        /**
         * Website identifier.
         */
        public long websiteId;

        /**
         * Default constructor for a function, which disconnects website from the current user's Telegram account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DisconnectWebsite() {
        }

        /**
         * Creates a function, which disconnects website from the current user's Telegram account.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param websiteId Website identifier.
         */
        public DisconnectWebsite(long websiteId) {
            this.websiteId = websiteId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -778767395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Downloads a file from the cloud. Download progress and completion of the download will be notified through updateFile updates.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class DownloadFile extends Function<File> {
        /**
         * Identifier of the file to download.
         */
        public int fileId;
        /**
         * Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first.
         */
        public int priority;
        /**
         * The starting position from which the file needs to be downloaded.
         */
        public long offset;
        /**
         * Number of bytes which need to be downloaded starting from the &quot;offset&quot; position before the download will automatically be canceled; use 0 to download without a limit.
         */
        public long limit;
        /**
         * Pass true to return response only after the file download has succeeded, has failed, has been canceled, or a new downloadFile request with different offset/limit parameters was sent; pass false to return file state immediately, just after the download has been started.
         */
        public boolean synchronous;

        /**
         * Default constructor for a function, which downloads a file from the cloud. Download progress and completion of the download will be notified through updateFile updates.
         *
         * <p> Returns {@link File File} </p>
         */
        public DownloadFile() {
        }

        /**
         * Creates a function, which downloads a file from the cloud. Download progress and completion of the download will be notified through updateFile updates.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param fileId Identifier of the file to download.
         * @param priority Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first.
         * @param offset The starting position from which the file needs to be downloaded.
         * @param limit Number of bytes which need to be downloaded starting from the &quot;offset&quot; position before the download will automatically be canceled; use 0 to download without a limit.
         * @param synchronous Pass true to return response only after the file download has succeeded, has failed, has been canceled, or a new downloadFile request with different offset/limit parameters was sent; pass false to return file state immediately, just after the download has been started.
         */
        public DownloadFile(int fileId, int priority, long offset, long limit, boolean synchronous) {
            this.fileId = fileId;
            this.priority = priority;
            this.offset = offset;
            this.limit = limit;
            this.synchronous = synchronous;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1059402292;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits a business chat link of the current account. Requires Telegram Business subscription. Returns the edited link.
     *
     * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
     */
    public static class EditBusinessChatLink extends Function<BusinessChatLink> {
        /**
         * The link to edit.
         */
        public String link;
        /**
         * New description of the link.
         */
        public InputBusinessChatLink linkInfo;

        /**
         * Default constructor for a function, which edits a business chat link of the current account. Requires Telegram Business subscription. Returns the edited link.
         *
         * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
         */
        public EditBusinessChatLink() {
        }

        /**
         * Creates a function, which edits a business chat link of the current account. Requires Telegram Business subscription. Returns the edited link.
         *
         * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
         *
         * @param link The link to edit.
         * @param linkInfo New description of the link.
         */
        public EditBusinessChatLink(String link, InputBusinessChatLink linkInfo) {
            this.link = link;
            this.linkInfo = linkInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1594947110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the caption of a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageCaption extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New message content caption; pass null to remove caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * Pass true to show the caption above the media; otherwise, the caption will be shown below the media. Can be true only for animation, photo, and video messages.
         */
        public boolean showCaptionAboveMedia;

        /**
         * Default constructor for a function, which edits the caption of a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageCaption() {
        }

        /**
         * Creates a function, which edits the caption of a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param caption New message content caption; pass null to remove caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia Pass true to show the caption above the media; otherwise, the caption will be shown below the media. Can be true only for animation, photo, and video messages.
         */
        public EditBusinessMessageCaption(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, FormattedText caption, boolean showCaptionAboveMedia) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1071562045;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the content of a live location in a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageLiveLocation extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New location content of the message; pass null to stop sharing the live location.
         */
        public Location location;
        /**
         * New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         */
        public int livePeriod;
        /**
         * The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         */
        public int heading;
        /**
         * The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public int proximityAlertRadius;

        /**
         * Default constructor for a function, which edits the content of a live location in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageLiveLocation() {
        }

        /**
         * Creates a function, which edits the content of a live location in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param location New location content of the message; pass null to stop sharing the live location.
         * @param livePeriod New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         * @param heading The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         * @param proximityAlertRadius The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public EditBusinessMessageLiveLocation(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, Location location, int livePeriod, int heading, int proximityAlertRadius) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.location = location;
            this.livePeriod = livePeriod;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 494972447;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the content of a message with an animation, an audio, a document, a photo or a video in a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageMedia extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the content of a message with an animation, an audio, a document, a photo or a video in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageMedia() {
        }

        /**
         * Creates a function, which edits the content of a message with an animation, an audio, a document, a photo or a video in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param inputMessageContent New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public EditBusinessMessageMedia(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -60733576;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the reply markup of a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageReplyMarkup extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which edits the reply markup of a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageReplyMarkup() {
        }

        /**
         * Creates a function, which edits the reply markup of a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         */
        public EditBusinessMessageReplyMarkup(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 701787159;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the text of a text or game message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageText extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New text content of the message. Must be of type inputMessageText.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the text of a text or game message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageText() {
        }

        /**
         * Creates a function, which edits the text of a text or game message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param inputMessageContent New text content of the message. Must be of type inputMessageText.
         */
        public EditBusinessMessageText(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1149169252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits existing chat folder. Returns information about the edited chat folder.
     *
     * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
     */
    public static class EditChatFolder extends Function<ChatFolderInfo> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * The edited chat folder.
         */
        public ChatFolder folder;

        /**
         * Default constructor for a function, which edits existing chat folder. Returns information about the edited chat folder.
         *
         * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
         */
        public EditChatFolder() {
        }

        /**
         * Creates a function, which edits existing chat folder. Returns information about the edited chat folder.
         *
         * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param folder The edited chat folder.
         */
        public EditChatFolder(int chatFolderId, ChatFolder folder) {
            this.chatFolderId = chatFolderId;
            this.folder = folder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 53672754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits an invite link for a chat folder.
     *
     * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
     */
    public static class EditChatFolderInviteLink extends Function<ChatFolderInviteLink> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Invite link to be edited.
         */
        public String inviteLink;
        /**
         * New name of the link; 0-32 characters.
         */
        public String name;
        /**
         * New identifiers of chats to be accessible by the invite link. Use getChatsForChatFolderInviteLink to get suitable chats. Basic groups will be automatically converted to supergroups before link editing.
         */
        public long[] chatIds;

        /**
         * Default constructor for a function, which edits an invite link for a chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
         */
        public EditChatFolderInviteLink() {
        }

        /**
         * Creates a function, which edits an invite link for a chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param inviteLink Invite link to be edited.
         * @param name New name of the link; 0-32 characters.
         * @param chatIds New identifiers of chats to be accessible by the invite link. Use getChatsForChatFolderInviteLink to get suitable chats. Basic groups will be automatically converted to supergroups before link editing.
         */
        public EditChatFolderInviteLink(int chatFolderId, String inviteLink, String name, long[] chatIds) {
            this.chatFolderId = chatFolderId;
            this.inviteLink = inviteLink;
            this.name = name;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2141872095;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits a non-primary invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class EditChatInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to be edited.
         */
        public String inviteLink;
        /**
         * Invite link name; 0-32 characters.
         */
        public String name;
        /**
         * Point in time (Unix timestamp) when the link will expire; pass 0 if never.
         */
        public int expirationDate;
        /**
         * The maximum number of chat members that can join the chat via the link simultaneously; 0-99999; pass 0 if not limited.
         */
        public int memberLimit;
        /**
         * Pass true if users joining the chat via the link need to be approved by chat administrators. In this case, memberLimit must be 0.
         */
        public boolean createsJoinRequest;

        /**
         * Default constructor for a function, which edits a non-primary invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public EditChatInviteLink() {
        }

        /**
         * Creates a function, which edits a non-primary invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to be edited.
         * @param name Invite link name; 0-32 characters.
         * @param expirationDate Point in time (Unix timestamp) when the link will expire; pass 0 if never.
         * @param memberLimit The maximum number of chat members that can join the chat via the link simultaneously; 0-99999; pass 0 if not limited.
         * @param createsJoinRequest Pass true if users joining the chat via the link need to be approved by chat administrators. In this case, memberLimit must be 0.
         */
        public EditChatInviteLink(long chatId, String inviteLink, String name, int expirationDate, int memberLimit, boolean createsJoinRequest) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.name = name;
            this.expirationDate = expirationDate;
            this.memberLimit = memberLimit;
            this.createsJoinRequest = createsJoinRequest;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1320303996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits information about a custom local language pack in the current localization target. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditCustomLanguagePackInfo extends Function<Ok> {
        /**
         * New information about the custom local language pack.
         */
        public LanguagePackInfo info;

        /**
         * Default constructor for a function, which edits information about a custom local language pack in the current localization target. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditCustomLanguagePackInfo() {
        }

        /**
         * Creates a function, which edits information about a custom local language pack in the current localization target. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param info New information about the custom local language pack.
         */
        public EditCustomLanguagePackInfo(LanguagePackInfo info) {
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1320751257;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits title and icon of a topic in a forum supergroup chat; requires canManageTopics right in the supergroup unless the user is creator of the topic.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditForumTopic extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Message thread identifier of the forum topic.
         */
        public long messageThreadId;
        /**
         * New name of the topic; 0-128 characters. If empty, the previous topic name is kept.
         */
        public String name;
        /**
         * Pass true to edit the icon of the topic. Icon of the General topic can't be edited.
         */
        public boolean editIconCustomEmoji;
        /**
         * Identifier of the new custom emoji for topic icon; pass 0 to remove the custom emoji. Ignored if editIconCustomEmoji is false. Telegram Premium users can use any custom emoji, other users can use only a custom emoji returned by getForumTopicDefaultIcons.
         */
        public long iconCustomEmojiId;

        /**
         * Default constructor for a function, which edits title and icon of a topic in a forum supergroup chat; requires canManageTopics right in the supergroup unless the user is creator of the topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditForumTopic() {
        }

        /**
         * Creates a function, which edits title and icon of a topic in a forum supergroup chat; requires canManageTopics right in the supergroup unless the user is creator of the topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageThreadId Message thread identifier of the forum topic.
         * @param name New name of the topic; 0-128 characters. If empty, the previous topic name is kept.
         * @param editIconCustomEmoji Pass true to edit the icon of the topic. Icon of the General topic can't be edited.
         * @param iconCustomEmojiId Identifier of the new custom emoji for topic icon; pass 0 to remove the custom emoji. Ignored if editIconCustomEmoji is false. Telegram Premium users can use any custom emoji, other users can use only a custom emoji returned by getForumTopicDefaultIcons.
         */
        public EditForumTopic(long chatId, long messageThreadId, String name, boolean editIconCustomEmoji, long iconCustomEmojiId) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.name = name;
            this.editIconCustomEmoji = editIconCustomEmoji;
            this.iconCustomEmojiId = iconCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1485402016;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the caption of an inline message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageCaption extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New message content caption; pass null to remove caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * Pass true to show the caption above the media; otherwise, the caption will be shown below the media. Can be true only for animation, photo, and video messages.
         */
        public boolean showCaptionAboveMedia;

        /**
         * Default constructor for a function, which edits the caption of an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageCaption() {
        }

        /**
         * Creates a function, which edits the caption of an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param caption New message content caption; pass null to remove caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia Pass true to show the caption above the media; otherwise, the caption will be shown below the media. Can be true only for animation, photo, and video messages.
         */
        public EditInlineMessageCaption(String inlineMessageId, ReplyMarkup replyMarkup, FormattedText caption, boolean showCaptionAboveMedia) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1409762552;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the content of a live location in an inline message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageLiveLocation extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New location content of the message; pass null to stop sharing the live location.
         */
        public Location location;
        /**
         * New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         */
        public int livePeriod;
        /**
         * The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         */
        public int heading;
        /**
         * The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public int proximityAlertRadius;

        /**
         * Default constructor for a function, which edits the content of a live location in an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageLiveLocation() {
        }

        /**
         * Creates a function, which edits the content of a live location in an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param location New location content of the message; pass null to stop sharing the live location.
         * @param livePeriod New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         * @param heading The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         * @param proximityAlertRadius The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public EditInlineMessageLiveLocation(String inlineMessageId, ReplyMarkup replyMarkup, Location location, int livePeriod, int heading, int proximityAlertRadius) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
            this.location = location;
            this.livePeriod = livePeriod;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2134352044;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the content of a message with an animation, an audio, a document, a photo or a video in an inline message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageMedia extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the content of a message with an animation, an audio, a document, a photo or a video in an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageMedia() {
        }

        /**
         * Creates a function, which edits the content of a message with an animation, an audio, a document, a photo or a video in an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param inputMessageContent New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public EditInlineMessageMedia(String inlineMessageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 23553921;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the reply markup of an inline message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageReplyMarkup extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which edits the reply markup of an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageReplyMarkup() {
        }

        /**
         * Creates a function, which edits the reply markup of an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none.
         */
        public EditInlineMessageReplyMarkup(String inlineMessageId, ReplyMarkup replyMarkup) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -67565858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the text of an inline text or game message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageText extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New text content of the message. Must be of type inputMessageText.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the text of an inline text or game message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageText() {
        }

        /**
         * Creates a function, which edits the text of an inline text or game message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param inputMessageContent New text content of the message. Must be of type inputMessageText.
         */
        public EditInlineMessageText(String inlineMessageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -855457307;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the message content caption. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageCaption extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New message content caption; 0-getOption(&quot;message_caption_length_max&quot;) characters; pass null to remove caption.
         */
        public FormattedText caption;
        /**
         * Pass true to show the caption above the media; otherwise, the caption will be shown below the media. Can be true only for animation, photo, and video messages.
         */
        public boolean showCaptionAboveMedia;

        /**
         * Default constructor for a function, which edits the message content caption. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageCaption() {
        }

        /**
         * Creates a function, which edits the message content caption. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param caption New message content caption; 0-getOption(&quot;message_caption_length_max&quot;) characters; pass null to remove caption.
         * @param showCaptionAboveMedia Pass true to show the caption above the media; otherwise, the caption will be shown below the media. Can be true only for animation, photo, and video messages.
         */
        public EditMessageCaption(long chatId, long messageId, ReplyMarkup replyMarkup, FormattedText caption, boolean showCaptionAboveMedia) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2020117951;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageLiveLocation extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New location content of the message; pass null to stop sharing the live location.
         */
        public Location location;
        /**
         * New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         */
        public int livePeriod;
        /**
         * The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         */
        public int heading;
        /**
         * The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public int proximityAlertRadius;

        /**
         * Default constructor for a function, which edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageLiveLocation() {
        }

        /**
         * Creates a function, which edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param location New location content of the message; pass null to stop sharing the live location.
         * @param livePeriod New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         * @param heading The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         * @param proximityAlertRadius The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public EditMessageLiveLocation(long chatId, long messageId, ReplyMarkup replyMarkup, Location location, int livePeriod, int heading, int proximityAlertRadius) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.location = location;
            this.livePeriod = livePeriod;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1890511980;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the content of a message with an animation, an audio, a document, a photo or a video, including message caption. If only the caption needs to be edited, use editMessageCaption instead. The media can't be edited if the message was set to self-destruct or to a self-destructing media. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageMedia extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the content of a message with an animation, an audio, a document, a photo or a video, including message caption. If only the caption needs to be edited, use editMessageCaption instead. The media can't be edited if the message was set to self-destruct or to a self-destructing media. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageMedia() {
        }

        /**
         * Creates a function, which edits the content of a message with an animation, an audio, a document, a photo or a video, including message caption. If only the caption needs to be edited, use editMessageCaption instead. The media can't be edited if the message was set to self-destruct or to a self-destructing media. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param inputMessageContent New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public EditMessageMedia(long chatId, long messageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1152678125;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the message reply markup; for bots only. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageReplyMarkup extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which edits the message reply markup; for bots only. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageReplyMarkup() {
        }

        /**
         * Creates a function, which edits the message reply markup; for bots only. Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         */
        public EditMessageReplyMarkup(long chatId, long messageId, ReplyMarkup replyMarkup) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 332127881;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the time when a scheduled message will be sent. Scheduling state of all messages in the same album or forwarded together with the message will be also changed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditMessageSchedulingState extends Function<Ok> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message scheduling state; pass null to send the message immediately.
         */
        public MessageSchedulingState schedulingState;

        /**
         * Default constructor for a function, which edits the time when a scheduled message will be sent. Scheduling state of all messages in the same album or forwarded together with the message will be also changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditMessageSchedulingState() {
        }

        /**
         * Creates a function, which edits the time when a scheduled message will be sent. Scheduling state of all messages in the same album or forwarded together with the message will be also changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param schedulingState The new message scheduling state; pass null to send the message immediately.
         */
        public EditMessageSchedulingState(long chatId, long messageId, MessageSchedulingState schedulingState) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.schedulingState = schedulingState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1372976192;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the text of a message (or a text of a game message). Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageText extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New text content of the message. Must be of type inputMessageText.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the text of a message (or a text of a game message). Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageText() {
        }

        /**
         * Creates a function, which edits the text of a message (or a text of a game message). Returns the edited message after the edit is completed on the server side. Can be used only if message.canBeEdited == true.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param inputMessageContent New text content of the message. Must be of type inputMessageText.
         */
        public EditMessageText(long chatId, long messageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 196272567;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits an existing proxy server for network requests. Can be called before authorization.
     *
     * <p> Returns {@link Proxy Proxy} </p>
     */
    public static class EditProxy extends Function<Proxy> {
        /**
         * Proxy identifier.
         */
        public int proxyId;
        /**
         * Proxy server domain or IP address.
         */
        public String server;
        /**
         * Proxy server port.
         */
        public int port;
        /**
         * Pass true to immediately enable the proxy.
         */
        public boolean enable;
        /**
         * Proxy type.
         */
        public ProxyType type;

        /**
         * Default constructor for a function, which edits an existing proxy server for network requests. Can be called before authorization.
         *
         * <p> Returns {@link Proxy Proxy} </p>
         */
        public EditProxy() {
        }

        /**
         * Creates a function, which edits an existing proxy server for network requests. Can be called before authorization.
         *
         * <p> Returns {@link Proxy Proxy} </p>
         *
         * @param proxyId Proxy identifier.
         * @param server Proxy server domain or IP address.
         * @param port Proxy server port.
         * @param enable Pass true to immediately enable the proxy.
         * @param type Proxy type.
         */
        public EditProxy(int proxyId, String server, int port, boolean enable, ProxyType type) {
            this.proxyId = proxyId;
            this.server = server;
            this.port = port;
            this.enable = enable;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1605883821;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Asynchronously edits the text, media or caption of a quick reply message. Use quickReplyMessage.canBeEdited to check whether a message can be edited. Text message can be edited only to a text message. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditQuickReplyMessage extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut with the message.
         */
        public int shortcutId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * New content of the message. Must be one of the following types: inputMessageText, inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which asynchronously edits the text, media or caption of a quick reply message. Use quickReplyMessage.canBeEdited to check whether a message can be edited. Text message can be edited only to a text message. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditQuickReplyMessage() {
        }

        /**
         * Creates a function, which asynchronously edits the text, media or caption of a quick reply message. Use quickReplyMessage.canBeEdited to check whether a message can be edited. Text message can be edited only to a text message. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut with the message.
         * @param messageId Identifier of the message.
         * @param inputMessageContent New content of the message. Must be one of the following types: inputMessageText, inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public EditQuickReplyMessage(int shortcutId, long messageId, InputMessageContent inputMessageContent) {
            this.shortcutId = shortcutId;
            this.messageId = messageId;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 80517006;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes content and caption of a story. Can be called only if story.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditStory extends Function<Ok> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storySenderChatId;
        /**
         * Identifier of the story to edit.
         */
        public int storyId;
        /**
         * New content of the story; pass null to keep the current content.
         */
        public InputStoryContent content;
        /**
         * New clickable rectangle areas to be shown on the story media; pass null to keep the current areas. Areas can't be edited if story content isn't changed.
         */
        public InputStoryAreas areas;
        /**
         * New story caption; pass null to keep the current caption.
         */
        public FormattedText caption;

        /**
         * Default constructor for a function, which changes content and caption of a story. Can be called only if story.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditStory() {
        }

        /**
         * Creates a function, which changes content and caption of a story. Can be called only if story.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storySenderChatId Identifier of the chat that posted the story.
         * @param storyId Identifier of the story to edit.
         * @param content New content of the story; pass null to keep the current content.
         * @param areas New clickable rectangle areas to be shown on the story media; pass null to keep the current areas. Areas can't be edited if story content isn't changed.
         * @param caption New story caption; pass null to keep the current caption.
         */
        public EditStory(long storySenderChatId, int storyId, InputStoryContent content, InputStoryAreas areas, FormattedText caption) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
            this.content = content;
            this.areas = areas;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1584013745;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Enables a proxy. Only one proxy can be enabled at a time. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EnableProxy extends Function<Ok> {
        /**
         * Proxy identifier.
         */
        public int proxyId;

        /**
         * Default constructor for a function, which enables a proxy. Only one proxy can be enabled at a time. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EnableProxy() {
        }

        /**
         * Creates a function, which enables a proxy. Only one proxy can be enabled at a time. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param proxyId Proxy identifier.
         */
        public EnableProxy(int proxyId) {
            this.proxyId = proxyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1494450838;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Ends a group call. Requires groupCall.canBeManaged.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EndGroupCall extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which ends a group call. Requires groupCall.canBeManaged.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EndGroupCall() {
        }

        /**
         * Creates a function, which ends a group call. Requires groupCall.canBeManaged.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public EndGroupCall(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 573131959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Ends recording of an active group call. Requires groupCall.canBeManaged group call flag.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EndGroupCallRecording extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which ends recording of an active group call. Requires groupCall.canBeManaged group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EndGroupCallRecording() {
        }

        /**
         * Creates a function, which ends recording of an active group call. Requires groupCall.canBeManaged group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public EndGroupCallRecording(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -75799927;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Ends screen sharing in a joined group call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EndGroupCallScreenSharing extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which ends screen sharing in a joined group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EndGroupCallScreenSharing() {
        }

        /**
         * Creates a function, which ends screen sharing in a joined group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public EndGroupCallScreenSharing(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2047599540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Finishes the file generation.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class FinishFileGeneration extends Function<Ok> {
        /**
         * The identifier of the generation process.
         */
        public long generationId;
        /**
         * If passed, the file generation has failed and must be terminated; pass null if the file generation succeeded.
         */
        public Error error;

        /**
         * Default constructor for a function, which finishes the file generation.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public FinishFileGeneration() {
        }

        /**
         * Creates a function, which finishes the file generation.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param generationId The identifier of the generation process.
         * @param error If passed, the file generation has failed and must be terminated; pass null if the file generation succeeded.
         */
        public FinishFileGeneration(long generationId, Error error) {
            this.generationId = generationId;
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1055060835;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in messageIds. If a message can't be forwarded, null will be returned instead of the message.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class ForwardMessages extends Function<Messages> {
        /**
         * Identifier of the chat to which to forward messages.
         */
        public long chatId;
        /**
         * If not 0, the message thread identifier in which the message will be sent; for forum threads only.
         */
        public long messageThreadId;
        /**
         * Identifier of the chat from which to forward messages.
         */
        public long fromChatId;
        /**
         * Identifiers of the messages to forward. Message identifiers must be in a strictly increasing order. At most 100 messages can be forwarded simultaneously. A message can be forwarded only if message.canBeForwarded.
         */
        public long[] messageIds;
        /**
         * Options to be used to send the messages; pass null to use default options.
         */
        public MessageSendOptions options;
        /**
         * Pass true to copy content of the messages without reference to the original sender. Always true if the messages are forwarded to a secret chat or are local.
         */
        public boolean sendCopy;
        /**
         * Pass true to remove media captions of message copies. Ignored if sendCopy is false.
         */
        public boolean removeCaption;

        /**
         * Default constructor for a function, which forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in messageIds. If a message can't be forwarded, null will be returned instead of the message.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public ForwardMessages() {
        }

        /**
         * Creates a function, which forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in messageIds. If a message can't be forwarded, null will be returned instead of the message.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Identifier of the chat to which to forward messages.
         * @param messageThreadId If not 0, the message thread identifier in which the message will be sent; for forum threads only.
         * @param fromChatId Identifier of the chat from which to forward messages.
         * @param messageIds Identifiers of the messages to forward. Message identifiers must be in a strictly increasing order. At most 100 messages can be forwarded simultaneously. A message can be forwarded only if message.canBeForwarded.
         * @param options Options to be used to send the messages; pass null to use default options.
         * @param sendCopy Pass true to copy content of the messages without reference to the original sender. Always true if the messages are forwarded to a secret chat or are local.
         * @param removeCaption Pass true to remove media captions of message copies. Ignored if sendCopy is false.
         */
        public ForwardMessages(long chatId, long messageThreadId, long fromChatId, long[] messageIds, MessageSendOptions options, boolean sendCopy, boolean removeCaption) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.fromChatId = fromChatId;
            this.messageIds = messageIds;
            this.options = options;
            this.sendCopy = sendCopy;
            this.removeCaption = removeCaption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 966156347;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the period of inactivity after which the account of the current user will automatically be deleted.
     *
     * <p> Returns {@link AccountTtl AccountTtl} </p>
     */
    public static class GetAccountTtl extends Function<AccountTtl> {

        /**
         * Default constructor for a function, which returns the period of inactivity after which the account of the current user will automatically be deleted.
         *
         * <p> Returns {@link AccountTtl AccountTtl} </p>
         */
        public GetAccountTtl() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -443905161;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all active live locations that need to be updated by the application. The list is persistent across application restarts only if the message database is used.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetActiveLiveLocationMessages extends Function<Messages> {

        /**
         * Default constructor for a function, which returns all active live locations that need to be updated by the application. The list is persistent across application restarts only if the message database is used.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetActiveLiveLocationMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1425459567;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all active sessions of the current user.
     *
     * <p> Returns {@link Sessions Sessions} </p>
     */
    public static class GetActiveSessions extends Function<Sessions> {

        /**
         * Default constructor for a function, which returns all active sessions of the current user.
         *
         * <p> Returns {@link Sessions Sessions} </p>
         */
        public GetActiveSessions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119710526;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all available Telegram Passport elements.
     *
     * <p> Returns {@link PassportElements PassportElements} </p>
     */
    public static class GetAllPassportElements extends Function<PassportElements> {
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns all available Telegram Passport elements.
         *
         * <p> Returns {@link PassportElements PassportElements} </p>
         */
        public GetAllPassportElements() {
        }

        /**
         * Creates a function, which returns all available Telegram Passport elements.
         *
         * <p> Returns {@link PassportElements PassportElements} </p>
         *
         * @param password The 2-step verification password of the current user.
         */
        public GetAllPassportElements(String password) {
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2038945045;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns unique emoji that correspond to stickers to be found by the getStickers(stickerType, query, 1000000, chatId).
     *
     * <p> Returns {@link Emojis Emojis} </p>
     */
    public static class GetAllStickerEmojis extends Function<Emojis> {
        /**
         * Type of the stickers to search for.
         */
        public StickerType stickerType;
        /**
         * Search query.
         */
        public String query;
        /**
         * Chat identifier for which to find stickers.
         */
        public long chatId;
        /**
         * Pass true if only main emoji for each found sticker must be included in the result.
         */
        public boolean returnOnlyMainEmoji;

        /**
         * Default constructor for a function, which returns unique emoji that correspond to stickers to be found by the getStickers(stickerType, query, 1000000, chatId).
         *
         * <p> Returns {@link Emojis Emojis} </p>
         */
        public GetAllStickerEmojis() {
        }

        /**
         * Creates a function, which returns unique emoji that correspond to stickers to be found by the getStickers(stickerType, query, 1000000, chatId).
         *
         * <p> Returns {@link Emojis Emojis} </p>
         *
         * @param stickerType Type of the stickers to search for.
         * @param query Search query.
         * @param chatId Chat identifier for which to find stickers.
         * @param returnOnlyMainEmoji Pass true if only main emoji for each found sticker must be included in the result.
         */
        public GetAllStickerEmojis(StickerType stickerType, String query, long chatId, boolean returnOnlyMainEmoji) {
            this.stickerType = stickerType;
            this.query = query;
            this.chatId = chatId;
            this.returnOnlyMainEmoji = returnOnlyMainEmoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 296562224;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an animated emoji corresponding to a given emoji. Returns a 404 error if the emoji has no animated emoji.
     *
     * <p> Returns {@link AnimatedEmoji AnimatedEmoji} </p>
     */
    public static class GetAnimatedEmoji extends Function<AnimatedEmoji> {
        /**
         * The emoji.
         */
        public String emoji;

        /**
         * Default constructor for a function, which returns an animated emoji corresponding to a given emoji. Returns a 404 error if the emoji has no animated emoji.
         *
         * <p> Returns {@link AnimatedEmoji AnimatedEmoji} </p>
         */
        public GetAnimatedEmoji() {
        }

        /**
         * Creates a function, which returns an animated emoji corresponding to a given emoji. Returns a 404 error if the emoji has no animated emoji.
         *
         * <p> Returns {@link AnimatedEmoji AnimatedEmoji} </p>
         *
         * @param emoji The emoji.
         */
        public GetAnimatedEmoji(String emoji) {
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1065635702;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns application config, provided by the server. Can be called before authorization.
     *
     * <p> Returns {@link JsonValue JsonValue} </p>
     */
    public static class GetApplicationConfig extends Function<JsonValue> {

        /**
         * Default constructor for a function, which returns application config, provided by the server. Can be called before authorization.
         *
         * <p> Returns {@link JsonValue JsonValue} </p>
         */
        public GetApplicationConfig() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1823144318;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the link for downloading official Telegram application to be used when the current user invites friends to Telegram.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetApplicationDownloadLink extends Function<HttpUrl> {

        /**
         * Default constructor for a function, which returns the link for downloading official Telegram application to be used when the current user invites friends to Telegram.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetApplicationDownloadLink() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 112013252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns settings for automatic moving of chats to and from the Archive chat lists.
     *
     * <p> Returns {@link ArchiveChatListSettings ArchiveChatListSettings} </p>
     */
    public static class GetArchiveChatListSettings extends Function<ArchiveChatListSettings> {

        /**
         * Default constructor for a function, which returns settings for automatic moving of chats to and from the Archive chat lists.
         *
         * <p> Returns {@link ArchiveChatListSettings ArchiveChatListSettings} </p>
         */
        public GetArchiveChatListSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2087874976;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of archived sticker sets.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class GetArchivedStickerSets extends Function<StickerSets> {
        /**
         * Type of the sticker sets to return.
         */
        public StickerType stickerType;
        /**
         * Identifier of the sticker set from which to return the result; use 0 to get results from the beginning.
         */
        public long offsetStickerSetId;
        /**
         * The maximum number of sticker sets to return; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns a list of archived sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public GetArchivedStickerSets() {
        }

        /**
         * Creates a function, which returns a list of archived sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to return.
         * @param offsetStickerSetId Identifier of the sticker set from which to return the result; use 0 to get results from the beginning.
         * @param limit The maximum number of sticker sets to return; up to 100.
         */
        public GetArchivedStickerSets(StickerType stickerType, long offsetStickerSetId, int limit) {
            this.stickerType = stickerType;
            this.offsetStickerSetId = offsetStickerSetId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1001931341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of sticker sets attached to a file, including regular, mask, and emoji sticker sets. Currently, only animations, photos, and videos can have attached sticker sets.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class GetAttachedStickerSets extends Function<StickerSets> {
        /**
         * File identifier.
         */
        public int fileId;

        /**
         * Default constructor for a function, which returns a list of sticker sets attached to a file, including regular, mask, and emoji sticker sets. Currently, only animations, photos, and videos can have attached sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public GetAttachedStickerSets() {
        }

        /**
         * Creates a function, which returns a list of sticker sets attached to a file, including regular, mask, and emoji sticker sets. Currently, only animations, photos, and videos can have attached sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param fileId File identifier.
         */
        public GetAttachedStickerSets(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1302172429;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a bot that can be added to attachment or side menu.
     *
     * <p> Returns {@link AttachmentMenuBot AttachmentMenuBot} </p>
     */
    public static class GetAttachmentMenuBot extends Function<AttachmentMenuBot> {
        /**
         * Bot's user identifier.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which returns information about a bot that can be added to attachment or side menu.
         *
         * <p> Returns {@link AttachmentMenuBot AttachmentMenuBot} </p>
         */
        public GetAttachmentMenuBot() {
        }

        /**
         * Creates a function, which returns information about a bot that can be added to attachment or side menu.
         *
         * <p> Returns {@link AttachmentMenuBot AttachmentMenuBot} </p>
         *
         * @param botUserId Bot's user identifier.
         */
        public GetAttachmentMenuBot(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1034248699;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current authorization state; this is an offline request. For informational purposes only. Use updateAuthorizationState instead to maintain the current authorization state. Can be called before initialization.
     *
     * <p> Returns {@link AuthorizationState AuthorizationState} </p>
     */
    public static class GetAuthorizationState extends Function<AuthorizationState> {

        /**
         * Default constructor for a function, which returns the current authorization state; this is an offline request. For informational purposes only. Use updateAuthorizationState instead to maintain the current authorization state. Can be called before initialization.
         *
         * <p> Returns {@link AuthorizationState AuthorizationState} </p>
         */
        public GetAuthorizationState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1949154877;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns auto-download settings presets for the current user.
     *
     * <p> Returns {@link AutoDownloadSettingsPresets AutoDownloadSettingsPresets} </p>
     */
    public static class GetAutoDownloadSettingsPresets extends Function<AutoDownloadSettingsPresets> {

        /**
         * Default constructor for a function, which returns auto-download settings presets for the current user.
         *
         * <p> Returns {@link AutoDownloadSettingsPresets AutoDownloadSettingsPresets} </p>
         */
        public GetAutoDownloadSettingsPresets() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1721088201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns autosave settings for the current user.
     *
     * <p> Returns {@link AutosaveSettings AutosaveSettings} </p>
     */
    public static class GetAutosaveSettings extends Function<AutosaveSettings> {

        /**
         * Default constructor for a function, which returns autosave settings for the current user.
         *
         * <p> Returns {@link AutosaveSettings AutosaveSettings} </p>
         */
        public GetAutosaveSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2136207914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of available chat boost slots for the current user.
     *
     * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
     */
    public static class GetAvailableChatBoostSlots extends Function<ChatBoostSlots> {

        /**
         * Default constructor for a function, which returns the list of available chat boost slots for the current user.
         *
         * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
         */
        public GetAvailableChatBoostSlots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1929898965;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Constructs a persistent HTTP URL for a background.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetBackgroundUrl extends Function<HttpUrl> {
        /**
         * Background name.
         */
        public String name;
        /**
         * Background type; backgroundTypeChatTheme isn't supported.
         */
        public BackgroundType type;

        /**
         * Default constructor for a function, which constructs a persistent HTTP URL for a background.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetBackgroundUrl() {
        }

        /**
         * Creates a function, which constructs a persistent HTTP URL for a background.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param name Background name.
         * @param type Background type; backgroundTypeChatTheme isn't supported.
         */
        public GetBackgroundUrl(String name, BackgroundType type) {
            this.name = name;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 733769682;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a bank card.
     *
     * <p> Returns {@link BankCardInfo BankCardInfo} </p>
     */
    public static class GetBankCardInfo extends Function<BankCardInfo> {
        /**
         * The bank card number.
         */
        public String bankCardNumber;

        /**
         * Default constructor for a function, which returns information about a bank card.
         *
         * <p> Returns {@link BankCardInfo BankCardInfo} </p>
         */
        public GetBankCardInfo() {
        }

        /**
         * Creates a function, which returns information about a bank card.
         *
         * <p> Returns {@link BankCardInfo BankCardInfo} </p>
         *
         * @param bankCardNumber The bank card number.
         */
        public GetBankCardInfo(String bankCardNumber) {
            this.bankCardNumber = bankCardNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1310515792;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a basic group by its identifier. This is an offline request if the current user is not a bot.
     *
     * <p> Returns {@link BasicGroup BasicGroup} </p>
     */
    public static class GetBasicGroup extends Function<BasicGroup> {
        /**
         * Basic group identifier.
         */
        public long basicGroupId;

        /**
         * Default constructor for a function, which returns information about a basic group by its identifier. This is an offline request if the current user is not a bot.
         *
         * <p> Returns {@link BasicGroup BasicGroup} </p>
         */
        public GetBasicGroup() {
        }

        /**
         * Creates a function, which returns information about a basic group by its identifier. This is an offline request if the current user is not a bot.
         *
         * <p> Returns {@link BasicGroup BasicGroup} </p>
         *
         * @param basicGroupId Basic group identifier.
         */
        public GetBasicGroup(long basicGroupId) {
            this.basicGroupId = basicGroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1635174828;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns full information about a basic group by its identifier.
     *
     * <p> Returns {@link BasicGroupFullInfo BasicGroupFullInfo} </p>
     */
    public static class GetBasicGroupFullInfo extends Function<BasicGroupFullInfo> {
        /**
         * Basic group identifier.
         */
        public long basicGroupId;

        /**
         * Default constructor for a function, which returns full information about a basic group by its identifier.
         *
         * <p> Returns {@link BasicGroupFullInfo BasicGroupFullInfo} </p>
         */
        public GetBasicGroupFullInfo() {
        }

        /**
         * Creates a function, which returns full information about a basic group by its identifier.
         *
         * <p> Returns {@link BasicGroupFullInfo BasicGroupFullInfo} </p>
         *
         * @param basicGroupId Basic group identifier.
         */
        public GetBasicGroupFullInfo(long basicGroupId) {
            this.basicGroupId = basicGroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1822039253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users and chats that were blocked by the current user.
     *
     * <p> Returns {@link MessageSenders MessageSenders} </p>
     */
    public static class GetBlockedMessageSenders extends Function<MessageSenders> {
        /**
         * Block list from which to return users.
         */
        public BlockList blockList;
        /**
         * Number of users and chats to skip in the result; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of users and chats to return; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns users and chats that were blocked by the current user.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         */
        public GetBlockedMessageSenders() {
        }

        /**
         * Creates a function, which returns users and chats that were blocked by the current user.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         *
         * @param blockList Block list from which to return users.
         * @param offset Number of users and chats to skip in the result; must be non-negative.
         * @param limit The maximum number of users and chats to return; up to 100.
         */
        public GetBlockedMessageSenders(BlockList blockList, int offset, int limit) {
            this.blockList = blockList;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1931137258;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the text shown in the chat with a bot if the chat is empty in the given language. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetBotInfoDescription extends Function<Text> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the text shown in the chat with a bot if the chat is empty in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetBotInfoDescription() {
        }

        /**
         * Creates a function, which returns the text shown in the chat with a bot if the chat is empty in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public GetBotInfoDescription(long botUserId, String languageCode) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -762841035;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the text shown on a bot's profile page and sent together with the link when users share the bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetBotInfoShortDescription extends Function<Text> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the text shown on a bot's profile page and sent together with the link when users share the bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetBotInfoShortDescription() {
        }

        /**
         * Creates a function, which returns the text shown on a bot's profile page and sent together with the link when users share the bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public GetBotInfoShortDescription(long botUserId, String languageCode) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1243358740;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the name of a bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetBotName extends Function<Text> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the name of a bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetBotName() {
        }

        /**
         * Creates a function, which returns the name of a bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public GetBotName(long botUserId, String languageCode) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1707118036;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a business chat link.
     *
     * <p> Returns {@link BusinessChatLinkInfo BusinessChatLinkInfo} </p>
     */
    public static class GetBusinessChatLinkInfo extends Function<BusinessChatLinkInfo> {
        /**
         * Name of the link.
         */
        public String linkName;

        /**
         * Default constructor for a function, which returns information about a business chat link.
         *
         * <p> Returns {@link BusinessChatLinkInfo BusinessChatLinkInfo} </p>
         */
        public GetBusinessChatLinkInfo() {
        }

        /**
         * Creates a function, which returns information about a business chat link.
         *
         * <p> Returns {@link BusinessChatLinkInfo BusinessChatLinkInfo} </p>
         *
         * @param linkName Name of the link.
         */
        public GetBusinessChatLinkInfo(String linkName) {
            this.linkName = linkName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 797670986;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns business chat links created for the current account.
     *
     * <p> Returns {@link BusinessChatLinks BusinessChatLinks} </p>
     */
    public static class GetBusinessChatLinks extends Function<BusinessChatLinks> {

        /**
         * Default constructor for a function, which returns business chat links created for the current account.
         *
         * <p> Returns {@link BusinessChatLinks BusinessChatLinks} </p>
         */
        public GetBusinessChatLinks() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 710287703;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the business bot that is connected to the current user account. Returns a 404 error if there is no connected bot.
     *
     * <p> Returns {@link BusinessConnectedBot BusinessConnectedBot} </p>
     */
    public static class GetBusinessConnectedBot extends Function<BusinessConnectedBot> {

        /**
         * Default constructor for a function, which returns the business bot that is connected to the current user account. Returns a 404 error if there is no connected bot.
         *
         * <p> Returns {@link BusinessConnectedBot BusinessConnectedBot} </p>
         */
        public GetBusinessConnectedBot() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 911058883;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a business connection by its identifier; for bots only.
     *
     * <p> Returns {@link BusinessConnection BusinessConnection} </p>
     */
    public static class GetBusinessConnection extends Function<BusinessConnection> {
        /**
         * Identifier of the business connection to return.
         */
        public String connectionId;

        /**
         * Default constructor for a function, which returns information about a business connection by its identifier; for bots only.
         *
         * <p> Returns {@link BusinessConnection BusinessConnection} </p>
         */
        public GetBusinessConnection() {
        }

        /**
         * Creates a function, which returns information about a business connection by its identifier; for bots only.
         *
         * <p> Returns {@link BusinessConnection BusinessConnection} </p>
         *
         * @param connectionId Identifier of the business connection to return.
         */
        public GetBusinessConnection(String connectionId) {
            this.connectionId = connectionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2114706400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about features, available to Business users.
     *
     * <p> Returns {@link BusinessFeatures BusinessFeatures} </p>
     */
    public static class GetBusinessFeatures extends Function<BusinessFeatures> {
        /**
         * Source of the request; pass null if the method is called from settings or some non-standard source.
         */
        public BusinessFeature source;

        /**
         * Default constructor for a function, which returns information about features, available to Business users.
         *
         * <p> Returns {@link BusinessFeatures BusinessFeatures} </p>
         */
        public GetBusinessFeatures() {
        }

        /**
         * Creates a function, which returns information about features, available to Business users.
         *
         * <p> Returns {@link BusinessFeatures BusinessFeatures} </p>
         *
         * @param source Source of the request; pass null if the method is called from settings or some non-standard source.
         */
        public GetBusinessFeatures(BusinessFeature source) {
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -997171199;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
     *
     * <p> Returns {@link CallbackQueryAnswer CallbackQueryAnswer} </p>
     */
    public static class GetCallbackQueryAnswer extends Function<CallbackQueryAnswer> {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message from which the query originated.
         */
        public long messageId;
        /**
         * Query payload.
         */
        public CallbackQueryPayload payload;

        /**
         * Default constructor for a function, which sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
         *
         * <p> Returns {@link CallbackQueryAnswer CallbackQueryAnswer} </p>
         */
        public GetCallbackQueryAnswer() {
        }

        /**
         * Creates a function, which sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
         *
         * <p> Returns {@link CallbackQueryAnswer CallbackQueryAnswer} </p>
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message from which the query originated.
         * @param payload Query payload.
         */
        public GetCallbackQueryAnswer(long chatId, long messageId, CallbackQueryPayload payload) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 116357727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message with the callback button that originated a callback query; for bots only.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetCallbackQueryMessage extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Identifier of the callback query.
         */
        public long callbackQueryId;

        /**
         * Default constructor for a function, which returns information about a message with the callback button that originated a callback query; for bots only.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetCallbackQueryMessage() {
        }

        /**
         * Creates a function, which returns information about a message with the callback button that originated a callback query; for bots only.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         * @param messageId Message identifier.
         * @param callbackQueryId Identifier of the callback query.
         */
        public GetCallbackQueryMessage(long chatId, long messageId, long callbackQueryId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.callbackQueryId = callbackQueryId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1121939086;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a chat by its identifier; this is an offline request if the current user is not a bot.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class GetChat extends Function<Chat> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns information about a chat by its identifier; this is an offline request if the current user is not a bot.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public GetChat() {
        }

        /**
         * Creates a function, which returns information about a chat by its identifier; this is an offline request if the current user is not a bot.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1866601536;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of active stories posted by the given chat.
     *
     * <p> Returns {@link ChatActiveStories ChatActiveStories} </p>
     */
    public static class GetChatActiveStories extends Function<ChatActiveStories> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of active stories posted by the given chat.
         *
         * <p> Returns {@link ChatActiveStories ChatActiveStories} </p>
         */
        public GetChatActiveStories() {
        }

        /**
         * Creates a function, which returns the list of active stories posted by the given chat.
         *
         * <p> Returns {@link ChatActiveStories ChatActiveStories} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatActiveStories(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 776993781;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of administrators of the chat with their custom titles.
     *
     * <p> Returns {@link ChatAdministrators ChatAdministrators} </p>
     */
    public static class GetChatAdministrators extends Function<ChatAdministrators> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns a list of administrators of the chat with their custom titles.
         *
         * <p> Returns {@link ChatAdministrators ChatAdministrators} </p>
         */
        public GetChatAdministrators() {
        }

        /**
         * Creates a function, which returns a list of administrators of the chat with their custom titles.
         *
         * <p> Returns {@link ChatAdministrators ChatAdministrators} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatAdministrators(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1544468155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of all stories posted by the given chat; requires canEditStories right in the chat. The stories are returned in a reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
     *
     * <p> Returns {@link Stories Stories} </p>
     */
    public static class GetChatArchivedStories extends Function<Stories> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the story starting from which stories must be returned; use 0 to get results from the last story.
         */
        public int fromStoryId;
        /**
         * The maximum number of stories to be returned For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of all stories posted by the given chat; requires canEditStories right in the chat. The stories are returned in a reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         */
        public GetChatArchivedStories() {
        }

        /**
         * Creates a function, which returns the list of all stories posted by the given chat; requires canEditStories right in the chat. The stories are returned in a reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         *
         * @param chatId Chat identifier.
         * @param fromStoryId Identifier of the story starting from which stories must be returned; use 0 to get results from the last story.
         * @param limit The maximum number of stories to be returned For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetChatArchivedStories(long chatId, int fromStoryId, int limit) {
            this.chatId = chatId;
            this.fromStoryId = fromStoryId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1356950392;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of message sender identifiers, which can be used to send messages in a chat.
     *
     * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
     */
    public static class GetChatAvailableMessageSenders extends Function<ChatMessageSenders> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of message sender identifiers, which can be used to send messages in a chat.
         *
         * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
         */
        public GetChatAvailableMessageSenders() {
        }

        /**
         * Creates a function, which returns the list of message sender identifiers, which can be used to send messages in a chat.
         *
         * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatAvailableMessageSenders(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1158670635;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of features available for different chat boost levels; this is an offline request.
     *
     * <p> Returns {@link ChatBoostFeatures ChatBoostFeatures} </p>
     */
    public static class GetChatBoostFeatures extends Function<ChatBoostFeatures> {
        /**
         * Pass true to get the list of features for channels; pass false to get the list of features for supergroups.
         */
        public boolean isChannel;

        /**
         * Default constructor for a function, which returns the list of features available for different chat boost levels; this is an offline request.
         *
         * <p> Returns {@link ChatBoostFeatures ChatBoostFeatures} </p>
         */
        public GetChatBoostFeatures() {
        }

        /**
         * Creates a function, which returns the list of features available for different chat boost levels; this is an offline request.
         *
         * <p> Returns {@link ChatBoostFeatures ChatBoostFeatures} </p>
         *
         * @param isChannel Pass true to get the list of features for channels; pass false to get the list of features for supergroups.
         */
        public GetChatBoostFeatures(boolean isChannel) {
            this.isChannel = isChannel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -389994336;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of features available on the specific chat boost level; this is an offline request.
     *
     * <p> Returns {@link ChatBoostLevelFeatures ChatBoostLevelFeatures} </p>
     */
    public static class GetChatBoostLevelFeatures extends Function<ChatBoostLevelFeatures> {
        /**
         * Pass true to get the list of features for channels; pass false to get the list of features for supergroups.
         */
        public boolean isChannel;
        /**
         * Chat boost level.
         */
        public int level;

        /**
         * Default constructor for a function, which returns the list of features available on the specific chat boost level; this is an offline request.
         *
         * <p> Returns {@link ChatBoostLevelFeatures ChatBoostLevelFeatures} </p>
         */
        public GetChatBoostLevelFeatures() {
        }

        /**
         * Creates a function, which returns the list of features available on the specific chat boost level; this is an offline request.
         *
         * <p> Returns {@link ChatBoostLevelFeatures ChatBoostLevelFeatures} </p>
         *
         * @param isChannel Pass true to get the list of features for channels; pass false to get the list of features for supergroups.
         * @param level Chat boost level.
         */
        public GetChatBoostLevelFeatures(boolean isChannel, int level) {
            this.isChannel = isChannel;
            this.level = level;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1172717195;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link to boost the specified supergroup or channel chat.
     *
     * <p> Returns {@link ChatBoostLink ChatBoostLink} </p>
     */
    public static class GetChatBoostLink extends Function<ChatBoostLink> {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns an HTTPS link to boost the specified supergroup or channel chat.
         *
         * <p> Returns {@link ChatBoostLink ChatBoostLink} </p>
         */
        public GetChatBoostLink() {
        }

        /**
         * Creates a function, which returns an HTTPS link to boost the specified supergroup or channel chat.
         *
         * <p> Returns {@link ChatBoostLink ChatBoostLink} </p>
         *
         * @param chatId Identifier of the chat.
         */
        public GetChatBoostLink(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1458662533;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a link to boost a chat. Can be called for any internal link of the type internalLinkTypeChatBoost.
     *
     * <p> Returns {@link ChatBoostLinkInfo ChatBoostLinkInfo} </p>
     */
    public static class GetChatBoostLinkInfo extends Function<ChatBoostLinkInfo> {
        /**
         * The link to boost a chat.
         */
        public String url;

        /**
         * Default constructor for a function, which returns information about a link to boost a chat. Can be called for any internal link of the type internalLinkTypeChatBoost.
         *
         * <p> Returns {@link ChatBoostLinkInfo ChatBoostLinkInfo} </p>
         */
        public GetChatBoostLinkInfo() {
        }

        /**
         * Creates a function, which returns information about a link to boost a chat. Can be called for any internal link of the type internalLinkTypeChatBoost.
         *
         * <p> Returns {@link ChatBoostLinkInfo ChatBoostLinkInfo} </p>
         *
         * @param url The link to boost a chat.
         */
        public GetChatBoostLinkInfo(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 654068572;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current boost status for a supergroup or a channel chat.
     *
     * <p> Returns {@link ChatBoostStatus ChatBoostStatus} </p>
     */
    public static class GetChatBoostStatus extends Function<ChatBoostStatus> {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the current boost status for a supergroup or a channel chat.
         *
         * <p> Returns {@link ChatBoostStatus ChatBoostStatus} </p>
         */
        public GetChatBoostStatus() {
        }

        /**
         * Creates a function, which returns the current boost status for a supergroup or a channel chat.
         *
         * <p> Returns {@link ChatBoostStatus ChatBoostStatus} </p>
         *
         * @param chatId Identifier of the chat.
         */
        public GetChatBoostStatus(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -810775857;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of boosts applied to a chat; requires administrator rights in the chat.
     *
     * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
     */
    public static class GetChatBoosts extends Function<FoundChatBoosts> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Pass true to receive only boosts received from gift codes and giveaways created by the chat.
         */
        public boolean onlyGiftCodes;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of boosts to be returned; up to 100. For optimal performance, the number of returned boosts can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of boosts applied to a chat; requires administrator rights in the chat.
         *
         * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
         */
        public GetChatBoosts() {
        }

        /**
         * Creates a function, which returns the list of boosts applied to a chat; requires administrator rights in the chat.
         *
         * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
         *
         * @param chatId Identifier of the chat.
         * @param onlyGiftCodes Pass true to receive only boosts received from gift codes and giveaways created by the chat.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of boosts to be returned; up to 100. For optimal performance, the number of returned boosts can be smaller than the specified limit.
         */
        public GetChatBoosts(long chatId, boolean onlyGiftCodes, String offset, int limit) {
            this.chatId = chatId;
            this.onlyGiftCodes = onlyGiftCodes;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1419859400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only for supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i.e., in order of decreasing eventId).
     *
     * <p> Returns {@link ChatEvents ChatEvents} </p>
     */
    public static class GetChatEventLog extends Function<ChatEvents> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Search query by which to filter events.
         */
        public String query;
        /**
         * Identifier of an event from which to return results. Use 0 to get results from the latest events.
         */
        public long fromEventId;
        /**
         * The maximum number of events to return; up to 100.
         */
        public int limit;
        /**
         * The types of events to return; pass null to get chat events of all types.
         */
        public ChatEventLogFilters filters;
        /**
         * User identifiers by which to filter events. By default, events relating to all users will be returned.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only for supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i.e., in order of decreasing eventId).
         *
         * <p> Returns {@link ChatEvents ChatEvents} </p>
         */
        public GetChatEventLog() {
        }

        /**
         * Creates a function, which returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only for supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i.e., in order of decreasing eventId).
         *
         * <p> Returns {@link ChatEvents ChatEvents} </p>
         *
         * @param chatId Chat identifier.
         * @param query Search query by which to filter events.
         * @param fromEventId Identifier of an event from which to return results. Use 0 to get results from the latest events.
         * @param limit The maximum number of events to return; up to 100.
         * @param filters The types of events to return; pass null to get chat events of all types.
         * @param userIds User identifiers by which to filter events. By default, events relating to all users will be returned.
         */
        public GetChatEventLog(long chatId, String query, long fromEventId, int limit, ChatEventLogFilters filters, long[] userIds) {
            this.chatId = chatId;
            this.query = query;
            this.fromEventId = fromEventId;
            this.limit = limit;
            this.filters = filters;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1281344669;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a chat folder by its identifier.
     *
     * <p> Returns {@link ChatFolder ChatFolder} </p>
     */
    public static class GetChatFolder extends Function<ChatFolder> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns information about a chat folder by its identifier.
         *
         * <p> Returns {@link ChatFolder ChatFolder} </p>
         */
        public GetChatFolder() {
        }

        /**
         * Creates a function, which returns information about a chat folder by its identifier.
         *
         * <p> Returns {@link ChatFolder ChatFolder} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatFolder(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 92809880;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate number of chats in a being created chat folder. Main and archive chat lists must be fully preloaded for this function to work correctly.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetChatFolderChatCount extends Function<Count> {
        /**
         * The new chat folder.
         */
        public ChatFolder folder;

        /**
         * Default constructor for a function, which returns approximate number of chats in a being created chat folder. Main and archive chat lists must be fully preloaded for this function to work correctly.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetChatFolderChatCount() {
        }

        /**
         * Creates a function, which returns approximate number of chats in a being created chat folder. Main and archive chat lists must be fully preloaded for this function to work correctly.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param folder The new chat folder.
         */
        public GetChatFolderChatCount(ChatFolder folder) {
            this.folder = folder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2111097790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns identifiers of pinned or always included chats from a chat folder, which are suggested to be left when the chat folder is deleted.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatFolderChatsToLeave extends Function<Chats> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns identifiers of pinned or always included chats from a chat folder, which are suggested to be left when the chat folder is deleted.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatFolderChatsToLeave() {
        }

        /**
         * Creates a function, which returns identifiers of pinned or always included chats from a chat folder, which are suggested to be left when the chat folder is deleted.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatFolderChatsToLeave(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1916672337;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default icon name for a folder. Can be called synchronously.
     *
     * <p> Returns {@link ChatFolderIcon ChatFolderIcon} </p>
     */
    public static class GetChatFolderDefaultIconName extends Function<ChatFolderIcon> {
        /**
         * Chat folder.
         */
        public ChatFolder folder;

        /**
         * Default constructor for a function, which returns default icon name for a folder. Can be called synchronously.
         *
         * <p> Returns {@link ChatFolderIcon ChatFolderIcon} </p>
         */
        public GetChatFolderDefaultIconName() {
        }

        /**
         * Creates a function, which returns default icon name for a folder. Can be called synchronously.
         *
         * <p> Returns {@link ChatFolderIcon ChatFolderIcon} </p>
         *
         * @param folder Chat folder.
         */
        public GetChatFolderDefaultIconName(ChatFolder folder) {
            this.folder = folder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 754425959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns invite links created by the current user for a shareable chat folder.
     *
     * <p> Returns {@link ChatFolderInviteLinks ChatFolderInviteLinks} </p>
     */
    public static class GetChatFolderInviteLinks extends Function<ChatFolderInviteLinks> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns invite links created by the current user for a shareable chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLinks ChatFolderInviteLinks} </p>
         */
        public GetChatFolderInviteLinks() {
        }

        /**
         * Creates a function, which returns invite links created by the current user for a shareable chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLinks ChatFolderInviteLinks} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatFolderInviteLinks(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 329079776;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns new chats added to a shareable chat folder by its owner. The method must be called at most once in getOption(&quot;chat_folder_new_chats_update_period&quot;) for the given chat folder.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatFolderNewChats extends Function<Chats> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns new chats added to a shareable chat folder by its owner. The method must be called at most once in getOption(&quot;chat_folder_new_chats_update_period&quot;) for the given chat folder.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatFolderNewChats() {
        }

        /**
         * Creates a function, which returns new chats added to a shareable chat folder by its owner. The method must be called at most once in getOption(&quot;chat_folder_new_chats_update_period&quot;) for the given chat folder.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatFolderNewChats(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2123181260;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib. This is an offline request if onlyLocal is true.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetChatHistory extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative offset up to 99 to get additionally some newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Pass true to get only messages that are available without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which returns messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib. This is an offline request if onlyLocal is true.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetChatHistory() {
        }

        /**
         * Creates a function, which returns messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib. This is an offline request if onlyLocal is true.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         * @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative offset up to 99 to get additionally some newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param onlyLocal Pass true to get only messages that are available without sending network requests.
         */
        public GetChatHistory(long chatId, long fromMessageId, int offset, int limit, boolean onlyLocal) {
            this.chatId = chatId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -799960451;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about an invite link. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class GetChatInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to get.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which returns information about an invite link. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public GetChatInviteLink() {
        }

        /**
         * Creates a function, which returns information about an invite link. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to get.
         */
        public GetChatInviteLink(long chatId, String inviteLink) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -479575555;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of chat administrators with number of their invite links. Requires owner privileges in the chat.
     *
     * <p> Returns {@link ChatInviteLinkCounts ChatInviteLinkCounts} </p>
     */
    public static class GetChatInviteLinkCounts extends Function<ChatInviteLinkCounts> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of chat administrators with number of their invite links. Requires owner privileges in the chat.
         *
         * <p> Returns {@link ChatInviteLinkCounts ChatInviteLinkCounts} </p>
         */
        public GetChatInviteLinkCounts() {
        }

        /**
         * Creates a function, which returns the list of chat administrators with number of their invite links. Requires owner privileges in the chat.
         *
         * <p> Returns {@link ChatInviteLinkCounts ChatInviteLinkCounts} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatInviteLinkCounts(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 890299025;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns chat members joined a chat via an invite link. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link ChatInviteLinkMembers ChatInviteLinkMembers} </p>
     */
    public static class GetChatInviteLinkMembers extends Function<ChatInviteLinkMembers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link for which to return chat members.
         */
        public String inviteLink;
        /**
         * A chat member from which to return next chat members; pass null to get results from the beginning.
         */
        public ChatInviteLinkMember offsetMember;
        /**
         * The maximum number of chat members to return; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns chat members joined a chat via an invite link. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLinkMembers ChatInviteLinkMembers} </p>
         */
        public GetChatInviteLinkMembers() {
        }

        /**
         * Creates a function, which returns chat members joined a chat via an invite link. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLinkMembers ChatInviteLinkMembers} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link for which to return chat members.
         * @param offsetMember A chat member from which to return next chat members; pass null to get results from the beginning.
         * @param limit The maximum number of chat members to return; up to 100.
         */
        public GetChatInviteLinkMembers(long chatId, String inviteLink, ChatInviteLinkMember offsetMember, int limit) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.offsetMember = offsetMember;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -977921638;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns invite links for a chat created by specified administrator. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
     *
     * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
     */
    public static class GetChatInviteLinks extends Function<ChatInviteLinks> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * User identifier of a chat administrator. Must be an identifier of the current user for non-owner.
         */
        public long creatorUserId;
        /**
         * Pass true if revoked links needs to be returned instead of active or expired.
         */
        public boolean isRevoked;
        /**
         * Creation date of an invite link starting after which to return invite links; use 0 to get results from the beginning.
         */
        public int offsetDate;
        /**
         * Invite link starting after which to return invite links; use empty string to get results from the beginning.
         */
        public String offsetInviteLink;
        /**
         * The maximum number of invite links to return; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns invite links for a chat created by specified administrator. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
         *
         * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
         */
        public GetChatInviteLinks() {
        }

        /**
         * Creates a function, which returns invite links for a chat created by specified administrator. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
         *
         * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
         *
         * @param chatId Chat identifier.
         * @param creatorUserId User identifier of a chat administrator. Must be an identifier of the current user for non-owner.
         * @param isRevoked Pass true if revoked links needs to be returned instead of active or expired.
         * @param offsetDate Creation date of an invite link starting after which to return invite links; use 0 to get results from the beginning.
         * @param offsetInviteLink Invite link starting after which to return invite links; use empty string to get results from the beginning.
         * @param limit The maximum number of invite links to return; up to 100.
         */
        public GetChatInviteLinks(long chatId, long creatorUserId, boolean isRevoked, int offsetDate, String offsetInviteLink, int limit) {
            this.chatId = chatId;
            this.creatorUserId = creatorUserId;
            this.isRevoked = isRevoked;
            this.offsetDate = offsetDate;
            this.offsetInviteLink = offsetInviteLink;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 883252396;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns pending join requests in a chat.
     *
     * <p> Returns {@link ChatJoinRequests ChatJoinRequests} </p>
     */
    public static class GetChatJoinRequests extends Function<ChatJoinRequests> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link for which to return join requests. If empty, all join requests will be returned. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         */
        public String inviteLink;
        /**
         * A query to search for in the first names, last names and usernames of the users to return.
         */
        public String query;
        /**
         * A chat join request from which to return next requests; pass null to get results from the beginning.
         */
        public ChatJoinRequest offsetRequest;
        /**
         * The maximum number of requests to join the chat to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns pending join requests in a chat.
         *
         * <p> Returns {@link ChatJoinRequests ChatJoinRequests} </p>
         */
        public GetChatJoinRequests() {
        }

        /**
         * Creates a function, which returns pending join requests in a chat.
         *
         * <p> Returns {@link ChatJoinRequests ChatJoinRequests} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link for which to return join requests. If empty, all join requests will be returned. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         * @param query A query to search for in the first names, last names and usernames of the users to return.
         * @param offsetRequest A chat join request from which to return next requests; pass null to get results from the beginning.
         * @param limit The maximum number of requests to join the chat to return.
         */
        public GetChatJoinRequests(long chatId, String inviteLink, String query, ChatJoinRequest offsetRequest, int limit) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.query = query;
            this.offsetRequest = offsetRequest;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -388428126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns chat lists to which the chat can be added. This is an offline request.
     *
     * <p> Returns {@link ChatLists ChatLists} </p>
     */
    public static class GetChatListsToAddChat extends Function<ChatLists> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns chat lists to which the chat can be added. This is an offline request.
         *
         * <p> Returns {@link ChatLists ChatLists} </p>
         */
        public GetChatListsToAddChat() {
        }

        /**
         * Creates a function, which returns chat lists to which the chat can be added. This is an offline request.
         *
         * <p> Returns {@link ChatLists ChatLists} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatListsToAddChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 654956193;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a single member of a chat.
     *
     * <p> Returns {@link ChatMember ChatMember} </p>
     */
    public static class GetChatMember extends Function<ChatMember> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Member identifier.
         */
        public MessageSender memberId;

        /**
         * Default constructor for a function, which returns information about a single member of a chat.
         *
         * <p> Returns {@link ChatMember ChatMember} </p>
         */
        public GetChatMember() {
        }

        /**
         * Creates a function, which returns information about a single member of a chat.
         *
         * <p> Returns {@link ChatMember ChatMember} </p>
         *
         * @param chatId Chat identifier.
         * @param memberId Member identifier.
         */
        public GetChatMember(long chatId, MessageSender memberId) {
            this.chatId = chatId;
            this.memberId = memberId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -792636814;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the last message sent in a chat no later than the specified date.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetChatMessageByDate extends Function<Message> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Point in time (Unix timestamp) relative to which to search for messages.
         */
        public int date;

        /**
         * Default constructor for a function, which returns the last message sent in a chat no later than the specified date.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetChatMessageByDate() {
        }

        /**
         * Creates a function, which returns the last message sent in a chat no later than the specified date.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Chat identifier.
         * @param date Point in time (Unix timestamp) relative to which to search for messages.
         */
        public GetChatMessageByDate(long chatId, int date) {
            this.chatId = chatId;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1062564150;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the next messages of the specified type in the chat split by days. Returns the results in reverse chronological order. Can return partial result for the last returned day. Behavior of this method depends on the value of the option &quot;utc_time_offset&quot;.
     *
     * <p> Returns {@link MessageCalendar MessageCalendar} </p>
     */
    public static class GetChatMessageCalendar extends Function<MessageCalendar> {
        /**
         * Identifier of the chat in which to return information about messages.
         */
        public long chatId;
        /**
         * Filter for message content. Filters searchMessagesFilterEmpty, searchMessagesFilterMention, searchMessagesFilterUnreadMention, and searchMessagesFilterUnreadReaction are unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * The message identifier from which to return information about messages; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * If not0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages, or for chats other than Saved Messages.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which returns information about the next messages of the specified type in the chat split by days. Returns the results in reverse chronological order. Can return partial result for the last returned day. Behavior of this method depends on the value of the option &quot;utc_time_offset&quot;.
         *
         * <p> Returns {@link MessageCalendar MessageCalendar} </p>
         */
        public GetChatMessageCalendar() {
        }

        /**
         * Creates a function, which returns information about the next messages of the specified type in the chat split by days. Returns the results in reverse chronological order. Can return partial result for the last returned day. Behavior of this method depends on the value of the option &quot;utc_time_offset&quot;.
         *
         * <p> Returns {@link MessageCalendar MessageCalendar} </p>
         *
         * @param chatId Identifier of the chat in which to return information about messages.
         * @param filter Filter for message content. Filters searchMessagesFilterEmpty, searchMessagesFilterMention, searchMessagesFilterUnreadMention, and searchMessagesFilterUnreadReaction are unsupported in this function.
         * @param fromMessageId The message identifier from which to return information about messages; use 0 to get results from the last message.
         * @param savedMessagesTopicId If not0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages, or for chats other than Saved Messages.
         */
        public GetChatMessageCalendar(long chatId, SearchMessagesFilter filter, long fromMessageId, long savedMessagesTopicId) {
            this.chatId = chatId;
            this.filter = filter;
            this.fromMessageId = fromMessageId;
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2119225929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate number of messages of the specified type in the chat.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetChatMessageCount extends Function<Count> {
        /**
         * Identifier of the chat in which to count messages.
         */
        public long chatId;
        /**
         * Filter for message content; searchMessagesFilterEmpty is unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * If not 0, only messages in the specified Saved Messages topic will be counted; pass 0 to count all messages, or for chats other than Saved Messages.
         */
        public long savedMessagesTopicId;
        /**
         * Pass true to get the number of messages without sending network requests, or -1 if the number of messages is unknown locally.
         */
        public boolean returnLocal;

        /**
         * Default constructor for a function, which returns approximate number of messages of the specified type in the chat.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetChatMessageCount() {
        }

        /**
         * Creates a function, which returns approximate number of messages of the specified type in the chat.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param chatId Identifier of the chat in which to count messages.
         * @param filter Filter for message content; searchMessagesFilterEmpty is unsupported in this function.
         * @param savedMessagesTopicId If not 0, only messages in the specified Saved Messages topic will be counted; pass 0 to count all messages, or for chats other than Saved Messages.
         * @param returnLocal Pass true to get the number of messages without sending network requests, or -1 if the number of messages is unknown locally.
         */
        public GetChatMessageCount(long chatId, SearchMessagesFilter filter, long savedMessagesTopicId, boolean returnLocal) {
            this.chatId = chatId;
            this.filter = filter;
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.returnLocal = returnLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 955746569;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate 1-based position of a message among messages, which can be found by the specified filter in the chat. Cannot be used in secret chats.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetChatMessagePosition extends Function<Count> {
        /**
         * Identifier of the chat in which to find message position.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Filter for message content; searchMessagesFilterEmpty, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, and searchMessagesFilterFailedToSend are unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * If not 0, only messages in the specified thread will be considered; supergroups only.
         */
        public long messageThreadId;
        /**
         * If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all relevant messages, or for chats other than Saved Messages.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which returns approximate 1-based position of a message among messages, which can be found by the specified filter in the chat. Cannot be used in secret chats.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetChatMessagePosition() {
        }

        /**
         * Creates a function, which returns approximate 1-based position of a message among messages, which can be found by the specified filter in the chat. Cannot be used in secret chats.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param chatId Identifier of the chat in which to find message position.
         * @param messageId Message identifier.
         * @param filter Filter for message content; searchMessagesFilterEmpty, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, and searchMessagesFilterFailedToSend are unsupported in this function.
         * @param messageThreadId If not 0, only messages in the specified thread will be considered; supergroups only.
         * @param savedMessagesTopicId If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all relevant messages, or for chats other than Saved Messages.
         */
        public GetChatMessagePosition(long chatId, long messageId, SearchMessagesFilter filter, long messageThreadId, long savedMessagesTopicId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.filter = filter;
            this.messageThreadId = messageThreadId;
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 136051911;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of chats with non-default notification settings for new messages.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatNotificationSettingsExceptions extends Function<Chats> {
        /**
         * If specified, only chats from the scope will be returned; pass null to return chats from all scopes.
         */
        public NotificationSettingsScope scope;
        /**
         * Pass true to include in the response chats with only non-default sound.
         */
        public boolean compareSound;

        /**
         * Default constructor for a function, which returns the list of chats with non-default notification settings for new messages.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatNotificationSettingsExceptions() {
        }

        /**
         * Creates a function, which returns the list of chats with non-default notification settings for new messages.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param scope If specified, only chats from the scope will be returned; pass null to return chats from all scopes.
         * @param compareSound Pass true to include in the response chats with only non-default sound.
         */
        public GetChatNotificationSettingsExceptions(NotificationSettingsScope scope, boolean compareSound) {
            this.scope = scope;
            this.compareSound = compareSound;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 201199121;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a newest pinned message in the chat.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetChatPinnedMessage extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns information about a newest pinned message in the chat.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetChatPinnedMessage() {
        }

        /**
         * Creates a function, which returns information about a newest pinned message in the chat.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         */
        public GetChatPinnedMessage(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 359865008;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of stories that posted by the given chat to its chat page. If fromStoryId == 0, then pinned stories are returned first. Then, stories are returned in a reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
     *
     * <p> Returns {@link Stories Stories} </p>
     */
    public static class GetChatPostedToChatPageStories extends Function<Stories> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the story starting from which stories must be returned; use 0 to get results from pinned and the newest story.
         */
        public int fromStoryId;
        /**
         * The maximum number of stories to be returned For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of stories that posted by the given chat to its chat page. If fromStoryId == 0, then pinned stories are returned first. Then, stories are returned in a reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         */
        public GetChatPostedToChatPageStories() {
        }

        /**
         * Creates a function, which returns the list of stories that posted by the given chat to its chat page. If fromStoryId == 0, then pinned stories are returned first. Then, stories are returned in a reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         *
         * @param chatId Chat identifier.
         * @param fromStoryId Identifier of the story starting from which stories must be returned; use 0 to get results from pinned and the newest story.
         * @param limit The maximum number of stories to be returned For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetChatPostedToChatPageStories(long chatId, int fromStoryId, int limit) {
            this.chatId = chatId;
            this.fromStoryId = fromStoryId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -46414037;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed revenue statistics about a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true.
     *
     * <p> Returns {@link ChatRevenueStatistics ChatRevenueStatistics} </p>
     */
    public static class GetChatRevenueStatistics extends Function<ChatRevenueStatistics> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed revenue statistics about a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link ChatRevenueStatistics ChatRevenueStatistics} </p>
         */
        public GetChatRevenueStatistics() {
        }

        /**
         * Creates a function, which returns detailed revenue statistics about a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link ChatRevenueStatistics ChatRevenueStatistics} </p>
         *
         * @param chatId Chat identifier.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetChatRevenueStatistics(long chatId, boolean isDark) {
            this.chatId = chatId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 701995836;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of revenue transactions for a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true.
     *
     * <p> Returns {@link ChatRevenueTransactions ChatRevenueTransactions} </p>
     */
    public static class GetChatRevenueTransactions extends Function<ChatRevenueTransactions> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Number of transactions to skip.
         */
        public int offset;
        /**
         * The maximum number of transactions to be returned; up to 200.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of revenue transactions for a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link ChatRevenueTransactions ChatRevenueTransactions} </p>
         */
        public GetChatRevenueTransactions() {
        }

        /**
         * Creates a function, which returns the list of revenue transactions for a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link ChatRevenueTransactions ChatRevenueTransactions} </p>
         *
         * @param chatId Chat identifier.
         * @param offset Number of transactions to skip.
         * @param limit The maximum number of transactions to be returned; up to 200.
         */
        public GetChatRevenueTransactions(long chatId, int offset, int limit) {
            this.chatId = chatId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1194264341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a URL for chat revenue withdrawal; requires owner privileges in the chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true and getOption(&quot;can_withdraw_chat_revenue&quot;).
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetChatRevenueWithdrawalUrl extends Function<HttpUrl> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns a URL for chat revenue withdrawal; requires owner privileges in the chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true and getOption(&quot;can_withdraw_chat_revenue&quot;).
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetChatRevenueWithdrawalUrl() {
        }

        /**
         * Creates a function, which returns a URL for chat revenue withdrawal; requires owner privileges in the chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true and getOption(&quot;can_withdraw_chat_revenue&quot;).
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param chatId Chat identifier.
         * @param password The 2-step verification password of the current user.
         */
        public GetChatRevenueWithdrawalUrl(long chatId, String password) {
            this.chatId = chatId;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 506595104;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all scheduled messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId).
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetChatScheduledMessages extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns all scheduled messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetChatScheduledMessages() {
        }

        /**
         * Creates a function, which returns all scheduled messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatScheduledMessages(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -549638149;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate number of chats similar to the given chat.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetChatSimilarChatCount extends Function<Count> {
        /**
         * Identifier of the target chat; must be an identifier of a channel chat.
         */
        public long chatId;
        /**
         * Pass true to get the number of chats without sending network requests, or -1 if the number of chats is unknown locally.
         */
        public boolean returnLocal;

        /**
         * Default constructor for a function, which returns approximate number of chats similar to the given chat.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetChatSimilarChatCount() {
        }

        /**
         * Creates a function, which returns approximate number of chats similar to the given chat.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param chatId Identifier of the target chat; must be an identifier of a channel chat.
         * @param returnLocal Pass true to get the number of chats without sending network requests, or -1 if the number of chats is unknown locally.
         */
        public GetChatSimilarChatCount(long chatId, boolean returnLocal) {
            this.chatId = chatId;
            this.returnLocal = returnLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1178506894;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of chats similar to the given chat.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatSimilarChats extends Function<Chats> {
        /**
         * Identifier of the target chat; must be an identifier of a channel chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns a list of chats similar to the given chat.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatSimilarChats() {
        }

        /**
         * Creates a function, which returns a list of chats similar to the given chat.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatId Identifier of the target chat; must be an identifier of a channel chat.
         */
        public GetChatSimilarChats(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1152348285;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns sparse positions of messages of the specified type in the chat to be used for shared media scroll implementation. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). Cannot be used in secret chats or with searchMessagesFilterFailedToSend filter without an enabled message database.
     *
     * <p> Returns {@link MessagePositions MessagePositions} </p>
     */
    public static class GetChatSparseMessagePositions extends Function<MessagePositions> {
        /**
         * Identifier of the chat in which to return information about message positions.
         */
        public long chatId;
        /**
         * Filter for message content. Filters searchMessagesFilterEmpty, searchMessagesFilterMention, searchMessagesFilterUnreadMention, and searchMessagesFilterUnreadReaction are unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * The message identifier from which to return information about message positions.
         */
        public long fromMessageId;
        /**
         * The expected number of message positions to be returned; 50-2000. A smaller number of positions can be returned, if there are not enough appropriate messages.
         */
        public int limit;
        /**
         * If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages, or for chats other than Saved Messages.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which returns sparse positions of messages of the specified type in the chat to be used for shared media scroll implementation. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). Cannot be used in secret chats or with searchMessagesFilterFailedToSend filter without an enabled message database.
         *
         * <p> Returns {@link MessagePositions MessagePositions} </p>
         */
        public GetChatSparseMessagePositions() {
        }

        /**
         * Creates a function, which returns sparse positions of messages of the specified type in the chat to be used for shared media scroll implementation. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). Cannot be used in secret chats or with searchMessagesFilterFailedToSend filter without an enabled message database.
         *
         * <p> Returns {@link MessagePositions MessagePositions} </p>
         *
         * @param chatId Identifier of the chat in which to return information about message positions.
         * @param filter Filter for message content. Filters searchMessagesFilterEmpty, searchMessagesFilterMention, searchMessagesFilterUnreadMention, and searchMessagesFilterUnreadReaction are unsupported in this function.
         * @param fromMessageId The message identifier from which to return information about message positions.
         * @param limit The expected number of message positions to be returned; 50-2000. A smaller number of positions can be returned, if there are not enough appropriate messages.
         * @param savedMessagesTopicId If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages, or for chats other than Saved Messages.
         */
        public GetChatSparseMessagePositions(long chatId, SearchMessagesFilter filter, long fromMessageId, int limit, long savedMessagesTopicId) {
            this.chatId = chatId;
            this.filter = filter;
            this.fromMessageId = fromMessageId;
            this.limit = limit;
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 994389757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns sponsored messages to be shown in a chat; for channel chats only.
     *
     * <p> Returns {@link SponsoredMessages SponsoredMessages} </p>
     */
    public static class GetChatSponsoredMessages extends Function<SponsoredMessages> {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns sponsored messages to be shown in a chat; for channel chats only.
         *
         * <p> Returns {@link SponsoredMessages SponsoredMessages} </p>
         */
        public GetChatSponsoredMessages() {
        }

        /**
         * Creates a function, which returns sponsored messages to be shown in a chat; for channel chats only.
         *
         * <p> Returns {@link SponsoredMessages SponsoredMessages} </p>
         *
         * @param chatId Identifier of the chat.
         */
        public GetChatSponsoredMessages(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1353203864;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed statistics about a chat. Currently, this method can be used only for supergroups and channels. Can be used only if supergroupFullInfo.canGetStatistics == true.
     *
     * <p> Returns {@link ChatStatistics ChatStatistics} </p>
     */
    public static class GetChatStatistics extends Function<ChatStatistics> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed statistics about a chat. Currently, this method can be used only for supergroups and channels. Can be used only if supergroupFullInfo.canGetStatistics == true.
         *
         * <p> Returns {@link ChatStatistics ChatStatistics} </p>
         */
        public GetChatStatistics() {
        }

        /**
         * Creates a function, which returns detailed statistics about a chat. Currently, this method can be used only for supergroups and channels. Can be used only if supergroupFullInfo.canGetStatistics == true.
         *
         * <p> Returns {@link ChatStatistics ChatStatistics} </p>
         *
         * @param chatId Chat identifier.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetChatStatistics(long chatId, boolean isDark) {
            this.chatId = chatId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 327057816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns interactions with a story posted in a chat. Can be used only if story is posted on behalf of a chat and the user is an administrator in the chat.
     *
     * <p> Returns {@link StoryInteractions StoryInteractions} </p>
     */
    public static class GetChatStoryInteractions extends Function<StoryInteractions> {
        /**
         * The identifier of the sender of the story.
         */
        public long storySenderChatId;
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * Pass the default heart reaction or a suggested reaction type to receive only interactions with the specified reaction type; pass null to receive all interactions.
         */
        public ReactionType reactionType;
        /**
         * Pass true to get forwards and reposts first, then reactions, then other views; pass false to get interactions sorted just by interaction date.
         */
        public boolean preferForwards;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of story interactions to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns interactions with a story posted in a chat. Can be used only if story is posted on behalf of a chat and the user is an administrator in the chat.
         *
         * <p> Returns {@link StoryInteractions StoryInteractions} </p>
         */
        public GetChatStoryInteractions() {
        }

        /**
         * Creates a function, which returns interactions with a story posted in a chat. Can be used only if story is posted on behalf of a chat and the user is an administrator in the chat.
         *
         * <p> Returns {@link StoryInteractions StoryInteractions} </p>
         *
         * @param storySenderChatId The identifier of the sender of the story.
         * @param storyId Story identifier.
         * @param reactionType Pass the default heart reaction or a suggested reaction type to receive only interactions with the specified reaction type; pass null to receive all interactions.
         * @param preferForwards Pass true to get forwards and reposts first, then reactions, then other views; pass false to get interactions sorted just by interaction date.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of story interactions to return.
         */
        public GetChatStoryInteractions(long storySenderChatId, int storyId, ReactionType reactionType, boolean preferForwards, String offset, int limit) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
            this.reactionType = reactionType;
            this.preferForwards = preferForwards;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -974359690;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an ordered list of chats from the beginning of a chat list. For informational purposes only. Use loadChats and updates processing instead to maintain chat lists in a consistent state.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChats extends Function<Chats> {
        /**
         * The chat list in which to return chats; pass null to get chats from the main chat list.
         */
        public ChatList chatList;
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns an ordered list of chats from the beginning of a chat list. For informational purposes only. Use loadChats and updates processing instead to maintain chat lists in a consistent state.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChats() {
        }

        /**
         * Creates a function, which returns an ordered list of chats from the beginning of a chat list. For informational purposes only. Use loadChats and updates processing instead to maintain chat lists in a consistent state.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatList The chat list in which to return chats; pass null to get chats from the main chat list.
         * @param limit The maximum number of chats to be returned.
         */
        public GetChats(ChatList chatList, int limit) {
            this.chatList = chatList;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -972768574;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns identifiers of chats from a chat folder, suitable for adding to a chat folder invite link.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatsForChatFolderInviteLink extends Function<Chats> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns identifiers of chats from a chat folder, suitable for adding to a chat folder invite link.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatsForChatFolderInviteLink() {
        }

        /**
         * Creates a function, which returns identifiers of chats from a chat folder, suitable for adding to a chat folder invite link.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatsForChatFolderInviteLink(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1873561929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns supergroup and channel chats in which the current user has the right to post stories. The chats must be rechecked with canSendStory before actually trying to post a story there.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatsToSendStories extends Function<Chats> {

        /**
         * Default constructor for a function, which returns supergroup and channel chats in which the current user has the right to post stories. The chats must be rechecked with canSendStory before actually trying to post a story there.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatsToSendStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 586802084;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all close friends of the current user.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class GetCloseFriends extends Function<Users> {

        /**
         * Default constructor for a function, which returns all close friends of the current user.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public GetCloseFriends() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1445628722;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a given collectible item that was purchased at https://fragment.com.
     *
     * <p> Returns {@link CollectibleItemInfo CollectibleItemInfo} </p>
     */
    public static class GetCollectibleItemInfo extends Function<CollectibleItemInfo> {
        /**
         * Type of the collectible item. The item must be used by a user and must be visible to the current user.
         */
        public CollectibleItemType type;

        /**
         * Default constructor for a function, which returns information about a given collectible item that was purchased at https://fragment.com.
         *
         * <p> Returns {@link CollectibleItemInfo CollectibleItemInfo} </p>
         */
        public GetCollectibleItemInfo() {
        }

        /**
         * Creates a function, which returns information about a given collectible item that was purchased at https://fragment.com.
         *
         * <p> Returns {@link CollectibleItemInfo CollectibleItemInfo} </p>
         *
         * @param type Type of the collectible item. The item must be used by a user and must be visible to the current user.
         */
        public GetCollectibleItemInfo(CollectibleItemType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -217797238;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of commands supported by the bot for the given user scope and language; for bots only.
     *
     * <p> Returns {@link BotCommands BotCommands} </p>
     */
    public static class GetCommands extends Function<BotCommands> {
        /**
         * The scope to which the commands are relevant; pass null to get commands in the default bot command scope.
         */
        public BotCommandScope scope;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the list of commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link BotCommands BotCommands} </p>
         */
        public GetCommands() {
        }

        /**
         * Creates a function, which returns the list of commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link BotCommands BotCommands} </p>
         *
         * @param scope The scope to which the commands are relevant; pass null to get commands in the default bot command scope.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public GetCommands(BotCommandScope scope, String languageCode) {
            this.scope = scope;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1488621559;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all website where the current user used Telegram to log in.
     *
     * <p> Returns {@link ConnectedWebsites ConnectedWebsites} </p>
     */
    public static class GetConnectedWebsites extends Function<ConnectedWebsites> {

        /**
         * Default constructor for a function, which returns all website where the current user used Telegram to log in.
         *
         * <p> Returns {@link ConnectedWebsites ConnectedWebsites} </p>
         */
        public GetConnectedWebsites() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -170536110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all contacts of the user.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class GetContacts extends Function<Users> {

        /**
         * Default constructor for a function, which returns all contacts of the user.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public GetContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1417722768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about existing countries. Can be called before authorization.
     *
     * <p> Returns {@link Countries Countries} </p>
     */
    public static class GetCountries extends Function<Countries> {

        /**
         * Default constructor for a function, which returns information about existing countries. Can be called before authorization.
         *
         * <p> Returns {@link Countries Countries} </p>
         */
        public GetCountries() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -51902050;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Uses the current IP address to find the current country. Returns two-letter ISO 3166-1 alpha-2 country code. Can be called before authorization.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetCountryCode extends Function<Text> {

        /**
         * Default constructor for a function, which uses the current IP address to find the current country. Returns two-letter ISO 3166-1 alpha-2 country code. Can be called before authorization.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetCountryCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1540593906;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an emoji for the given country. Returns an empty string on failure. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetCountryFlagEmoji extends Function<Text> {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code as received from getCountries.
         */
        public String countryCode;

        /**
         * Default constructor for a function, which returns an emoji for the given country. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetCountryFlagEmoji() {
        }

        /**
         * Creates a function, which returns an emoji for the given country. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code as received from getCountries.
         */
        public GetCountryFlagEmoji(String countryCode) {
            this.countryCode = countryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 981871098;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of public chats of the specified type, owned by the user.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetCreatedPublicChats extends Function<Chats> {
        /**
         * Type of the public chats to return.
         */
        public PublicChatType type;

        /**
         * Default constructor for a function, which returns a list of public chats of the specified type, owned by the user.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetCreatedPublicChats() {
        }

        /**
         * Creates a function, which returns a list of public chats of the specified type, owned by the user.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param type Type of the public chats to return.
         */
        public GetCreatedPublicChats(PublicChatType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 710354415;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all updates needed to restore current TDLib state, i.e. all actual updateAuthorizationState/updateUser/updateNewChat and others. This is especially useful if TDLib is run in a separate process. Can be called before initialization.
     *
     * <p> Returns {@link Updates Updates} </p>
     */
    public static class GetCurrentState extends Function<Updates> {

        /**
         * Default constructor for a function, which returns all updates needed to restore current TDLib state, i.e. all actual updateAuthorizationState/updateUser/updateNewChat and others. This is especially useful if TDLib is run in a separate process. Can be called before initialization.
         *
         * <p> Returns {@link Updates Updates} </p>
         */
        public GetCurrentState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1191417719;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns TGS stickers with generic animations for custom emoji reactions.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetCustomEmojiReactionAnimations extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns TGS stickers with generic animations for custom emoji reactions.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetCustomEmojiReactionAnimations() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1232375250;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of custom emoji stickers by their identifiers. Stickers are returned in arbitrary order. Only found stickers are returned.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetCustomEmojiStickers extends Function<Stickers> {
        /**
         * Identifiers of custom emoji stickers. At most 200 custom emoji stickers can be received simultaneously.
         */
        public long[] customEmojiIds;

        /**
         * Default constructor for a function, which returns the list of custom emoji stickers by their identifiers. Stickers are returned in arbitrary order. Only found stickers are returned.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetCustomEmojiStickers() {
        }

        /**
         * Creates a function, which returns the list of custom emoji stickers by their identifiers. Stickers are returned in arbitrary order. Only found stickers are returned.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param customEmojiIds Identifiers of custom emoji stickers. At most 200 custom emoji stickers can be received simultaneously.
         */
        public GetCustomEmojiStickers(long[] customEmojiIds) {
            this.customEmojiIds = customEmojiIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2127427955;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns database statistics.
     *
     * <p> Returns {@link DatabaseStatistics DatabaseStatistics} </p>
     */
    public static class GetDatabaseStatistics extends Function<DatabaseStatistics> {

        /**
         * Default constructor for a function, which returns database statistics.
         *
         * <p> Returns {@link DatabaseStatistics DatabaseStatistics} </p>
         */
        public GetDatabaseStatistics() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1942760263;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a tg:// deep link. Use &quot;tg://need_update_for_some_feature&quot; or &quot;tg:someUnsupportedFeature&quot; for testing. Returns a 404 error for unknown links. Can be called before authorization.
     *
     * <p> Returns {@link DeepLinkInfo DeepLinkInfo} </p>
     */
    public static class GetDeepLinkInfo extends Function<DeepLinkInfo> {
        /**
         * The link.
         */
        public String link;

        /**
         * Default constructor for a function, which returns information about a tg:// deep link. Use &quot;tg://need_update_for_some_feature&quot; or &quot;tg:someUnsupportedFeature&quot; for testing. Returns a 404 error for unknown links. Can be called before authorization.
         *
         * <p> Returns {@link DeepLinkInfo DeepLinkInfo} </p>
         */
        public GetDeepLinkInfo() {
        }

        /**
         * Creates a function, which returns information about a tg:// deep link. Use &quot;tg://need_update_for_some_feature&quot; or &quot;tg:someUnsupportedFeature&quot; for testing. Returns a 404 error for unknown links. Can be called before authorization.
         *
         * <p> Returns {@link DeepLinkInfo DeepLinkInfo} </p>
         *
         * @param link The link.
         */
        public GetDeepLinkInfo(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 680673150;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default list of custom emoji stickers for reply background.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetDefaultBackgroundCustomEmojiStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns default list of custom emoji stickers for reply background.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetDefaultBackgroundCustomEmojiStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 485910542;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default emoji statuses for chats.
     *
     * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
     */
    public static class GetDefaultChatEmojiStatuses extends Function<EmojiStatuses> {

        /**
         * Default constructor for a function, which returns default emoji statuses for chats.
         *
         * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
         */
        public GetDefaultChatEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1481996570;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default list of custom emoji stickers for placing on a chat photo.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetDefaultChatPhotoCustomEmojiStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns default list of custom emoji stickers for placing on a chat photo.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetDefaultChatPhotoCustomEmojiStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -376342683;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default emoji statuses for self status.
     *
     * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
     */
    public static class GetDefaultEmojiStatuses extends Function<EmojiStatuses> {

        /**
         * Default constructor for a function, which returns default emoji statuses for self status.
         *
         * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
         */
        public GetDefaultEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 618946243;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default message auto-delete time setting for new chats.
     *
     * <p> Returns {@link MessageAutoDeleteTime MessageAutoDeleteTime} </p>
     */
    public static class GetDefaultMessageAutoDeleteTime extends Function<MessageAutoDeleteTime> {

        /**
         * Default constructor for a function, which returns default message auto-delete time setting for new chats.
         *
         * <p> Returns {@link MessageAutoDeleteTime MessageAutoDeleteTime} </p>
         */
        public GetDefaultMessageAutoDeleteTime() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -450857574;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default list of custom emoji stickers for placing on a profile photo.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetDefaultProfilePhotoCustomEmojiStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns default list of custom emoji stickers for placing on a profile photo.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetDefaultProfilePhotoCustomEmojiStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1280041655;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of emoji statuses, which can't be used as chat emoji status, even they are from a sticker set with isAllowedAsChatEmojiStatus == true.
     *
     * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
     */
    public static class GetDisallowedChatEmojiStatuses extends Function<EmojiStatuses> {

        /**
         * Default constructor for a function, which returns the list of emoji statuses, which can't be used as chat emoji status, even they are from a sticker set with isAllowedAsChatEmojiStatus == true.
         *
         * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
         */
        public GetDisallowedChatEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -770421344;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available emoji categories.
     *
     * <p> Returns {@link EmojiCategories EmojiCategories} </p>
     */
    public static class GetEmojiCategories extends Function<EmojiCategories> {
        /**
         * Type of emoji categories to return; pass null to get default emoji categories.
         */
        public EmojiCategoryType type;

        /**
         * Default constructor for a function, which returns available emoji categories.
         *
         * <p> Returns {@link EmojiCategories EmojiCategories} </p>
         */
        public GetEmojiCategories() {
        }

        /**
         * Creates a function, which returns available emoji categories.
         *
         * <p> Returns {@link EmojiCategories EmojiCategories} </p>
         *
         * @param type Type of emoji categories to return; pass null to get default emoji categories.
         */
        public GetEmojiCategories(EmojiCategoryType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2139537774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about an emoji reaction. Returns a 404 error if the reaction is not found.
     *
     * <p> Returns {@link EmojiReaction EmojiReaction} </p>
     */
    public static class GetEmojiReaction extends Function<EmojiReaction> {
        /**
         * Text representation of the reaction.
         */
        public String emoji;

        /**
         * Default constructor for a function, which returns information about an emoji reaction. Returns a 404 error if the reaction is not found.
         *
         * <p> Returns {@link EmojiReaction EmojiReaction} </p>
         */
        public GetEmojiReaction() {
        }

        /**
         * Creates a function, which returns information about an emoji reaction. Returns a 404 error if the reaction is not found.
         *
         * <p> Returns {@link EmojiReaction EmojiReaction} </p>
         *
         * @param emoji Text representation of the reaction.
         */
        public GetEmojiReaction(String emoji) {
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -449572388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTP URL which can be used to automatically log in to the translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetEmojiSuggestionsUrl extends Function<HttpUrl> {
        /**
         * Language code for which the emoji replacements will be suggested.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns an HTTP URL which can be used to automatically log in to the translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetEmojiSuggestionsUrl() {
        }

        /**
         * Creates a function, which returns an HTTP URL which can be used to automatically log in to the translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param languageCode Language code for which the emoji replacements will be suggested.
         */
        public GetEmojiSuggestionsUrl(String languageCode) {
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1404101841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTP URL which can be used to automatically authorize the current user on a website after clicking an HTTP link. Use the method getExternalLinkInfo to find whether a prior user confirmation is needed.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetExternalLink extends Function<HttpUrl> {
        /**
         * The HTTP link.
         */
        public String link;
        /**
         * Pass true if the current user allowed the bot, returned in getExternalLinkInfo, to send them messages.
         */
        public boolean allowWriteAccess;

        /**
         * Default constructor for a function, which returns an HTTP URL which can be used to automatically authorize the current user on a website after clicking an HTTP link. Use the method getExternalLinkInfo to find whether a prior user confirmation is needed.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetExternalLink() {
        }

        /**
         * Creates a function, which returns an HTTP URL which can be used to automatically authorize the current user on a website after clicking an HTTP link. Use the method getExternalLinkInfo to find whether a prior user confirmation is needed.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param link The HTTP link.
         * @param allowWriteAccess Pass true if the current user allowed the bot, returned in getExternalLinkInfo, to send them messages.
         */
        public GetExternalLink(String link, boolean allowWriteAccess) {
            this.link = link;
            this.allowWriteAccess = allowWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1586688235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about an action to be done when the current user clicks an external link. Don't use this method for links from secret chats if link preview is disabled in secret chats.
     *
     * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
     */
    public static class GetExternalLinkInfo extends Function<LoginUrlInfo> {
        /**
         * The link.
         */
        public String link;

        /**
         * Default constructor for a function, which returns information about an action to be done when the current user clicks an external link. Don't use this method for links from secret chats if link preview is disabled in secret chats.
         *
         * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
         */
        public GetExternalLinkInfo() {
        }

        /**
         * Creates a function, which returns information about an action to be done when the current user clicks an external link. Don't use this method for links from secret chats if link preview is disabled in secret chats.
         *
         * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
         *
         * @param link The link.
         */
        public GetExternalLinkInfo(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1175288383;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns favorite stickers.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetFavoriteStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns favorite stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetFavoriteStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -338964672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a file; this is an offline request.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class GetFile extends Function<File> {
        /**
         * Identifier of the file to get.
         */
        public int fileId;

        /**
         * Default constructor for a function, which returns information about a file; this is an offline request.
         *
         * <p> Returns {@link File File} </p>
         */
        public GetFile() {
        }

        /**
         * Creates a function, which returns information about a file; this is an offline request.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param fileId Identifier of the file to get.
         */
        public GetFile(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1553923406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns file downloaded prefix size from a given offset, in bytes.
     *
     * <p> Returns {@link FileDownloadedPrefixSize FileDownloadedPrefixSize} </p>
     */
    public static class GetFileDownloadedPrefixSize extends Function<FileDownloadedPrefixSize> {
        /**
         * Identifier of the file.
         */
        public int fileId;
        /**
         * Offset from which downloaded prefix size needs to be calculated.
         */
        public long offset;

        /**
         * Default constructor for a function, which returns file downloaded prefix size from a given offset, in bytes.
         *
         * <p> Returns {@link FileDownloadedPrefixSize FileDownloadedPrefixSize} </p>
         */
        public GetFileDownloadedPrefixSize() {
        }

        /**
         * Creates a function, which returns file downloaded prefix size from a given offset, in bytes.
         *
         * <p> Returns {@link FileDownloadedPrefixSize FileDownloadedPrefixSize} </p>
         *
         * @param fileId Identifier of the file.
         * @param offset Offset from which downloaded prefix size needs to be calculated.
         */
        public GetFileDownloadedPrefixSize(int fileId, long offset) {
            this.fileId = fileId;
            this.offset = offset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 855948589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetFileExtension extends Function<Text> {
        /**
         * The MIME type of the file.
         */
        public String mimeType;

        /**
         * Default constructor for a function, which returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetFileExtension() {
        }

        /**
         * Creates a function, which returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param mimeType The MIME type of the file.
         */
        public GetFileExtension(String mimeType) {
            this.mimeType = mimeType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -106055372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetFileMimeType extends Function<Text> {
        /**
         * The name of the file or path to the file.
         */
        public String fileName;

        /**
         * Default constructor for a function, which returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetFileMimeType() {
        }

        /**
         * Creates a function, which returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param fileName The name of the file or path to the file.
         */
        public GetFileMimeType(String fileName) {
            this.fileName = fileName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2073879671;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a forum topic.
     *
     * <p> Returns {@link ForumTopic ForumTopic} </p>
     */
    public static class GetForumTopic extends Function<ForumTopic> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Message thread identifier of the forum topic.
         */
        public long messageThreadId;

        /**
         * Default constructor for a function, which returns information about a forum topic.
         *
         * <p> Returns {@link ForumTopic ForumTopic} </p>
         */
        public GetForumTopic() {
        }

        /**
         * Creates a function, which returns information about a forum topic.
         *
         * <p> Returns {@link ForumTopic ForumTopic} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageThreadId Message thread identifier of the forum topic.
         */
        public GetForumTopic(long chatId, long messageThreadId) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -442761663;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of custom emoji, which can be used as forum topic icon by all users.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetForumTopicDefaultIcons extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns the list of custom emoji, which can be used as forum topic icon by all users.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetForumTopicDefaultIcons() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1479898332;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link to a topic in a forum chat. This is an offline request.
     *
     * <p> Returns {@link MessageLink MessageLink} </p>
     */
    public static class GetForumTopicLink extends Function<MessageLink> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Message thread identifier of the forum topic.
         */
        public long messageThreadId;

        /**
         * Default constructor for a function, which returns an HTTPS link to a topic in a forum chat. This is an offline request.
         *
         * <p> Returns {@link MessageLink MessageLink} </p>
         */
        public GetForumTopicLink() {
        }

        /**
         * Creates a function, which returns an HTTPS link to a topic in a forum chat. This is an offline request.
         *
         * <p> Returns {@link MessageLink MessageLink} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageThreadId Message thread identifier of the forum topic.
         */
        public GetForumTopicLink(long chatId, long messageThreadId) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -914650933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns found forum topics in a forum chat. This is a temporary method for getting information about topic list from the server.
     *
     * <p> Returns {@link ForumTopics ForumTopics} </p>
     */
    public static class GetForumTopics extends Function<ForumTopics> {
        /**
         * Identifier of the forum chat.
         */
        public long chatId;
        /**
         * Query to search for in the forum topic's name.
         */
        public String query;
        /**
         * The date starting from which the results need to be fetched. Use 0 or any date in the future to get results from the last topic.
         */
        public int offsetDate;
        /**
         * The message identifier of the last message in the last found topic, or 0 for the first request.
         */
        public long offsetMessageId;
        /**
         * The message thread identifier of the last found topic, or 0 for the first request.
         */
        public long offsetMessageThreadId;
        /**
         * The maximum number of forum topics to be returned; up to 100. For optimal performance, the number of returned forum topics is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns found forum topics in a forum chat. This is a temporary method for getting information about topic list from the server.
         *
         * <p> Returns {@link ForumTopics ForumTopics} </p>
         */
        public GetForumTopics() {
        }

        /**
         * Creates a function, which returns found forum topics in a forum chat. This is a temporary method for getting information about topic list from the server.
         *
         * <p> Returns {@link ForumTopics ForumTopics} </p>
         *
         * @param chatId Identifier of the forum chat.
         * @param query Query to search for in the forum topic's name.
         * @param offsetDate The date starting from which the results need to be fetched. Use 0 or any date in the future to get results from the last topic.
         * @param offsetMessageId The message identifier of the last message in the last found topic, or 0 for the first request.
         * @param offsetMessageThreadId The message thread identifier of the last found topic, or 0 for the first request.
         * @param limit The maximum number of forum topics to be returned; up to 100. For optimal performance, the number of returned forum topics is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetForumTopics(long chatId, String query, int offsetDate, long offsetMessageId, long offsetMessageThreadId, int limit) {
            this.chatId = chatId;
            this.query = query;
            this.offsetDate = offsetDate;
            this.offsetMessageId = offsetMessageId;
            this.offsetMessageThreadId = offsetMessageThreadId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -72647334;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only.
     *
     * <p> Returns {@link GameHighScores GameHighScores} </p>
     */
    public static class GetGameHighScores extends Function<GameHighScores> {
        /**
         * The chat that contains the message with the game.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only.
         *
         * <p> Returns {@link GameHighScores GameHighScores} </p>
         */
        public GetGameHighScores() {
        }

        /**
         * Creates a function, which returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only.
         *
         * <p> Returns {@link GameHighScores GameHighScores} </p>
         *
         * @param chatId The chat that contains the message with the game.
         * @param messageId Identifier of the message.
         * @param userId User identifier.
         */
        public GetGameHighScores(long chatId, long messageId, long userId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 15746459;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns greeting stickers from regular sticker sets that can be used for the start page of other users.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetGreetingStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns greeting stickers from regular sticker sets that can be used for the start page of other users.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetGreetingStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 374873372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a group call.
     *
     * <p> Returns {@link GroupCall GroupCall} </p>
     */
    public static class GetGroupCall extends Function<GroupCall> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which returns information about a group call.
         *
         * <p> Returns {@link GroupCall GroupCall} </p>
         */
        public GetGroupCall() {
        }

        /**
         * Creates a function, which returns information about a group call.
         *
         * <p> Returns {@link GroupCall GroupCall} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public GetGroupCall(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1468491406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns invite link to a video chat in a public chat.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetGroupCallInviteLink extends Function<HttpUrl> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Pass true if the invite link needs to contain an invite hash, passing which to joinGroupCall would allow the invited user to unmute themselves. Requires groupCall.canBeManaged group call flag.
         */
        public boolean canSelfUnmute;

        /**
         * Default constructor for a function, which returns invite link to a video chat in a public chat.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetGroupCallInviteLink() {
        }

        /**
         * Creates a function, which returns invite link to a video chat in a public chat.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param groupCallId Group call identifier.
         * @param canSelfUnmute Pass true if the invite link needs to contain an invite hash, passing which to joinGroupCall would allow the invited user to unmute themselves. Requires groupCall.canBeManaged group call flag.
         */
        public GetGroupCallInviteLink(int groupCallId, boolean canSelfUnmute) {
            this.groupCallId = groupCallId;
            this.canSelfUnmute = canSelfUnmute;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 719407396;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a file with a segment of a group call stream in a modified OGG format for audio or MPEG-4 format for video.
     *
     * <p> Returns {@link FilePart FilePart} </p>
     */
    public static class GetGroupCallStreamSegment extends Function<FilePart> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Point in time when the stream segment begins; Unix timestamp in milliseconds.
         */
        public long timeOffset;
        /**
         * Segment duration scale; 0-1. Segment's duration is 1000/(2**scale) milliseconds.
         */
        public int scale;
        /**
         * Identifier of an audio/video channel to get as received from tgcalls.
         */
        public int channelId;
        /**
         * Video quality as received from tgcalls; pass null to get the worst available quality.
         */
        public GroupCallVideoQuality videoQuality;

        /**
         * Default constructor for a function, which returns a file with a segment of a group call stream in a modified OGG format for audio or MPEG-4 format for video.
         *
         * <p> Returns {@link FilePart FilePart} </p>
         */
        public GetGroupCallStreamSegment() {
        }

        /**
         * Creates a function, which returns a file with a segment of a group call stream in a modified OGG format for audio or MPEG-4 format for video.
         *
         * <p> Returns {@link FilePart FilePart} </p>
         *
         * @param groupCallId Group call identifier.
         * @param timeOffset Point in time when the stream segment begins; Unix timestamp in milliseconds.
         * @param scale Segment duration scale; 0-1. Segment's duration is 1000/(2**scale) milliseconds.
         * @param channelId Identifier of an audio/video channel to get as received from tgcalls.
         * @param videoQuality Video quality as received from tgcalls; pass null to get the worst available quality.
         */
        public GetGroupCallStreamSegment(int groupCallId, long timeOffset, int scale, int channelId, GroupCallVideoQuality videoQuality) {
            this.groupCallId = groupCallId;
            this.timeOffset = timeOffset;
            this.scale = scale;
            this.channelId = channelId;
            this.videoQuality = videoQuality;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2077959515;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about available group call streams.
     *
     * <p> Returns {@link GroupCallStreams GroupCallStreams} </p>
     */
    public static class GetGroupCallStreams extends Function<GroupCallStreams> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which returns information about available group call streams.
         *
         * <p> Returns {@link GroupCallStreams GroupCallStreams} </p>
         */
        public GetGroupCallStreams() {
        }

        /**
         * Creates a function, which returns information about available group call streams.
         *
         * <p> Returns {@link GroupCallStreams GroupCallStreams} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public GetGroupCallStreams(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1619226268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of common group chats with a given user. Chats are sorted by their type and creation date.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetGroupsInCommon extends Function<Chats> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Chat identifier starting from which to return chats; use 0 for the first request.
         */
        public long offsetChatId;
        /**
         * The maximum number of chats to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns a list of common group chats with a given user. Chats are sorted by their type and creation date.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetGroupsInCommon() {
        }

        /**
         * Creates a function, which returns a list of common group chats with a given user. Chats are sorted by their type and creation date.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param userId User identifier.
         * @param offsetChatId Chat identifier starting from which to return chats; use 0 for the first request.
         * @param limit The maximum number of chats to be returned; up to 100.
         */
        public GetGroupsInCommon(long userId, long offsetChatId, int limit) {
            this.userId = userId;
            this.offsetChatId = offsetChatId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 381539178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the total number of imported contacts.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetImportedContactCount extends Function<Count> {

        /**
         * Default constructor for a function, which returns the total number of imported contacts.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetImportedContactCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -656336346;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of recently inactive supergroups and channels. Can be used when user reaches limit on the number of joined supergroups and channels and receives CHANNELSTOOMUCH error. Also, the limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetInactiveSupergroupChats extends Function<Chats> {

        /**
         * Default constructor for a function, which returns a list of recently inactive supergroups and channels. Can be used when user reaches limit on the number of joined supergroups and channels and receives CHANNELSTOOMUCH error. Also, the limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetInactiveSupergroupChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -657720907;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns game high scores and some part of the high score table in the range of the specified user; for bots only.
     *
     * <p> Returns {@link GameHighScores GameHighScores} </p>
     */
    public static class GetInlineGameHighScores extends Function<GameHighScores> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns game high scores and some part of the high score table in the range of the specified user; for bots only.
         *
         * <p> Returns {@link GameHighScores GameHighScores} </p>
         */
        public GetInlineGameHighScores() {
        }

        /**
         * Creates a function, which returns game high scores and some part of the high score table in the range of the specified user; for bots only.
         *
         * <p> Returns {@link GameHighScores GameHighScores} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param userId User identifier.
         */
        public GetInlineGameHighScores(String inlineMessageId, long userId) {
            this.inlineMessageId = inlineMessageId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -533107798;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
     *
     * <p> Returns {@link InlineQueryResults InlineQueryResults} </p>
     */
    public static class GetInlineQueryResults extends Function<InlineQueryResults> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Identifier of the chat where the query was sent.
         */
        public long chatId;
        /**
         * Location of the user; pass null if unknown or the bot doesn't need user's location.
         */
        public Location userLocation;
        /**
         * Text of the query.
         */
        public String query;
        /**
         * Offset of the first entry to return; use empty string to get the first chunk of results.
         */
        public String offset;

        /**
         * Default constructor for a function, which sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
         *
         * <p> Returns {@link InlineQueryResults InlineQueryResults} </p>
         */
        public GetInlineQueryResults() {
        }

        /**
         * Creates a function, which sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
         *
         * <p> Returns {@link InlineQueryResults InlineQueryResults} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param chatId Identifier of the chat where the query was sent.
         * @param userLocation Location of the user; pass null if unknown or the bot doesn't need user's location.
         * @param query Text of the query.
         * @param offset Offset of the first entry to return; use empty string to get the first chunk of results.
         */
        public GetInlineQueryResults(long botUserId, long chatId, Location userLocation, String query, String offset) {
            this.botUserId = botUserId;
            this.chatId = chatId;
            this.userLocation = userLocation;
            this.query = query;
            this.offset = offset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2044524652;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns backgrounds installed by the user.
     *
     * <p> Returns {@link Backgrounds Backgrounds} </p>
     */
    public static class GetInstalledBackgrounds extends Function<Backgrounds> {
        /**
         * Pass true to order returned backgrounds for a dark theme.
         */
        public boolean forDarkTheme;

        /**
         * Default constructor for a function, which returns backgrounds installed by the user.
         *
         * <p> Returns {@link Backgrounds Backgrounds} </p>
         */
        public GetInstalledBackgrounds() {
        }

        /**
         * Creates a function, which returns backgrounds installed by the user.
         *
         * <p> Returns {@link Backgrounds Backgrounds} </p>
         *
         * @param forDarkTheme Pass true to order returned backgrounds for a dark theme.
         */
        public GetInstalledBackgrounds(boolean forDarkTheme) {
            this.forDarkTheme = forDarkTheme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1051406241;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of installed sticker sets.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class GetInstalledStickerSets extends Function<StickerSets> {
        /**
         * Type of the sticker sets to return.
         */
        public StickerType stickerType;

        /**
         * Default constructor for a function, which returns a list of installed sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public GetInstalledStickerSets() {
        }

        /**
         * Creates a function, which returns a list of installed sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to return.
         */
        public GetInstalledStickerSets(StickerType stickerType) {
            this.stickerType = stickerType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1630467830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS or a tg: link with the given type. Can be called before authorization.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetInternalLink extends Function<HttpUrl> {
        /**
         * Expected type of the link.
         */
        public InternalLinkType type;
        /**
         * Pass true to create an HTTPS link (only available for some link types); pass false to create a tg: link.
         */
        public boolean isHttp;

        /**
         * Default constructor for a function, which returns an HTTPS or a tg: link with the given type. Can be called before authorization.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetInternalLink() {
        }

        /**
         * Creates a function, which returns an HTTPS or a tg: link with the given type. Can be called before authorization.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param type Expected type of the link.
         * @param isHttp Pass true to create an HTTPS link (only available for some link types); pass false to create a tg: link.
         */
        public GetInternalLink(InternalLinkType type, boolean isHttp) {
            this.type = type;
            this.isHttp = isHttp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 962654640;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the type of internal link. Returns a 404 error if the link is not internal. Can be called before authorization.
     *
     * <p> Returns {@link InternalLinkType InternalLinkType} </p>
     */
    public static class GetInternalLinkType extends Function<InternalLinkType> {
        /**
         * The link.
         */
        public String link;

        /**
         * Default constructor for a function, which returns information about the type of internal link. Returns a 404 error if the link is not internal. Can be called before authorization.
         *
         * <p> Returns {@link InternalLinkType InternalLinkType} </p>
         */
        public GetInternalLinkType() {
        }

        /**
         * Creates a function, which returns information about the type of internal link. Returns a 404 error if the link is not internal. Can be called before authorization.
         *
         * <p> Returns {@link InternalLinkType InternalLinkType} </p>
         *
         * @param link The link.
         */
        public GetInternalLinkType(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1948428535;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Converts a JsonValue object to corresponding JSON-serialized string. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetJsonString extends Function<Text> {
        /**
         * The JsonValue object.
         */
        public JsonValue jsonValue;

        /**
         * Default constructor for a function, which converts a JsonValue object to corresponding JSON-serialized string. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetJsonString() {
        }

        /**
         * Creates a function, which converts a JsonValue object to corresponding JSON-serialized string. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param jsonValue The JsonValue object.
         */
        public GetJsonString(JsonValue jsonValue) {
            this.jsonValue = jsonValue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 663458849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Converts a JSON-serialized string to corresponding JsonValue object. Can be called synchronously.
     *
     * <p> Returns {@link JsonValue JsonValue} </p>
     */
    public static class GetJsonValue extends Function<JsonValue> {
        /**
         * The JSON-serialized string.
         */
        public String json;

        /**
         * Default constructor for a function, which converts a JSON-serialized string to corresponding JsonValue object. Can be called synchronously.
         *
         * <p> Returns {@link JsonValue JsonValue} </p>
         */
        public GetJsonValue() {
        }

        /**
         * Creates a function, which converts a JSON-serialized string to corresponding JsonValue object. Can be called synchronously.
         *
         * <p> Returns {@link JsonValue JsonValue} </p>
         *
         * @param json The JSON-serialized string.
         */
        public GetJsonValue(String json) {
            this.json = json;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1829086715;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Return emojis matching the keyword. Supported only if the file database is enabled. Order of results is unspecified.
     *
     * <p> Returns {@link Emojis Emojis} </p>
     */
    public static class GetKeywordEmojis extends Function<Emojis> {
        /**
         * Text to search for.
         */
        public String text;
        /**
         * List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public String[] inputLanguageCodes;

        /**
         * Default constructor for a function, which return emojis matching the keyword. Supported only if the file database is enabled. Order of results is unspecified.
         *
         * <p> Returns {@link Emojis Emojis} </p>
         */
        public GetKeywordEmojis() {
        }

        /**
         * Creates a function, which return emojis matching the keyword. Supported only if the file database is enabled. Order of results is unspecified.
         *
         * <p> Returns {@link Emojis Emojis} </p>
         *
         * @param text Text to search for.
         * @param inputLanguageCodes List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public GetKeywordEmojis(String text, String[] inputLanguageCodes) {
            this.text = text;
            this.inputLanguageCodes = inputLanguageCodes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1969795990;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a language pack. Returned language pack identifier may be different from a provided one. Can be called before authorization.
     *
     * <p> Returns {@link LanguagePackInfo LanguagePackInfo} </p>
     */
    public static class GetLanguagePackInfo extends Function<LanguagePackInfo> {
        /**
         * Language pack identifier.
         */
        public String languagePackId;

        /**
         * Default constructor for a function, which returns information about a language pack. Returned language pack identifier may be different from a provided one. Can be called before authorization.
         *
         * <p> Returns {@link LanguagePackInfo LanguagePackInfo} </p>
         */
        public GetLanguagePackInfo() {
        }

        /**
         * Creates a function, which returns information about a language pack. Returned language pack identifier may be different from a provided one. Can be called before authorization.
         *
         * <p> Returns {@link LanguagePackInfo LanguagePackInfo} </p>
         *
         * @param languagePackId Language pack identifier.
         */
        public GetLanguagePackInfo(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2077809320;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a string stored in the local database from the specified localization target and language pack by its key. Returns a 404 error if the string is not found. Can be called synchronously.
     *
     * <p> Returns {@link LanguagePackStringValue LanguagePackStringValue} </p>
     */
    public static class GetLanguagePackString extends Function<LanguagePackStringValue> {
        /**
         * Path to the language pack database in which strings are stored.
         */
        public String languagePackDatabasePath;
        /**
         * Localization target to which the language pack belongs.
         */
        public String localizationTarget;
        /**
         * Language pack identifier.
         */
        public String languagePackId;
        /**
         * Language pack key of the string to be returned.
         */
        public String key;

        /**
         * Default constructor for a function, which returns a string stored in the local database from the specified localization target and language pack by its key. Returns a 404 error if the string is not found. Can be called synchronously.
         *
         * <p> Returns {@link LanguagePackStringValue LanguagePackStringValue} </p>
         */
        public GetLanguagePackString() {
        }

        /**
         * Creates a function, which returns a string stored in the local database from the specified localization target and language pack by its key. Returns a 404 error if the string is not found. Can be called synchronously.
         *
         * <p> Returns {@link LanguagePackStringValue LanguagePackStringValue} </p>
         *
         * @param languagePackDatabasePath Path to the language pack database in which strings are stored.
         * @param localizationTarget Localization target to which the language pack belongs.
         * @param languagePackId Language pack identifier.
         * @param key Language pack key of the string to be returned.
         */
        public GetLanguagePackString(String languagePackDatabasePath, String localizationTarget, String languagePackId, String key) {
            this.languagePackDatabasePath = languagePackDatabasePath;
            this.localizationTarget = localizationTarget;
            this.languagePackId = languagePackId;
            this.key = key;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 150789747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns strings from a language pack in the current localization target by their keys. Can be called before authorization.
     *
     * <p> Returns {@link LanguagePackStrings LanguagePackStrings} </p>
     */
    public static class GetLanguagePackStrings extends Function<LanguagePackStrings> {
        /**
         * Language pack identifier of the strings to be returned.
         */
        public String languagePackId;
        /**
         * Language pack keys of the strings to be returned; leave empty to request all available strings.
         */
        public String[] keys;

        /**
         * Default constructor for a function, which returns strings from a language pack in the current localization target by their keys. Can be called before authorization.
         *
         * <p> Returns {@link LanguagePackStrings LanguagePackStrings} </p>
         */
        public GetLanguagePackStrings() {
        }

        /**
         * Creates a function, which returns strings from a language pack in the current localization target by their keys. Can be called before authorization.
         *
         * <p> Returns {@link LanguagePackStrings LanguagePackStrings} </p>
         *
         * @param languagePackId Language pack identifier of the strings to be returned.
         * @param keys Language pack keys of the strings to be returned; leave empty to request all available strings.
         */
        public GetLanguagePackStrings(String languagePackId, String[] keys) {
            this.languagePackId = languagePackId;
            this.keys = keys;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1246259088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a link preview by the text of a message. Do not call this function too often. Returns a 404 error if the text has no link preview.
     *
     * <p> Returns {@link LinkPreview LinkPreview} </p>
     */
    public static class GetLinkPreview extends Function<LinkPreview> {
        /**
         * Message text with formatting.
         */
        public FormattedText text;
        /**
         * Options to be used for generation of the link preview; pass null to use default link preview options.
         */
        public LinkPreviewOptions linkPreviewOptions;

        /**
         * Default constructor for a function, which returns a link preview by the text of a message. Do not call this function too often. Returns a 404 error if the text has no link preview.
         *
         * <p> Returns {@link LinkPreview LinkPreview} </p>
         */
        public GetLinkPreview() {
        }

        /**
         * Creates a function, which returns a link preview by the text of a message. Do not call this function too often. Returns a 404 error if the text has no link preview.
         *
         * <p> Returns {@link LinkPreview LinkPreview} </p>
         *
         * @param text Message text with formatting.
         * @param linkPreviewOptions Options to be used for generation of the link preview; pass null to use default link preview options.
         */
        public GetLinkPreview(FormattedText text, LinkPreviewOptions linkPreviewOptions) {
            this.text = text;
            this.linkPreviewOptions = linkPreviewOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1039572191;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the current localization target. This is an offline request if onlyLocal is true. Can be called before authorization.
     *
     * <p> Returns {@link LocalizationTargetInfo LocalizationTargetInfo} </p>
     */
    public static class GetLocalizationTargetInfo extends Function<LocalizationTargetInfo> {
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which returns information about the current localization target. This is an offline request if onlyLocal is true. Can be called before authorization.
         *
         * <p> Returns {@link LocalizationTargetInfo LocalizationTargetInfo} </p>
         */
        public GetLocalizationTargetInfo() {
        }

        /**
         * Creates a function, which returns information about the current localization target. This is an offline request if onlyLocal is true. Can be called before authorization.
         *
         * <p> Returns {@link LocalizationTargetInfo LocalizationTargetInfo} </p>
         *
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public GetLocalizationTargetInfo(boolean onlyLocal) {
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1849499526;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about currently used log stream for internal logging of TDLib. Can be called synchronously.
     *
     * <p> Returns {@link LogStream LogStream} </p>
     */
    public static class GetLogStream extends Function<LogStream> {

        /**
         * Default constructor for a function, which returns information about currently used log stream for internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link LogStream LogStream} </p>
         */
        public GetLogStream() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1167608667;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns current verbosity level for a specified TDLib internal log tag. Can be called synchronously.
     *
     * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
     */
    public static class GetLogTagVerbosityLevel extends Function<LogVerbosityLevel> {
        /**
         * Logging tag to change verbosity level.
         */
        public String tag;

        /**
         * Default constructor for a function, which returns current verbosity level for a specified TDLib internal log tag. Can be called synchronously.
         *
         * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
         */
        public GetLogTagVerbosityLevel() {
        }

        /**
         * Creates a function, which returns current verbosity level for a specified TDLib internal log tag. Can be called synchronously.
         *
         * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
         *
         * @param tag Logging tag to change verbosity level.
         */
        public GetLogTagVerbosityLevel(String tag) {
            this.tag = tag;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 951004547;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of available TDLib internal log tags, for example, [&quot;actor&quot;, &quot;binlog&quot;, &quot;connections&quot;, &quot;notifications&quot;, &quot;proxy&quot;]. Can be called synchronously.
     *
     * <p> Returns {@link LogTags LogTags} </p>
     */
    public static class GetLogTags extends Function<LogTags> {

        /**
         * Default constructor for a function, which returns the list of available TDLib internal log tags, for example, [&quot;actor&quot;, &quot;binlog&quot;, &quot;connections&quot;, &quot;notifications&quot;, &quot;proxy&quot;]. Can be called synchronously.
         *
         * <p> Returns {@link LogTags LogTags} </p>
         */
        public GetLogTags() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -254449190;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns current verbosity level of the internal logging of TDLib. Can be called synchronously.
     *
     * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
     */
    public static class GetLogVerbosityLevel extends Function<LogVerbosityLevel> {

        /**
         * Default constructor for a function, which returns current verbosity level of the internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
         */
        public GetLogVerbosityLevel() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 594057956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTP URL which can be used to automatically authorize the user on a website after clicking an inline button of type inlineKeyboardButtonTypeLoginUrl. Use the method getLoginUrlInfo to find whether a prior user confirmation is needed. If an error is returned, then the button must be handled as an ordinary URL button.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetLoginUrl extends Function<HttpUrl> {
        /**
         * Chat identifier of the message with the button.
         */
        public long chatId;
        /**
         * Message identifier of the message with the button.
         */
        public long messageId;
        /**
         * Button identifier.
         */
        public long buttonId;
        /**
         * Pass true to allow the bot to send messages to the current user.
         */
        public boolean allowWriteAccess;

        /**
         * Default constructor for a function, which returns an HTTP URL which can be used to automatically authorize the user on a website after clicking an inline button of type inlineKeyboardButtonTypeLoginUrl. Use the method getLoginUrlInfo to find whether a prior user confirmation is needed. If an error is returned, then the button must be handled as an ordinary URL button.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetLoginUrl() {
        }

        /**
         * Creates a function, which returns an HTTP URL which can be used to automatically authorize the user on a website after clicking an inline button of type inlineKeyboardButtonTypeLoginUrl. Use the method getLoginUrlInfo to find whether a prior user confirmation is needed. If an error is returned, then the button must be handled as an ordinary URL button.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param chatId Chat identifier of the message with the button.
         * @param messageId Message identifier of the message with the button.
         * @param buttonId Button identifier.
         * @param allowWriteAccess Pass true to allow the bot to send messages to the current user.
         */
        public GetLoginUrl(long chatId, long messageId, long buttonId, boolean allowWriteAccess) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.buttonId = buttonId;
            this.allowWriteAccess = allowWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 791844305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a button of type inlineKeyboardButtonTypeLoginUrl. The method needs to be called when the user presses the button.
     *
     * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
     */
    public static class GetLoginUrlInfo extends Function<LoginUrlInfo> {
        /**
         * Chat identifier of the message with the button.
         */
        public long chatId;
        /**
         * Message identifier of the message with the button.
         */
        public long messageId;
        /**
         * Button identifier.
         */
        public long buttonId;

        /**
         * Default constructor for a function, which returns information about a button of type inlineKeyboardButtonTypeLoginUrl. The method needs to be called when the user presses the button.
         *
         * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
         */
        public GetLoginUrlInfo() {
        }

        /**
         * Creates a function, which returns information about a button of type inlineKeyboardButtonTypeLoginUrl. The method needs to be called when the user presses the button.
         *
         * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
         *
         * @param chatId Chat identifier of the message with the button.
         * @param messageId Message identifier of the message with the button.
         * @param buttonId Button identifier.
         */
        public GetLoginUrlInfo(long chatId, long messageId, long buttonId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.buttonId = buttonId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -859202125;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a file with a map thumbnail in PNG format. Only map thumbnail files with size less than 1MB can be downloaded.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class GetMapThumbnailFile extends Function<File> {
        /**
         * Location of the map center.
         */
        public Location location;
        /**
         * Map zoom level; 13-20.
         */
        public int zoom;
        /**
         * Map width in pixels before applying scale; 16-1024.
         */
        public int width;
        /**
         * Map height in pixels before applying scale; 16-1024.
         */
        public int height;
        /**
         * Map scale; 1-3.
         */
        public int scale;
        /**
         * Identifier of a chat in which the thumbnail will be shown. Use 0 if unknown.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns information about a file with a map thumbnail in PNG format. Only map thumbnail files with size less than 1MB can be downloaded.
         *
         * <p> Returns {@link File File} </p>
         */
        public GetMapThumbnailFile() {
        }

        /**
         * Creates a function, which returns information about a file with a map thumbnail in PNG format. Only map thumbnail files with size less than 1MB can be downloaded.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param location Location of the map center.
         * @param zoom Map zoom level; 13-20.
         * @param width Map width in pixels before applying scale; 16-1024.
         * @param height Map height in pixels before applying scale; 16-1024.
         * @param scale Map scale; 1-3.
         * @param chatId Identifier of a chat in which the thumbnail will be shown. Use 0 if unknown.
         */
        public GetMapThumbnailFile(Location location, int zoom, int width, int height, int scale, long chatId) {
            this.location = location;
            this.zoom = zoom;
            this.width = width;
            this.height = height;
            this.scale = scale;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -152660070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces text entities with Markdown formatting in a human-friendly format. Entities that can't be represented in Markdown unambiguously are kept as is. Can be called synchronously.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class GetMarkdownText extends Function<FormattedText> {
        /**
         * The text.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which replaces text entities with Markdown formatting in a human-friendly format. Entities that can't be represented in Markdown unambiguously are kept as is. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public GetMarkdownText() {
        }

        /**
         * Creates a function, which replaces text entities with Markdown formatting in a human-friendly format. Entities that can't be represented in Markdown unambiguously are kept as is. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text The text.
         */
        public GetMarkdownText(FormattedText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164524584;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current user.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class GetMe extends Function<User> {

        /**
         * Default constructor for a function, which returns the current user.
         *
         * <p> Returns {@link User User} </p>
         */
        public GetMe() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -191516033;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns menu button set by the bot for the given user; for bots only.
     *
     * <p> Returns {@link BotMenuButton BotMenuButton} </p>
     */
    public static class GetMenuButton extends Function<BotMenuButton> {
        /**
         * Identifier of the user or 0 to get the default menu button.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns menu button set by the bot for the given user; for bots only.
         *
         * <p> Returns {@link BotMenuButton BotMenuButton} </p>
         */
        public GetMenuButton() {
        }

        /**
         * Creates a function, which returns menu button set by the bot for the given user; for bots only.
         *
         * <p> Returns {@link BotMenuButton BotMenuButton} </p>
         *
         * @param userId Identifier of the user or 0 to get the default menu button.
         */
        public GetMenuButton(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -437324736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetMessage extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message to get.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetMessage() {
        }

        /**
         * Creates a function, which returns information about a message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         * @param messageId Identifier of the message to get.
         */
        public GetMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1821196160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns reactions added for a message, along with their sender.
     *
     * <p> Returns {@link AddedReactions AddedReactions} </p>
     */
    public static class GetMessageAddedReactions extends Function<AddedReactions> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Type of the reactions to return; pass null to return all added reactions.
         */
        public ReactionType reactionType;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of reactions to be returned; must be positive and can't be greater than 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns reactions added for a message, along with their sender.
         *
         * <p> Returns {@link AddedReactions AddedReactions} </p>
         */
        public GetMessageAddedReactions() {
        }

        /**
         * Creates a function, which returns reactions added for a message, along with their sender.
         *
         * <p> Returns {@link AddedReactions AddedReactions} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param reactionType Type of the reactions to return; pass null to return all added reactions.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of reactions to be returned; must be positive and can't be greater than 100.
         */
        public GetMessageAddedReactions(long chatId, long messageId, ReactionType reactionType, String offset, int limit) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.reactionType = reactionType;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2110172754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns reactions, which can be added to a message. The list can change after updateActiveEmojiReactions, updateChatAvailableReactions for the chat, or updateMessageInteractionInfo for the message.
     *
     * <p> Returns {@link AvailableReactions AvailableReactions} </p>
     */
    public static class GetMessageAvailableReactions extends Function<AvailableReactions> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Number of reaction per row, 5-25.
         */
        public int rowSize;

        /**
         * Default constructor for a function, which returns reactions, which can be added to a message. The list can change after updateActiveEmojiReactions, updateChatAvailableReactions for the chat, or updateMessageInteractionInfo for the message.
         *
         * <p> Returns {@link AvailableReactions AvailableReactions} </p>
         */
        public GetMessageAvailableReactions() {
        }

        /**
         * Creates a function, which returns reactions, which can be added to a message. The list can change after updateActiveEmojiReactions, updateChatAvailableReactions for the chat, or updateMessageInteractionInfo for the message.
         *
         * <p> Returns {@link AvailableReactions AvailableReactions} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param rowSize Number of reaction per row, 5-25.
         */
        public GetMessageAvailableReactions(long chatId, long messageId, int rowSize) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.rowSize = rowSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1994098354;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message effect. Returns a 404 error if the effect is not found.
     *
     * <p> Returns {@link MessageEffect MessageEffect} </p>
     */
    public static class GetMessageEffect extends Function<MessageEffect> {
        /**
         * Unique identifier of the effect.
         */
        public long effectId;

        /**
         * Default constructor for a function, which returns information about a message effect. Returns a 404 error if the effect is not found.
         *
         * <p> Returns {@link MessageEffect MessageEffect} </p>
         */
        public GetMessageEffect() {
        }

        /**
         * Creates a function, which returns information about a message effect. Returns a 404 error if the effect is not found.
         *
         * <p> Returns {@link MessageEffect MessageEffect} </p>
         *
         * @param effectId Unique identifier of the effect.
         */
        public GetMessageEffect(long effectId) {
            this.effectId = effectId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1638843116;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTML code for embedding the message. Available only for messages in supergroups and channels with a username.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetMessageEmbeddingCode extends Function<Text> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Pass true to return an HTML code for embedding of the whole media album.
         */
        public boolean forAlbum;

        /**
         * Default constructor for a function, which returns an HTML code for embedding the message. Available only for messages in supergroups and channels with a username.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetMessageEmbeddingCode() {
        }

        /**
         * Creates a function, which returns an HTML code for embedding the message. Available only for messages in supergroups and channels with a username.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param forAlbum Pass true to return an HTML code for embedding of the whole media album.
         */
        public GetMessageEmbeddingCode(long chatId, long messageId, boolean forAlbum) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.forAlbum = forAlbum;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1654967561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a file with messages exported from another application.
     *
     * <p> Returns {@link MessageFileType MessageFileType} </p>
     */
    public static class GetMessageFileType extends Function<MessageFileType> {
        /**
         * Beginning of the message file; up to 100 first lines.
         */
        public String messageFileHead;

        /**
         * Default constructor for a function, which returns information about a file with messages exported from another application.
         *
         * <p> Returns {@link MessageFileType MessageFileType} </p>
         */
        public GetMessageFileType() {
        }

        /**
         * Creates a function, which returns information about a file with messages exported from another application.
         *
         * <p> Returns {@link MessageFileType MessageFileType} </p>
         *
         * @param messageFileHead Beginning of the message file; up to 100 first lines.
         */
        public GetMessageFileType(String messageFileHead) {
            this.messageFileHead = messageFileHead;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -490270764;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a confirmation text to be shown to the user before starting message import.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetMessageImportConfirmationText extends Function<Text> {
        /**
         * Identifier of a chat to which the messages will be imported. It must be an identifier of a private chat with a mutual contact or an identifier of a supergroup chat with canChangeInfo member right.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns a confirmation text to be shown to the user before starting message import.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetMessageImportConfirmationText() {
        }

        /**
         * Creates a function, which returns a confirmation text to be shown to the user before starting message import.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param chatId Identifier of a chat to which the messages will be imported. It must be an identifier of a private chat with a mutual contact or an identifier of a supergroup chat with canChangeInfo member right.
         */
        public GetMessageImportConfirmationText(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 390627752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link to a message in a chat. Available only for already sent messages in supergroups and channels, or if message.canGetMediaTimestampLinks and a media timestamp link is generated. This is an offline request.
     *
     * <p> Returns {@link MessageLink MessageLink} </p>
     */
    public static class GetMessageLink extends Function<MessageLink> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * If not 0, timestamp from which the video/audio/video note/voice note/story playing must start, in seconds. The media can be in the message content or in its link preview.
         */
        public int mediaTimestamp;
        /**
         * Pass true to create a link for the whole media album.
         */
        public boolean forAlbum;
        /**
         * Pass true to create a link to the message as a channel post comment, in a message thread, or a forum topic.
         */
        public boolean inMessageThread;

        /**
         * Default constructor for a function, which returns an HTTPS link to a message in a chat. Available only for already sent messages in supergroups and channels, or if message.canGetMediaTimestampLinks and a media timestamp link is generated. This is an offline request.
         *
         * <p> Returns {@link MessageLink MessageLink} </p>
         */
        public GetMessageLink() {
        }

        /**
         * Creates a function, which returns an HTTPS link to a message in a chat. Available only for already sent messages in supergroups and channels, or if message.canGetMediaTimestampLinks and a media timestamp link is generated. This is an offline request.
         *
         * <p> Returns {@link MessageLink MessageLink} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param mediaTimestamp If not 0, timestamp from which the video/audio/video note/voice note/story playing must start, in seconds. The media can be in the message content or in its link preview.
         * @param forAlbum Pass true to create a link for the whole media album.
         * @param inMessageThread Pass true to create a link to the message as a channel post comment, in a message thread, or a forum topic.
         */
        public GetMessageLink(long chatId, long messageId, int mediaTimestamp, boolean forAlbum, boolean inMessageThread) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.mediaTimestamp = mediaTimestamp;
            this.forAlbum = forAlbum;
            this.inMessageThread = inMessageThread;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -984158342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a public or private message link. Can be called for any internal link of the type internalLinkTypeMessage.
     *
     * <p> Returns {@link MessageLinkInfo MessageLinkInfo} </p>
     */
    public static class GetMessageLinkInfo extends Function<MessageLinkInfo> {
        /**
         * The message link.
         */
        public String url;

        /**
         * Default constructor for a function, which returns information about a public or private message link. Can be called for any internal link of the type internalLinkTypeMessage.
         *
         * <p> Returns {@link MessageLinkInfo MessageLinkInfo} </p>
         */
        public GetMessageLinkInfo() {
        }

        /**
         * Creates a function, which returns information about a public or private message link. Can be called for any internal link of the type internalLinkTypeMessage.
         *
         * <p> Returns {@link MessageLinkInfo MessageLinkInfo} </p>
         *
         * @param url The message link.
         */
        public GetMessageLinkInfo(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -700533672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message, if it is available without sending network request. This is an offline request.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetMessageLocally extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message to get.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a message, if it is available without sending network request. This is an offline request.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetMessageLocally() {
        }

        /**
         * Creates a function, which returns information about a message, if it is available without sending network request. This is an offline request.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         * @param messageId Identifier of the message to get.
         */
        public GetMessageLocally(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -603575444;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns forwarded copies of a channel message to different public channels and public reposts as a story. Can be used only if message.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
     *
     * <p> Returns {@link PublicForwards PublicForwards} </p>
     */
    public static class GetMessagePublicForwards extends Function<PublicForwards> {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages and stories to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns forwarded copies of a channel message to different public channels and public reposts as a story. Can be used only if message.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
         *
         * <p> Returns {@link PublicForwards PublicForwards} </p>
         */
        public GetMessagePublicForwards() {
        }

        /**
         * Creates a function, which returns forwarded copies of a channel message to different public channels and public reposts as a story. Can be used only if message.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
         *
         * <p> Returns {@link PublicForwards PublicForwards} </p>
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Message identifier.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages and stories to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetMessagePublicForwards(long chatId, long messageId, String offset, int limit) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1369285812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns read date of a recent outgoing message in a private chat. The method can be called if message.canGetReadDate == true and the message is read.
     *
     * <p> Returns {@link MessageReadDate MessageReadDate} </p>
     */
    public static class GetMessageReadDate extends Function<MessageReadDate> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns read date of a recent outgoing message in a private chat. The method can be called if message.canGetReadDate == true and the message is read.
         *
         * <p> Returns {@link MessageReadDate MessageReadDate} </p>
         */
        public GetMessageReadDate() {
        }

        /**
         * Creates a function, which returns read date of a recent outgoing message in a private chat. The method can be called if message.canGetReadDate == true and the message is read.
         *
         * <p> Returns {@link MessageReadDate MessageReadDate} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         */
        public GetMessageReadDate(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1484455101;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed statistics about a message. Can be used only if message.canGetStatistics == true.
     *
     * <p> Returns {@link MessageStatistics MessageStatistics} </p>
     */
    public static class GetMessageStatistics extends Function<MessageStatistics> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed statistics about a message. Can be used only if message.canGetStatistics == true.
         *
         * <p> Returns {@link MessageStatistics MessageStatistics} </p>
         */
        public GetMessageStatistics() {
        }

        /**
         * Creates a function, which returns detailed statistics about a message. Can be used only if message.canGetStatistics == true.
         *
         * <p> Returns {@link MessageStatistics MessageStatistics} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetMessageStatistics(long chatId, long messageId, boolean isDark) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1270194648;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message thread. Can be used only if message.canGetMessageThread == true.
     *
     * <p> Returns {@link MessageThreadInfo MessageThreadInfo} </p>
     */
    public static class GetMessageThread extends Function<MessageThreadInfo> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a message thread. Can be used only if message.canGetMessageThread == true.
         *
         * <p> Returns {@link MessageThreadInfo MessageThreadInfo} </p>
         */
        public GetMessageThread() {
        }

        /**
         * Creates a function, which returns information about a message thread. Can be used only if message.canGetMessageThread == true.
         *
         * <p> Returns {@link MessageThreadInfo MessageThreadInfo} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         */
        public GetMessageThread(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2062695998;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in a message thread of a message. Can be used only if message.canGetMessageThread == true. Message thread of a channel message is in the channel's linked supergroup. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetMessageThreadHistory extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier, which thread history needs to be returned.
         */
        public long messageId;
        /**
         * Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative offset up to 99 to get additionally some newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns messages in a message thread of a message. Can be used only if message.canGetMessageThread == true. Message thread of a channel message is in the channel's linked supergroup. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetMessageThreadHistory() {
        }

        /**
         * Creates a function, which returns messages in a message thread of a message. Can be used only if message.canGetMessageThread == true. Message thread of a channel message is in the channel's linked supergroup. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier, which thread history needs to be returned.
         * @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative offset up to 99 to get additionally some newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetMessageThreadHistory(long chatId, long messageId, long fromMessageId, int offset, int limit) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1808411608;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns viewers of a recent outgoing message in a basic group or a supergroup chat. For video notes and voice notes only users, opened content of the message, are returned. The method can be called if message.canGetViewers == true.
     *
     * <p> Returns {@link MessageViewers MessageViewers} </p>
     */
    public static class GetMessageViewers extends Function<MessageViewers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns viewers of a recent outgoing message in a basic group or a supergroup chat. For video notes and voice notes only users, opened content of the message, are returned. The method can be called if message.canGetViewers == true.
         *
         * <p> Returns {@link MessageViewers MessageViewers} </p>
         */
        public GetMessageViewers() {
        }

        /**
         * Creates a function, which returns viewers of a recent outgoing message in a basic group or a supergroup chat. For video notes and voice notes only users, opened content of the message, are returned. The method can be called if message.canGetViewers == true.
         *
         * <p> Returns {@link MessageViewers MessageViewers} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         */
        public GetMessageViewers(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1584457010;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about messages. If a message is not found, returns null on the corresponding position of the result.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetMessages extends Function<Messages> {
        /**
         * Identifier of the chat the messages belong to.
         */
        public long chatId;
        /**
         * Identifiers of the messages to get.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which returns information about messages. If a message is not found, returns null on the corresponding position of the result.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetMessages() {
        }

        /**
         * Creates a function, which returns information about messages. If a message is not found, returns null on the corresponding position of the result.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Identifier of the chat the messages belong to.
         * @param messageIds Identifiers of the messages to get.
         */
        public GetMessages(long chatId, long[] messageIds) {
            this.chatId = chatId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 425299338;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns network data usage statistics. Can be called before authorization.
     *
     * <p> Returns {@link NetworkStatistics NetworkStatistics} </p>
     */
    public static class GetNetworkStatistics extends Function<NetworkStatistics> {
        /**
         * Pass true to get statistics only for the current library launch.
         */
        public boolean onlyCurrent;

        /**
         * Default constructor for a function, which returns network data usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link NetworkStatistics NetworkStatistics} </p>
         */
        public GetNetworkStatistics() {
        }

        /**
         * Creates a function, which returns network data usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link NetworkStatistics NetworkStatistics} </p>
         *
         * @param onlyCurrent Pass true to get statistics only for the current library launch.
         */
        public GetNetworkStatistics(boolean onlyCurrent) {
            this.onlyCurrent = onlyCurrent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -986228706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns privacy settings for new chat creation.
     *
     * <p> Returns {@link NewChatPrivacySettings NewChatPrivacySettings} </p>
     */
    public static class GetNewChatPrivacySettings extends Function<NewChatPrivacySettings> {

        /**
         * Default constructor for a function, which returns privacy settings for new chat creation.
         *
         * <p> Returns {@link NewChatPrivacySettings NewChatPrivacySettings} </p>
         */
        public GetNewChatPrivacySettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1295299657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization. Can be called synchronously for options &quot;version&quot; and &quot;commit_hash&quot;.
     *
     * <p> Returns {@link OptionValue OptionValue} </p>
     */
    public static class GetOption extends Function<OptionValue> {
        /**
         * The name of the option.
         */
        public String name;

        /**
         * Default constructor for a function, which returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization. Can be called synchronously for options &quot;version&quot; and &quot;commit_hash&quot;.
         *
         * <p> Returns {@link OptionValue OptionValue} </p>
         */
        public GetOption() {
        }

        /**
         * Creates a function, which returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization. Can be called synchronously for options &quot;version&quot; and &quot;commit_hash&quot;.
         *
         * <p> Returns {@link OptionValue OptionValue} </p>
         *
         * @param name The name of the option.
         */
        public GetOption(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1572495746;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns sticker sets owned by the current user.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class GetOwnedStickerSets extends Function<StickerSets> {
        /**
         * Identifier of the sticker set from which to return owned sticker sets; use 0 to get results from the beginning.
         */
        public long offsetStickerSetId;
        /**
         * The maximum number of sticker sets to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns sticker sets owned by the current user.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public GetOwnedStickerSets() {
        }

        /**
         * Creates a function, which returns sticker sets owned by the current user.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param offsetStickerSetId Identifier of the sticker set from which to return owned sticker sets; use 0 to get results from the beginning.
         * @param limit The maximum number of sticker sets to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetOwnedStickerSets(long offsetStickerSetId, int limit) {
            this.offsetStickerSetId = offsetStickerSetId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1493074208;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a Telegram Passport authorization form for sharing data with a service.
     *
     * <p> Returns {@link PassportAuthorizationForm PassportAuthorizationForm} </p>
     */
    public static class GetPassportAuthorizationForm extends Function<PassportAuthorizationForm> {
        /**
         * User identifier of the service's bot.
         */
        public long botUserId;
        /**
         * Telegram Passport element types requested by the service.
         */
        public String scope;
        /**
         * Service's public key.
         */
        public String publicKey;
        /**
         * Unique request identifier provided by the service.
         */
        public String nonce;

        /**
         * Default constructor for a function, which returns a Telegram Passport authorization form for sharing data with a service.
         *
         * <p> Returns {@link PassportAuthorizationForm PassportAuthorizationForm} </p>
         */
        public GetPassportAuthorizationForm() {
        }

        /**
         * Creates a function, which returns a Telegram Passport authorization form for sharing data with a service.
         *
         * <p> Returns {@link PassportAuthorizationForm PassportAuthorizationForm} </p>
         *
         * @param botUserId User identifier of the service's bot.
         * @param scope Telegram Passport element types requested by the service.
         * @param publicKey Service's public key.
         * @param nonce Unique request identifier provided by the service.
         */
        public GetPassportAuthorizationForm(long botUserId, String scope, String publicKey, String nonce) {
            this.botUserId = botUserId;
            this.scope = scope;
            this.publicKey = publicKey;
            this.nonce = nonce;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1636107398;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns already available Telegram Passport elements suitable for completing a Telegram Passport authorization form. Result can be received only once for each authorization form.
     *
     * <p> Returns {@link PassportElementsWithErrors PassportElementsWithErrors} </p>
     */
    public static class GetPassportAuthorizationFormAvailableElements extends Function<PassportElementsWithErrors> {
        /**
         * Authorization form identifier.
         */
        public int authorizationFormId;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns already available Telegram Passport elements suitable for completing a Telegram Passport authorization form. Result can be received only once for each authorization form.
         *
         * <p> Returns {@link PassportElementsWithErrors PassportElementsWithErrors} </p>
         */
        public GetPassportAuthorizationFormAvailableElements() {
        }

        /**
         * Creates a function, which returns already available Telegram Passport elements suitable for completing a Telegram Passport authorization form. Result can be received only once for each authorization form.
         *
         * <p> Returns {@link PassportElementsWithErrors PassportElementsWithErrors} </p>
         *
         * @param authorizationFormId Authorization form identifier.
         * @param password The 2-step verification password of the current user.
         */
        public GetPassportAuthorizationFormAvailableElements(int authorizationFormId, String password) {
            this.authorizationFormId = authorizationFormId;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1068700924;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns one of the available Telegram Passport elements.
     *
     * <p> Returns {@link PassportElement PassportElement} </p>
     */
    public static class GetPassportElement extends Function<PassportElement> {
        /**
         * Telegram Passport element type.
         */
        public PassportElementType type;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns one of the available Telegram Passport elements.
         *
         * <p> Returns {@link PassportElement PassportElement} </p>
         */
        public GetPassportElement() {
        }

        /**
         * Creates a function, which returns one of the available Telegram Passport elements.
         *
         * <p> Returns {@link PassportElement PassportElement} </p>
         *
         * @param type Telegram Passport element type.
         * @param password The 2-step verification password of the current user.
         */
        public GetPassportElement(PassportElementType type, String password) {
            this.type = type;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1882398342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current state of 2-step verification.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class GetPasswordState extends Function<PasswordState> {

        /**
         * Default constructor for a function, which returns the current state of 2-step verification.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public GetPasswordState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -174752904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an invoice payment form. This method must be called when the user presses inline button of the type inlineKeyboardButtonTypeBuy, or wants to buy access to media in a messagePaidMedia message.
     *
     * <p> Returns {@link PaymentForm PaymentForm} </p>
     */
    public static class GetPaymentForm extends Function<PaymentForm> {
        /**
         * The invoice.
         */
        public InputInvoice inputInvoice;
        /**
         * Preferred payment form theme; pass null to use the default theme.
         */
        public ThemeParameters theme;

        /**
         * Default constructor for a function, which returns an invoice payment form. This method must be called when the user presses inline button of the type inlineKeyboardButtonTypeBuy, or wants to buy access to media in a messagePaidMedia message.
         *
         * <p> Returns {@link PaymentForm PaymentForm} </p>
         */
        public GetPaymentForm() {
        }

        /**
         * Creates a function, which returns an invoice payment form. This method must be called when the user presses inline button of the type inlineKeyboardButtonTypeBuy, or wants to buy access to media in a messagePaidMedia message.
         *
         * <p> Returns {@link PaymentForm PaymentForm} </p>
         *
         * @param inputInvoice The invoice.
         * @param theme Preferred payment form theme; pass null to use the default theme.
         */
        public GetPaymentForm(InputInvoice inputInvoice, ThemeParameters theme) {
            this.inputInvoice = inputInvoice;
            this.theme = theme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1924172076;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a successful payment.
     *
     * <p> Returns {@link PaymentReceipt PaymentReceipt} </p>
     */
    public static class GetPaymentReceipt extends Function<PaymentReceipt> {
        /**
         * Chat identifier of the messagePaymentSuccessful message.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a successful payment.
         *
         * <p> Returns {@link PaymentReceipt PaymentReceipt} </p>
         */
        public GetPaymentReceipt() {
        }

        /**
         * Creates a function, which returns information about a successful payment.
         *
         * <p> Returns {@link PaymentReceipt PaymentReceipt} </p>
         *
         * @param chatId Chat identifier of the messagePaymentSuccessful message.
         * @param messageId Message identifier.
         */
        public GetPaymentReceipt(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1013758294;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a phone number by its prefix. Can be called before authorization.
     *
     * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
     */
    public static class GetPhoneNumberInfo extends Function<PhoneNumberInfo> {
        /**
         * The phone number prefix.
         */
        public String phoneNumberPrefix;

        /**
         * Default constructor for a function, which returns information about a phone number by its prefix. Can be called before authorization.
         *
         * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
         */
        public GetPhoneNumberInfo() {
        }

        /**
         * Creates a function, which returns information about a phone number by its prefix. Can be called before authorization.
         *
         * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
         *
         * @param phoneNumberPrefix The phone number prefix.
         */
        public GetPhoneNumberInfo(String phoneNumberPrefix) {
            this.phoneNumberPrefix = phoneNumberPrefix;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1608344583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a phone number by its prefix synchronously. getCountries must be called at least once after changing localization to the specified language if properly localized country information is expected. Can be called synchronously.
     *
     * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
     */
    public static class GetPhoneNumberInfoSync extends Function<PhoneNumberInfo> {
        /**
         * A two-letter ISO 639-1 language code for country information localization.
         */
        public String languageCode;
        /**
         * The phone number prefix.
         */
        public String phoneNumberPrefix;

        /**
         * Default constructor for a function, which returns information about a phone number by its prefix synchronously. getCountries must be called at least once after changing localization to the specified language if properly localized country information is expected. Can be called synchronously.
         *
         * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
         */
        public GetPhoneNumberInfoSync() {
        }

        /**
         * Creates a function, which returns information about a phone number by its prefix synchronously. getCountries must be called at least once after changing localization to the specified language if properly localized country information is expected. Can be called synchronously.
         *
         * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
         *
         * @param languageCode A two-letter ISO 639-1 language code for country information localization.
         * @param phoneNumberPrefix The phone number prefix.
         */
        public GetPhoneNumberInfoSync(String languageCode, String phoneNumberPrefix) {
            this.languageCode = languageCode;
            this.phoneNumberPrefix = phoneNumberPrefix;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 547061048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns message senders voted for the specified option in a non-anonymous polls. For optimal performance, the number of returned users is chosen by TDLib.
     *
     * <p> Returns {@link MessageSenders MessageSenders} </p>
     */
    public static class GetPollVoters extends Function<MessageSenders> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll.
         */
        public long messageId;
        /**
         * 0-based identifier of the answer option.
         */
        public int optionId;
        /**
         * Number of voters to skip in the result; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of voters to be returned; must be positive and can't be greater than 50. For optimal performance, the number of returned voters is chosen by TDLib and can be smaller than the specified limit, even if the end of the voter list has not been reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns message senders voted for the specified option in a non-anonymous polls. For optimal performance, the number of returned users is chosen by TDLib.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         */
        public GetPollVoters() {
        }

        /**
         * Creates a function, which returns message senders voted for the specified option in a non-anonymous polls. For optimal performance, the number of returned users is chosen by TDLib.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll.
         * @param optionId 0-based identifier of the answer option.
         * @param offset Number of voters to skip in the result; must be non-negative.
         * @param limit The maximum number of voters to be returned; must be positive and can't be greater than 50. For optimal performance, the number of returned voters is chosen by TDLib and can be smaller than the specified limit, even if the end of the voter list has not been reached.
         */
        public GetPollVoters(long chatId, long messageId, int optionId, int offset, int limit) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.optionId = optionId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1000625748;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an IETF language tag of the language preferred in the country, which must be used to fill native fields in Telegram Passport personal details. Returns a 404 error if unknown.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetPreferredCountryLanguage extends Function<Text> {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code.
         */
        public String countryCode;

        /**
         * Default constructor for a function, which returns an IETF language tag of the language preferred in the country, which must be used to fill native fields in Telegram Passport personal details. Returns a 404 error if unknown.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetPreferredCountryLanguage() {
        }

        /**
         * Creates a function, which returns an IETF language tag of the language preferred in the country, which must be used to fill native fields in Telegram Passport personal details. Returns a 404 error if unknown.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code.
         */
        public GetPreferredCountryLanguage(String countryCode) {
            this.countryCode = countryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -933049386;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about features, available to Premium users.
     *
     * <p> Returns {@link PremiumFeatures PremiumFeatures} </p>
     */
    public static class GetPremiumFeatures extends Function<PremiumFeatures> {
        /**
         * Source of the request; pass null if the method is called from some non-standard source.
         */
        public PremiumSource source;

        /**
         * Default constructor for a function, which returns information about features, available to Premium users.
         *
         * <p> Returns {@link PremiumFeatures PremiumFeatures} </p>
         */
        public GetPremiumFeatures() {
        }

        /**
         * Creates a function, which returns information about features, available to Premium users.
         *
         * <p> Returns {@link PremiumFeatures PremiumFeatures} </p>
         *
         * @param source Source of the request; pass null if the method is called from some non-standard source.
         */
        public GetPremiumFeatures(PremiumSource source) {
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1260640695;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available options for Telegram Premium gift code or giveaway creation.
     *
     * <p> Returns {@link PremiumGiftCodePaymentOptions PremiumGiftCodePaymentOptions} </p>
     */
    public static class GetPremiumGiftCodePaymentOptions extends Function<PremiumGiftCodePaymentOptions> {
        /**
         * Identifier of the supergroup or channel chat, which will be automatically boosted by receivers of the gift codes and which is administered by the user; 0 if none.
         */
        public long boostedChatId;

        /**
         * Default constructor for a function, which returns available options for Telegram Premium gift code or giveaway creation.
         *
         * <p> Returns {@link PremiumGiftCodePaymentOptions PremiumGiftCodePaymentOptions} </p>
         */
        public GetPremiumGiftCodePaymentOptions() {
        }

        /**
         * Creates a function, which returns available options for Telegram Premium gift code or giveaway creation.
         *
         * <p> Returns {@link PremiumGiftCodePaymentOptions PremiumGiftCodePaymentOptions} </p>
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which will be automatically boosted by receivers of the gift codes and which is administered by the user; 0 if none.
         */
        public GetPremiumGiftCodePaymentOptions(long boostedChatId) {
            this.boostedChatId = boostedChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1991099860;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a Telegram Premium giveaway.
     *
     * <p> Returns {@link PremiumGiveawayInfo PremiumGiveawayInfo} </p>
     */
    public static class GetPremiumGiveawayInfo extends Function<PremiumGiveawayInfo> {
        /**
         * Identifier of the channel chat which started the giveaway.
         */
        public long chatId;
        /**
         * Identifier of the giveaway or a giveaway winners message in the chat.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a Telegram Premium giveaway.
         *
         * <p> Returns {@link PremiumGiveawayInfo PremiumGiveawayInfo} </p>
         */
        public GetPremiumGiveawayInfo() {
        }

        /**
         * Creates a function, which returns information about a Telegram Premium giveaway.
         *
         * <p> Returns {@link PremiumGiveawayInfo PremiumGiveawayInfo} </p>
         *
         * @param chatId Identifier of the channel chat which started the giveaway.
         * @param messageId Identifier of the giveaway or a giveaway winners message in the chat.
         */
        public GetPremiumGiveawayInfo(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1792768919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a limit, increased for Premium users. Returns a 404 error if the limit is unknown.
     *
     * <p> Returns {@link PremiumLimit PremiumLimit} </p>
     */
    public static class GetPremiumLimit extends Function<PremiumLimit> {
        /**
         * Type of the limit.
         */
        public PremiumLimitType limitType;

        /**
         * Default constructor for a function, which returns information about a limit, increased for Premium users. Returns a 404 error if the limit is unknown.
         *
         * <p> Returns {@link PremiumLimit PremiumLimit} </p>
         */
        public GetPremiumLimit() {
        }

        /**
         * Creates a function, which returns information about a limit, increased for Premium users. Returns a 404 error if the limit is unknown.
         *
         * <p> Returns {@link PremiumLimit PremiumLimit} </p>
         *
         * @param limitType Type of the limit.
         */
        public GetPremiumLimit(PremiumLimitType limitType) {
            this.limitType = limitType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1075313898;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns state of Telegram Premium subscription and promotion videos for Premium features.
     *
     * <p> Returns {@link PremiumState PremiumState} </p>
     */
    public static class GetPremiumState extends Function<PremiumState> {

        /**
         * Default constructor for a function, which returns state of Telegram Premium subscription and promotion videos for Premium features.
         *
         * <p> Returns {@link PremiumState PremiumState} </p>
         */
        public GetPremiumState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 663632610;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns examples of premium stickers for demonstration purposes.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetPremiumStickerExamples extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns examples of premium stickers for demonstration purposes.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetPremiumStickerExamples() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1399442328;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns premium stickers from regular sticker sets.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetPremiumStickers extends Function<Stickers> {
        /**
         * The maximum number of stickers to be returned; 0-100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns premium stickers from regular sticker sets.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetPremiumStickers() {
        }

        /**
         * Creates a function, which returns premium stickers from regular sticker sets.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param limit The maximum number of stickers to be returned; 0-100.
         */
        public GetPremiumStickers(int limit) {
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -280950192;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of proxies that are currently set up. Can be called before authorization.
     *
     * <p> Returns {@link Proxies Proxies} </p>
     */
    public static class GetProxies extends Function<Proxies> {

        /**
         * Default constructor for a function, which returns the list of proxies that are currently set up. Can be called before authorization.
         *
         * <p> Returns {@link Proxies Proxies} </p>
         */
        public GetProxies() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -95026381;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link, which can be used to add a proxy. Available only for SOCKS5 and MTProto proxies. Can be called before authorization.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetProxyLink extends Function<HttpUrl> {
        /**
         * Proxy identifier.
         */
        public int proxyId;

        /**
         * Default constructor for a function, which returns an HTTPS link, which can be used to add a proxy. Available only for SOCKS5 and MTProto proxies. Can be called before authorization.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetProxyLink() {
        }

        /**
         * Creates a function, which returns an HTTPS link, which can be used to add a proxy. Available only for SOCKS5 and MTProto proxies. Can be called before authorization.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param proxyId Proxy identifier.
         */
        public GetProxyLink(int proxyId) {
            this.proxyId = proxyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1054495112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a globally unique push notification subscription identifier for identification of an account, which has received a push notification. Can be called synchronously.
     *
     * <p> Returns {@link PushReceiverId PushReceiverId} </p>
     */
    public static class GetPushReceiverId extends Function<PushReceiverId> {
        /**
         * JSON-encoded push notification payload.
         */
        public String payload;

        /**
         * Default constructor for a function, which returns a globally unique push notification subscription identifier for identification of an account, which has received a push notification. Can be called synchronously.
         *
         * <p> Returns {@link PushReceiverId PushReceiverId} </p>
         */
        public GetPushReceiverId() {
        }

        /**
         * Creates a function, which returns a globally unique push notification subscription identifier for identification of an account, which has received a push notification. Can be called synchronously.
         *
         * <p> Returns {@link PushReceiverId PushReceiverId} </p>
         *
         * @param payload JSON-encoded push notification payload.
         */
        public GetPushReceiverId(String payload) {
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -286505294;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns privacy settings for message read date.
     *
     * <p> Returns {@link ReadDatePrivacySettings ReadDatePrivacySettings} </p>
     */
    public static class GetReadDatePrivacySettings extends Function<ReadDatePrivacySettings> {

        /**
         * Default constructor for a function, which returns privacy settings for message read date.
         *
         * <p> Returns {@link ReadDatePrivacySettings ReadDatePrivacySettings} </p>
         */
        public GetReadDatePrivacySettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 451435451;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns recent emoji statuses for self status.
     *
     * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
     */
    public static class GetRecentEmojiStatuses extends Function<EmojiStatuses> {

        /**
         * Default constructor for a function, which returns recent emoji statuses for self status.
         *
         * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
         */
        public GetRecentEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1371914967;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns up to 20 recently used inline bots in the order of their last usage.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class GetRecentInlineBots extends Function<Users> {

        /**
         * Default constructor for a function, which returns up to 20 recently used inline bots in the order of their last usage.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public GetRecentInlineBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1437823548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of recently used stickers.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetRecentStickers extends Function<Stickers> {
        /**
         * Pass true to return stickers and masks that were recently attached to photos or video files; pass false to return recently sent stickers.
         */
        public boolean isAttached;

        /**
         * Default constructor for a function, which returns a list of recently used stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetRecentStickers() {
        }

        /**
         * Creates a function, which returns a list of recently used stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param isAttached Pass true to return stickers and masks that were recently attached to photos or video files; pass false to return recently sent stickers.
         */
        public GetRecentStickers(boolean isAttached) {
            this.isAttached = isAttached;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -579622241;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns recently opened chats; this is an offline request. Returns chats in the order of last opening.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetRecentlyOpenedChats extends Function<Chats> {
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns recently opened chats; this is an offline request. Returns chats in the order of last opening.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetRecentlyOpenedChats() {
        }

        /**
         * Creates a function, which returns recently opened chats; this is an offline request. Returns chats in the order of last opening.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param limit The maximum number of chats to be returned.
         */
        public GetRecentlyOpenedChats(int limit) {
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1924156893;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns t.me URLs recently visited by a newly registered user.
     *
     * <p> Returns {@link TMeUrls TMeUrls} </p>
     */
    public static class GetRecentlyVisitedTMeUrls extends Function<TMeUrls> {
        /**
         * Google Play referrer to identify the user.
         */
        public String referrer;

        /**
         * Default constructor for a function, which returns t.me URLs recently visited by a newly registered user.
         *
         * <p> Returns {@link TMeUrls TMeUrls} </p>
         */
        public GetRecentlyVisitedTMeUrls() {
        }

        /**
         * Creates a function, which returns t.me URLs recently visited by a newly registered user.
         *
         * <p> Returns {@link TMeUrls TMeUrls} </p>
         *
         * @param referrer Google Play referrer to identify the user.
         */
        public GetRecentlyVisitedTMeUrls(String referrer) {
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 806754961;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns recommended chat folders for the current user.
     *
     * <p> Returns {@link RecommendedChatFolders RecommendedChatFolders} </p>
     */
    public static class GetRecommendedChatFolders extends Function<RecommendedChatFolders> {

        /**
         * Default constructor for a function, which returns recommended chat folders for the current user.
         *
         * <p> Returns {@link RecommendedChatFolders RecommendedChatFolders} </p>
         */
        public GetRecommendedChatFolders() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -145540217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of channel chats recommended to the current user.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetRecommendedChats extends Function<Chats> {

        /**
         * Default constructor for a function, which returns a list of channel chats recommended to the current user.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetRecommendedChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -649884303;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a 2-step verification recovery email address that was previously set up. This method can be used to verify a password provided by the user.
     *
     * <p> Returns {@link RecoveryEmailAddress RecoveryEmailAddress} </p>
     */
    public static class GetRecoveryEmailAddress extends Function<RecoveryEmailAddress> {
        /**
         * The 2-step verification password for the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns a 2-step verification recovery email address that was previously set up. This method can be used to verify a password provided by the user.
         *
         * <p> Returns {@link RecoveryEmailAddress RecoveryEmailAddress} </p>
         */
        public GetRecoveryEmailAddress() {
        }

        /**
         * Creates a function, which returns a 2-step verification recovery email address that was previously set up. This method can be used to verify a password provided by the user.
         *
         * <p> Returns {@link RecoveryEmailAddress RecoveryEmailAddress} </p>
         *
         * @param password The 2-step verification password for the current user.
         */
        public GetRecoveryEmailAddress(String password) {
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1594770947;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a file by its remote identifier; this is an offline request. Can be used to register a URL as a file for further uploading, or sending as a message. Even the request succeeds, the file can be used only if it is still accessible to the user. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class GetRemoteFile extends Function<File> {
        /**
         * Remote identifier of the file to get.
         */
        public String remoteFileId;
        /**
         * File type; pass null if unknown.
         */
        public FileType fileType;

        /**
         * Default constructor for a function, which returns information about a file by its remote identifier; this is an offline request. Can be used to register a URL as a file for further uploading, or sending as a message. Even the request succeeds, the file can be used only if it is still accessible to the user. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
         *
         * <p> Returns {@link File File} </p>
         */
        public GetRemoteFile() {
        }

        /**
         * Creates a function, which returns information about a file by its remote identifier; this is an offline request. Can be used to register a URL as a file for further uploading, or sending as a message. Even the request succeeds, the file can be used only if it is still accessible to the user. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param remoteFileId Remote identifier of the file to get.
         * @param fileType File type; pass null if unknown.
         */
        public GetRemoteFile(String remoteFileId, FileType fileType) {
            this.remoteFileId = remoteFileId;
            this.fileType = fileType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2137204530;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a non-bundled message that is replied by a given message. Also, returns the pinned message, the game message, the invoice message, the message with a previously set same background, the giveaway message, and the topic creation message for messages of the types messagePinMessage, messageGameScore, messagePaymentSuccessful, messageChatSetBackground, messagePremiumGiveawayCompleted and topic messages without non-bundled replied message respectively.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetRepliedMessage extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the reply message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a non-bundled message that is replied by a given message. Also, returns the pinned message, the game message, the invoice message, the message with a previously set same background, the giveaway message, and the topic creation message for messages of the types messagePinMessage, messageGameScore, messagePaymentSuccessful, messageChatSetBackground, messagePremiumGiveawayCompleted and topic messages without non-bundled replied message respectively.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetRepliedMessage() {
        }

        /**
         * Creates a function, which returns information about a non-bundled message that is replied by a given message. Also, returns the pinned message, the game message, the invoice message, the message with a previously set same background, the giveaway message, and the topic creation message for messages of the types messagePinMessage, messageGameScore, messagePaymentSuccessful, messageChatSetBackground, messagePremiumGiveawayCompleted and topic messages without non-bundled replied message respectively.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         * @param messageId Identifier of the reply message.
         */
        public GetRepliedMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -641918531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns saved animations.
     *
     * <p> Returns {@link Animations Animations} </p>
     */
    public static class GetSavedAnimations extends Function<Animations> {

        /**
         * Default constructor for a function, which returns saved animations.
         *
         * <p> Returns {@link Animations Animations} </p>
         */
        public GetSavedAnimations() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 7051032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns tags used in Saved Messages or a Saved Messages topic.
     *
     * <p> Returns {@link SavedMessagesTags SavedMessagesTags} </p>
     */
    public static class GetSavedMessagesTags extends Function<SavedMessagesTags> {
        /**
         * Identifier of Saved Messages topic which tags will be returned; pass 0 to get all Saved Messages tags.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which returns tags used in Saved Messages or a Saved Messages topic.
         *
         * <p> Returns {@link SavedMessagesTags SavedMessagesTags} </p>
         */
        public GetSavedMessagesTags() {
        }

        /**
         * Creates a function, which returns tags used in Saved Messages or a Saved Messages topic.
         *
         * <p> Returns {@link SavedMessagesTags SavedMessagesTags} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which tags will be returned; pass 0 to get all Saved Messages tags.
         */
        public GetSavedMessagesTags(long savedMessagesTopicId) {
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1932105815;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in a Saved Messages topic. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId).
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetSavedMessagesTopicHistory extends Function<Messages> {
        /**
         * Identifier of Saved Messages topic which messages will be fetched.
         */
        public long savedMessagesTopicId;
        /**
         * Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative offset up to 99 to get additionally some newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns messages in a Saved Messages topic. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetSavedMessagesTopicHistory() {
        }

        /**
         * Creates a function, which returns messages in a Saved Messages topic. The messages are returned in a reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which messages will be fetched.
         * @param fromMessageId Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative offset up to 99 to get additionally some newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetSavedMessagesTopicHistory(long savedMessagesTopicId, long fromMessageId, int offset, int limit) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2011552360;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the last message sent in a Saved Messages topic no later than the specified date.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetSavedMessagesTopicMessageByDate extends Function<Message> {
        /**
         * Identifier of Saved Messages topic which message will be returned.
         */
        public long savedMessagesTopicId;
        /**
         * Point in time (Unix timestamp) relative to which to search for messages.
         */
        public int date;

        /**
         * Default constructor for a function, which returns the last message sent in a Saved Messages topic no later than the specified date.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetSavedMessagesTopicMessageByDate() {
        }

        /**
         * Creates a function, which returns the last message sent in a Saved Messages topic no later than the specified date.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which message will be returned.
         * @param date Point in time (Unix timestamp) relative to which to search for messages.
         */
        public GetSavedMessagesTopicMessageByDate(long savedMessagesTopicId, int date) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1050786176;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns saved notification sound by its identifier. Returns a 404 error if there is no saved notification sound with the specified identifier.
     *
     * <p> Returns {@link NotificationSounds NotificationSounds} </p>
     */
    public static class GetSavedNotificationSound extends Function<NotificationSounds> {
        /**
         * Identifier of the notification sound.
         */
        public long notificationSoundId;

        /**
         * Default constructor for a function, which returns saved notification sound by its identifier. Returns a 404 error if there is no saved notification sound with the specified identifier.
         *
         * <p> Returns {@link NotificationSounds NotificationSounds} </p>
         */
        public GetSavedNotificationSound() {
        }

        /**
         * Creates a function, which returns saved notification sound by its identifier. Returns a 404 error if there is no saved notification sound with the specified identifier.
         *
         * <p> Returns {@link NotificationSounds NotificationSounds} </p>
         *
         * @param notificationSoundId Identifier of the notification sound.
         */
        public GetSavedNotificationSound(long notificationSoundId) {
            this.notificationSoundId = notificationSoundId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 459569431;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of saved notification sounds. If a sound isn't in the list, then default sound needs to be used.
     *
     * <p> Returns {@link NotificationSounds NotificationSounds} </p>
     */
    public static class GetSavedNotificationSounds extends Function<NotificationSounds> {

        /**
         * Default constructor for a function, which returns the list of saved notification sounds. If a sound isn't in the list, then default sound needs to be used.
         *
         * <p> Returns {@link NotificationSounds NotificationSounds} </p>
         */
        public GetSavedNotificationSounds() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1070305368;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns saved order information. Returns a 404 error if there is no saved order information.
     *
     * <p> Returns {@link OrderInfo OrderInfo} </p>
     */
    public static class GetSavedOrderInfo extends Function<OrderInfo> {

        /**
         * Default constructor for a function, which returns saved order information. Returns a 404 error if there is no saved order information.
         *
         * <p> Returns {@link OrderInfo OrderInfo} </p>
         */
        public GetSavedOrderInfo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1152016675;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the notification settings for chats of a given type.
     *
     * <p> Returns {@link ScopeNotificationSettings ScopeNotificationSettings} </p>
     */
    public static class GetScopeNotificationSettings extends Function<ScopeNotificationSettings> {
        /**
         * Types of chats for which to return the notification settings information.
         */
        public NotificationSettingsScope scope;

        /**
         * Default constructor for a function, which returns the notification settings for chats of a given type.
         *
         * <p> Returns {@link ScopeNotificationSettings ScopeNotificationSettings} </p>
         */
        public GetScopeNotificationSettings() {
        }

        /**
         * Creates a function, which returns the notification settings for chats of a given type.
         *
         * <p> Returns {@link ScopeNotificationSettings ScopeNotificationSettings} </p>
         *
         * @param scope Types of chats for which to return the notification settings information.
         */
        public GetScopeNotificationSettings(NotificationSettingsScope scope) {
            this.scope = scope;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -995613361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns recently searched for hashtags or cashtags by their prefix.
     *
     * <p> Returns {@link Hashtags Hashtags} </p>
     */
    public static class GetSearchedForTags extends Function<Hashtags> {
        /**
         * Prefix of hashtags or cashtags to return.
         */
        public String tagPrefix;
        /**
         * The maximum number of items to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns recently searched for hashtags or cashtags by their prefix.
         *
         * <p> Returns {@link Hashtags Hashtags} </p>
         */
        public GetSearchedForTags() {
        }

        /**
         * Creates a function, which returns recently searched for hashtags or cashtags by their prefix.
         *
         * <p> Returns {@link Hashtags Hashtags} </p>
         *
         * @param tagPrefix Prefix of hashtags or cashtags to return.
         * @param limit The maximum number of items to be returned.
         */
        public GetSearchedForTags(String tagPrefix, int limit) {
            this.tagPrefix = tagPrefix;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1692716851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a secret chat by its identifier. This is an offline request.
     *
     * <p> Returns {@link SecretChat SecretChat} </p>
     */
    public static class GetSecretChat extends Function<SecretChat> {
        /**
         * Secret chat identifier.
         */
        public int secretChatId;

        /**
         * Default constructor for a function, which returns information about a secret chat by its identifier. This is an offline request.
         *
         * <p> Returns {@link SecretChat SecretChat} </p>
         */
        public GetSecretChat() {
        }

        /**
         * Creates a function, which returns information about a secret chat by its identifier. This is an offline request.
         *
         * <p> Returns {@link SecretChat SecretChat} </p>
         *
         * @param secretChatId Secret chat identifier.
         */
        public GetSecretChat(int secretChatId) {
            this.secretChatId = secretChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 40599169;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a URL for a Telegram Ad platform account that can be used to set up advertisements for the chat paid in the owned Telegram stars.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetStarAdAccountUrl extends Function<HttpUrl> {
        /**
         * Identifier of the owner of the Telegram stars; can be identifier of an owned bot, or identifier of an owned channel chat.
         */
        public MessageSender ownerId;

        /**
         * Default constructor for a function, which returns a URL for a Telegram Ad platform account that can be used to set up advertisements for the chat paid in the owned Telegram stars.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetStarAdAccountUrl() {
        }

        /**
         * Creates a function, which returns a URL for a Telegram Ad platform account that can be used to set up advertisements for the chat paid in the owned Telegram stars.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param ownerId Identifier of the owner of the Telegram stars; can be identifier of an owned bot, or identifier of an owned channel chat.
         */
        public GetStarAdAccountUrl(MessageSender ownerId) {
            this.ownerId = ownerId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1940473181;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available options for Telegram stars purchase.
     *
     * <p> Returns {@link StarPaymentOptions StarPaymentOptions} </p>
     */
    public static class GetStarPaymentOptions extends Function<StarPaymentOptions> {

        /**
         * Default constructor for a function, which returns available options for Telegram stars purchase.
         *
         * <p> Returns {@link StarPaymentOptions StarPaymentOptions} </p>
         */
        public GetStarPaymentOptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1838351940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed Telegram star revenue statistics.
     *
     * <p> Returns {@link StarRevenueStatistics StarRevenueStatistics} </p>
     */
    public static class GetStarRevenueStatistics extends Function<StarRevenueStatistics> {
        /**
         * Identifier of the owner of the Telegram stars; can be identifier of an owned bot, or identifier of a channel chat with supergroupFullInfo.canGetStarRevenueStatistics == true.
         */
        public MessageSender ownerId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed Telegram star revenue statistics.
         *
         * <p> Returns {@link StarRevenueStatistics StarRevenueStatistics} </p>
         */
        public GetStarRevenueStatistics() {
        }

        /**
         * Creates a function, which returns detailed Telegram star revenue statistics.
         *
         * <p> Returns {@link StarRevenueStatistics StarRevenueStatistics} </p>
         *
         * @param ownerId Identifier of the owner of the Telegram stars; can be identifier of an owned bot, or identifier of a channel chat with supergroupFullInfo.canGetStarRevenueStatistics == true.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetStarRevenueStatistics(MessageSender ownerId, boolean isDark) {
            this.ownerId = ownerId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -260356841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of Telegram star transactions for the specified owner.
     *
     * <p> Returns {@link StarTransactions StarTransactions} </p>
     */
    public static class GetStarTransactions extends Function<StarTransactions> {
        /**
         * Identifier of the owner of the Telegram stars; can be the identifier of the current user, identifier of an owned bot, or identifier of a channel chat with supergroupFullInfo.canGetStarRevenueStatistics == true.
         */
        public MessageSender ownerId;
        /**
         * Direction of the transactions to receive; pass null to get all transactions.
         */
        public StarTransactionDirection direction;
        /**
         * Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of transactions to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of Telegram star transactions for the specified owner.
         *
         * <p> Returns {@link StarTransactions StarTransactions} </p>
         */
        public GetStarTransactions() {
        }

        /**
         * Creates a function, which returns the list of Telegram star transactions for the specified owner.
         *
         * <p> Returns {@link StarTransactions StarTransactions} </p>
         *
         * @param ownerId Identifier of the owner of the Telegram stars; can be the identifier of the current user, identifier of an owned bot, or identifier of a channel chat with supergroupFullInfo.canGetStarRevenueStatistics == true.
         * @param direction Direction of the transactions to receive; pass null to get all transactions.
         * @param offset Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of transactions to return.
         */
        public GetStarTransactions(MessageSender ownerId, StarTransactionDirection direction, String offset, int limit) {
            this.ownerId = ownerId;
            this.direction = direction;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -350351203;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a URL for Telegram star withdrawal.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetStarWithdrawalUrl extends Function<HttpUrl> {
        /**
         * Identifier of the owner of the Telegram stars; can be identifier of an owned bot, or identifier of an owned channel chat.
         */
        public MessageSender ownerId;
        /**
         * The number of Telegram stars to withdraw. Must be at least getOption(&quot;star_withdrawal_count_min&quot;).
         */
        public long starCount;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns a URL for Telegram star withdrawal.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetStarWithdrawalUrl() {
        }

        /**
         * Creates a function, which returns a URL for Telegram star withdrawal.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param ownerId Identifier of the owner of the Telegram stars; can be identifier of an owned bot, or identifier of an owned channel chat.
         * @param starCount The number of Telegram stars to withdraw. Must be at least getOption(&quot;star_withdrawal_count_min&quot;).
         * @param password The 2-step verification password of the current user.
         */
        public GetStarWithdrawalUrl(MessageSender ownerId, long starCount, String password) {
            this.ownerId = ownerId;
            this.starCount = starCount;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1445841134;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads an asynchronous or a zoomed in statistical graph.
     *
     * <p> Returns {@link StatisticalGraph StatisticalGraph} </p>
     */
    public static class GetStatisticalGraph extends Function<StatisticalGraph> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The token for graph loading.
         */
        public String token;
        /**
         * X-value for zoomed in graph or 0 otherwise.
         */
        public long x;

        /**
         * Default constructor for a function, which loads an asynchronous or a zoomed in statistical graph.
         *
         * <p> Returns {@link StatisticalGraph StatisticalGraph} </p>
         */
        public GetStatisticalGraph() {
        }

        /**
         * Creates a function, which loads an asynchronous or a zoomed in statistical graph.
         *
         * <p> Returns {@link StatisticalGraph StatisticalGraph} </p>
         *
         * @param chatId Chat identifier.
         * @param token The token for graph loading.
         * @param x X-value for zoomed in graph or 0 otherwise.
         */
        public GetStatisticalGraph(long chatId, String token, long x) {
            this.chatId = chatId;
            this.token = token;
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1100975515;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns emoji corresponding to a sticker. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
     *
     * <p> Returns {@link Emojis Emojis} </p>
     */
    public static class GetStickerEmojis extends Function<Emojis> {
        /**
         * Sticker file identifier.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which returns emoji corresponding to a sticker. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
         *
         * <p> Returns {@link Emojis Emojis} </p>
         */
        public GetStickerEmojis() {
        }

        /**
         * Creates a function, which returns emoji corresponding to a sticker. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
         *
         * <p> Returns {@link Emojis Emojis} </p>
         *
         * @param sticker Sticker file identifier.
         */
        public GetStickerEmojis(InputFile sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1895508665;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a sticker set by its identifier.
     *
     * <p> Returns {@link StickerSet StickerSet} </p>
     */
    public static class GetStickerSet extends Function<StickerSet> {
        /**
         * Identifier of the sticker set.
         */
        public long setId;

        /**
         * Default constructor for a function, which returns information about a sticker set by its identifier.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         */
        public GetStickerSet() {
        }

        /**
         * Creates a function, which returns information about a sticker set by its identifier.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         *
         * @param setId Identifier of the sticker set.
         */
        public GetStickerSet(long setId) {
            this.setId = setId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1052318659;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns stickers from the installed sticker sets that correspond to any of the given emoji or can be found by sticker-specific keywords. If the query is non-empty, then favorite, recently used or trending stickers may also be returned.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetStickers extends Function<Stickers> {
        /**
         * Type of the stickers to return.
         */
        public StickerType stickerType;
        /**
         * Search query; a space-separated list of emojis or a keyword prefix. If empty, returns all known installed stickers.
         */
        public String query;
        /**
         * The maximum number of stickers to be returned.
         */
        public int limit;
        /**
         * Chat identifier for which to return stickers. Available custom emoji stickers may be different for different chats.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns stickers from the installed sticker sets that correspond to any of the given emoji or can be found by sticker-specific keywords. If the query is non-empty, then favorite, recently used or trending stickers may also be returned.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetStickers() {
        }

        /**
         * Creates a function, which returns stickers from the installed sticker sets that correspond to any of the given emoji or can be found by sticker-specific keywords. If the query is non-empty, then favorite, recently used or trending stickers may also be returned.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param stickerType Type of the stickers to return.
         * @param query Search query; a space-separated list of emojis or a keyword prefix. If empty, returns all known installed stickers.
         * @param limit The maximum number of stickers to be returned.
         * @param chatId Chat identifier for which to return stickers. Available custom emoji stickers may be different for different chats.
         */
        public GetStickers(StickerType stickerType, String query, int limit, long chatId) {
            this.stickerType = stickerType;
            this.query = query;
            this.limit = limit;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1158058819;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns storage usage statistics. Can be called before authorization.
     *
     * <p> Returns {@link StorageStatistics StorageStatistics} </p>
     */
    public static class GetStorageStatistics extends Function<StorageStatistics> {
        /**
         * The maximum number of chats with the largest storage usage for which separate statistics need to be returned. All other chats will be grouped in entries with chatId == 0. If the chat info database is not used, the chatLimit is ignored and is always set to 0.
         */
        public int chatLimit;

        /**
         * Default constructor for a function, which returns storage usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link StorageStatistics StorageStatistics} </p>
         */
        public GetStorageStatistics() {
        }

        /**
         * Creates a function, which returns storage usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link StorageStatistics StorageStatistics} </p>
         *
         * @param chatLimit The maximum number of chats with the largest storage usage for which separate statistics need to be returned. All other chats will be grouped in entries with chatId == 0. If the chat info database is not used, the chatLimit is ignored and is always set to 0.
         */
        public GetStorageStatistics(int chatLimit) {
            this.chatLimit = chatLimit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -853193929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Quickly returns approximate storage usage statistics. Can be called before authorization.
     *
     * <p> Returns {@link StorageStatisticsFast StorageStatisticsFast} </p>
     */
    public static class GetStorageStatisticsFast extends Function<StorageStatisticsFast> {

        /**
         * Default constructor for a function, which quickly returns approximate storage usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link StorageStatisticsFast StorageStatisticsFast} </p>
         */
        public GetStorageStatisticsFast() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 61368066;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a story.
     *
     * <p> Returns {@link Story Story} </p>
     */
    public static class GetStory extends Function<Story> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storySenderChatId;
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which returns a story.
         *
         * <p> Returns {@link Story Story} </p>
         */
        public GetStory() {
        }

        /**
         * Creates a function, which returns a story.
         *
         * <p> Returns {@link Story Story} </p>
         *
         * @param storySenderChatId Identifier of the chat that posted the story.
         * @param storyId Story identifier.
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public GetStory(long storySenderChatId, int storyId, boolean onlyLocal) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1903893624;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns reactions, which can be chosen for a story.
     *
     * <p> Returns {@link AvailableReactions AvailableReactions} </p>
     */
    public static class GetStoryAvailableReactions extends Function<AvailableReactions> {
        /**
         * Number of reaction per row, 5-25.
         */
        public int rowSize;

        /**
         * Default constructor for a function, which returns reactions, which can be chosen for a story.
         *
         * <p> Returns {@link AvailableReactions AvailableReactions} </p>
         */
        public GetStoryAvailableReactions() {
        }

        /**
         * Creates a function, which returns reactions, which can be chosen for a story.
         *
         * <p> Returns {@link AvailableReactions AvailableReactions} </p>
         *
         * @param rowSize Number of reaction per row, 5-25.
         */
        public GetStoryAvailableReactions(int rowSize) {
            this.rowSize = rowSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 595938619;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns interactions with a story. The method can be called only for stories posted on behalf of the current user.
     *
     * <p> Returns {@link StoryInteractions StoryInteractions} </p>
     */
    public static class GetStoryInteractions extends Function<StoryInteractions> {
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * Query to search for in names, usernames and titles; may be empty to get all relevant interactions.
         */
        public String query;
        /**
         * Pass true to get only interactions by contacts; pass false to get all relevant interactions.
         */
        public boolean onlyContacts;
        /**
         * Pass true to get forwards and reposts first, then reactions, then other views; pass false to get interactions sorted just by interaction date.
         */
        public boolean preferForwards;
        /**
         * Pass true to get interactions with reaction first; pass false to get interactions sorted just by interaction date. Ignored if preferForwards == true.
         */
        public boolean preferWithReaction;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of story interactions to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns interactions with a story. The method can be called only for stories posted on behalf of the current user.
         *
         * <p> Returns {@link StoryInteractions StoryInteractions} </p>
         */
        public GetStoryInteractions() {
        }

        /**
         * Creates a function, which returns interactions with a story. The method can be called only for stories posted on behalf of the current user.
         *
         * <p> Returns {@link StoryInteractions StoryInteractions} </p>
         *
         * @param storyId Story identifier.
         * @param query Query to search for in names, usernames and titles; may be empty to get all relevant interactions.
         * @param onlyContacts Pass true to get only interactions by contacts; pass false to get all relevant interactions.
         * @param preferForwards Pass true to get forwards and reposts first, then reactions, then other views; pass false to get interactions sorted just by interaction date.
         * @param preferWithReaction Pass true to get interactions with reaction first; pass false to get interactions sorted just by interaction date. Ignored if preferForwards == true.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of story interactions to return.
         */
        public GetStoryInteractions(int storyId, String query, boolean onlyContacts, boolean preferForwards, boolean preferWithReaction, String offset, int limit) {
            this.storyId = storyId;
            this.query = query;
            this.onlyContacts = onlyContacts;
            this.preferForwards = preferForwards;
            this.preferWithReaction = preferWithReaction;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 483475469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of chats with non-default notification settings for stories.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetStoryNotificationSettingsExceptions extends Function<Chats> {

        /**
         * Default constructor for a function, which returns the list of chats with non-default notification settings for stories.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetStoryNotificationSettingsExceptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 627715760;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns forwards of a story as a message to public chats and reposts by public channels. Can be used only if the story is posted on behalf of the current user or story.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
     *
     * <p> Returns {@link PublicForwards PublicForwards} </p>
     */
    public static class GetStoryPublicForwards extends Function<PublicForwards> {
        /**
         * The identifier of the sender of the story.
         */
        public long storySenderChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages and stories to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns forwards of a story as a message to public chats and reposts by public channels. Can be used only if the story is posted on behalf of the current user or story.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
         *
         * <p> Returns {@link PublicForwards PublicForwards} </p>
         */
        public GetStoryPublicForwards() {
        }

        /**
         * Creates a function, which returns forwards of a story as a message to public chats and reposts by public channels. Can be used only if the story is posted on behalf of the current user or story.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
         *
         * <p> Returns {@link PublicForwards PublicForwards} </p>
         *
         * @param storySenderChatId The identifier of the sender of the story.
         * @param storyId The identifier of the story.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages and stories to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetStoryPublicForwards(long storySenderChatId, int storyId, String offset, int limit) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1761074363;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed statistics about a story. Can be used only if story.canGetStatistics == true.
     *
     * <p> Returns {@link StoryStatistics StoryStatistics} </p>
     */
    public static class GetStoryStatistics extends Function<StoryStatistics> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed statistics about a story. Can be used only if story.canGetStatistics == true.
         *
         * <p> Returns {@link StoryStatistics StoryStatistics} </p>
         */
        public GetStoryStatistics() {
        }

        /**
         * Creates a function, which returns detailed statistics about a story. Can be used only if story.canGetStatistics == true.
         *
         * <p> Returns {@link StoryStatistics StoryStatistics} </p>
         *
         * @param chatId Chat identifier.
         * @param storyId Story identifier.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetStoryStatistics(long chatId, int storyId, boolean isDark) {
            this.chatId = chatId;
            this.storyId = storyId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 982926146;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns suggested name for saving a file in a given directory.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetSuggestedFileName extends Function<Text> {
        /**
         * Identifier of the file.
         */
        public int fileId;
        /**
         * Directory in which the file is supposed to be saved.
         */
        public String directory;

        /**
         * Default constructor for a function, which returns suggested name for saving a file in a given directory.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetSuggestedFileName() {
        }

        /**
         * Creates a function, which returns suggested name for saving a file in a given directory.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param fileId Identifier of the file.
         * @param directory Directory in which the file is supposed to be saved.
         */
        public GetSuggestedFileName(int fileId, String directory) {
            this.fileId = fileId;
            this.directory = directory;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2049399674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a suggested name for a new sticker set with a given title.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetSuggestedStickerSetName extends Function<Text> {
        /**
         * Sticker set title; 1-64 characters.
         */
        public String title;

        /**
         * Default constructor for a function, which returns a suggested name for a new sticker set with a given title.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetSuggestedStickerSetName() {
        }

        /**
         * Creates a function, which returns a suggested name for a new sticker set with a given title.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param title Sticker set title; 1-64 characters.
         */
        public GetSuggestedStickerSetName(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1340995520;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of basic group and supergroup chats, which can be used as a discussion group for a channel. Returned basic group chats must be first upgraded to supergroups before they can be set as a discussion group. To set a returned supergroup as a discussion group, access to its old messages must be enabled using toggleSupergroupIsAllHistoryAvailable first.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetSuitableDiscussionChats extends Function<Chats> {

        /**
         * Default constructor for a function, which returns a list of basic group and supergroup chats, which can be used as a discussion group for a channel. Returned basic group chats must be first upgraded to supergroups before they can be set as a discussion group. To set a returned supergroup as a discussion group, access to its old messages must be enabled using toggleSupergroupIsAllHistoryAvailable first.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetSuitableDiscussionChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 49044982;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of channel chats, which can be used as a personal chat.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetSuitablePersonalChats extends Function<Chats> {

        /**
         * Default constructor for a function, which returns a list of channel chats, which can be used as a personal chat.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetSuitablePersonalChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1870357515;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a supergroup or a channel by its identifier. This is an offline request if the current user is not a bot.
     *
     * <p> Returns {@link Supergroup Supergroup} </p>
     */
    public static class GetSupergroup extends Function<Supergroup> {
        /**
         * Supergroup or channel identifier.
         */
        public long supergroupId;

        /**
         * Default constructor for a function, which returns information about a supergroup or a channel by its identifier. This is an offline request if the current user is not a bot.
         *
         * <p> Returns {@link Supergroup Supergroup} </p>
         */
        public GetSupergroup() {
        }

        /**
         * Creates a function, which returns information about a supergroup or a channel by its identifier. This is an offline request if the current user is not a bot.
         *
         * <p> Returns {@link Supergroup Supergroup} </p>
         *
         * @param supergroupId Supergroup or channel identifier.
         */
        public GetSupergroup(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 989663458;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns full information about a supergroup or a channel by its identifier, cached for up to 1 minute.
     *
     * <p> Returns {@link SupergroupFullInfo SupergroupFullInfo} </p>
     */
    public static class GetSupergroupFullInfo extends Function<SupergroupFullInfo> {
        /**
         * Supergroup or channel identifier.
         */
        public long supergroupId;

        /**
         * Default constructor for a function, which returns full information about a supergroup or a channel by its identifier, cached for up to 1 minute.
         *
         * <p> Returns {@link SupergroupFullInfo SupergroupFullInfo} </p>
         */
        public GetSupergroupFullInfo() {
        }

        /**
         * Creates a function, which returns full information about a supergroup or a channel by its identifier, cached for up to 1 minute.
         *
         * <p> Returns {@link SupergroupFullInfo SupergroupFullInfo} </p>
         *
         * @param supergroupId Supergroup or channel identifier.
         */
        public GetSupergroupFullInfo(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1099776056;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about members or banned users in a supergroup or channel. Can be used only if supergroupFullInfo.canGetMembers == true; additionally, administrator privileges may be required for some filters.
     *
     * <p> Returns {@link ChatMembers ChatMembers} </p>
     */
    public static class GetSupergroupMembers extends Function<ChatMembers> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * The type of users to return; pass null to use supergroupMembersFilterRecent.
         */
        public SupergroupMembersFilter filter;
        /**
         * Number of users to skip.
         */
        public int offset;
        /**
         * The maximum number of users to be returned; up to 200.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns information about members or banned users in a supergroup or channel. Can be used only if supergroupFullInfo.canGetMembers == true; additionally, administrator privileges may be required for some filters.
         *
         * <p> Returns {@link ChatMembers ChatMembers} </p>
         */
        public GetSupergroupMembers() {
        }

        /**
         * Creates a function, which returns information about members or banned users in a supergroup or channel. Can be used only if supergroupFullInfo.canGetMembers == true; additionally, administrator privileges may be required for some filters.
         *
         * <p> Returns {@link ChatMembers ChatMembers} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param filter The type of users to return; pass null to use supergroupMembersFilterRecent.
         * @param offset Number of users to skip.
         * @param limit The maximum number of users to be returned; up to 200.
         */
        public GetSupergroupMembers(long supergroupId, SupergroupMembersFilter filter, int offset, int limit) {
            this.supergroupId = supergroupId;
            this.filter = filter;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -570940984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns localized name of the Telegram support user; for Telegram support only.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetSupportName extends Function<Text> {

        /**
         * Default constructor for a function, which returns localized name of the Telegram support user; for Telegram support only.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetSupportName() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1302205794;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a user that can be contacted to get support.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class GetSupportUser extends Function<User> {

        /**
         * Default constructor for a function, which returns a user that can be contacted to get support.
         *
         * <p> Returns {@link User User} </p>
         */
        public GetSupportUser() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1733497700;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the current temporary password.
     *
     * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
     */
    public static class GetTemporaryPasswordState extends Function<TemporaryPasswordState> {

        /**
         * Default constructor for a function, which returns information about the current temporary password.
         *
         * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
         */
        public GetTemporaryPasswordState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -12670830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all entities (mentions, hashtags, cashtags, bot commands, bank card numbers, URLs, and email addresses) found in the text. Can be called synchronously.
     *
     * <p> Returns {@link TextEntities TextEntities} </p>
     */
    public static class GetTextEntities extends Function<TextEntities> {
        /**
         * The text in which to look for entities.
         */
        public String text;

        /**
         * Default constructor for a function, which returns all entities (mentions, hashtags, cashtags, bot commands, bank card numbers, URLs, and email addresses) found in the text. Can be called synchronously.
         *
         * <p> Returns {@link TextEntities TextEntities} </p>
         */
        public GetTextEntities() {
        }

        /**
         * Creates a function, which returns all entities (mentions, hashtags, cashtags, bot commands, bank card numbers, URLs, and email addresses) found in the text. Can be called synchronously.
         *
         * <p> Returns {@link TextEntities TextEntities} </p>
         *
         * @param text The text in which to look for entities.
         */
        public GetTextEntities(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -341490693;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Converts a themeParameters object to corresponding JSON-serialized string. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetThemeParametersJsonString extends Function<Text> {
        /**
         * Theme parameters to convert to JSON.
         */
        public ThemeParameters theme;

        /**
         * Default constructor for a function, which converts a themeParameters object to corresponding JSON-serialized string. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetThemeParametersJsonString() {
        }

        /**
         * Creates a function, which converts a themeParameters object to corresponding JSON-serialized string. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param theme Theme parameters to convert to JSON.
         */
        public GetThemeParametersJsonString(ThemeParameters theme) {
            this.theme = theme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1850145288;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns up to 8 emoji statuses, which must be shown in the emoji status list for chats.
     *
     * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
     */
    public static class GetThemedChatEmojiStatuses extends Function<EmojiStatuses> {

        /**
         * Default constructor for a function, which returns up to 8 emoji statuses, which must be shown in the emoji status list for chats.
         *
         * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
         */
        public GetThemedChatEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -76325707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns up to 8 emoji statuses, which must be shown right after the default Premium Badge in the emoji status list for self status.
     *
     * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
     */
    public static class GetThemedEmojiStatuses extends Function<EmojiStatuses> {

        /**
         * Default constructor for a function, which returns up to 8 emoji statuses, which must be shown right after the default Premium Badge in the emoji status list for self status.
         *
         * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
         */
        public GetThemedEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1791346882;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of supported time zones.
     *
     * <p> Returns {@link TimeZones TimeZones} </p>
     */
    public static class GetTimeZones extends Function<TimeZones> {

        /**
         * Default constructor for a function, which returns the list of supported time zones.
         *
         * <p> Returns {@link TimeZones TimeZones} </p>
         */
        public GetTimeZones() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1340268632;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of frequently used chats.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetTopChats extends Function<Chats> {
        /**
         * Category of chats to be returned.
         */
        public TopChatCategory category;
        /**
         * The maximum number of chats to be returned; up to 30.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns a list of frequently used chats.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetTopChats() {
        }

        /**
         * Creates a function, which returns a list of frequently used chats.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param category Category of chats to be returned.
         * @param limit The maximum number of chats to be returned; up to 30.
         */
        public GetTopChats(TopChatCategory category, int limit) {
            this.category = category;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -388410847;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of trending sticker sets. For optimal performance, the number of returned sticker sets is chosen by TDLib.
     *
     * <p> Returns {@link TrendingStickerSets TrendingStickerSets} </p>
     */
    public static class GetTrendingStickerSets extends Function<TrendingStickerSets> {
        /**
         * Type of the sticker sets to return.
         */
        public StickerType stickerType;
        /**
         * The offset from which to return the sticker sets; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of sticker sets to be returned; up to 100. For optimal performance, the number of returned sticker sets is chosen by TDLib and can be smaller than the specified limit, even if the end of the list has not been reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns a list of trending sticker sets. For optimal performance, the number of returned sticker sets is chosen by TDLib.
         *
         * <p> Returns {@link TrendingStickerSets TrendingStickerSets} </p>
         */
        public GetTrendingStickerSets() {
        }

        /**
         * Creates a function, which returns a list of trending sticker sets. For optimal performance, the number of returned sticker sets is chosen by TDLib.
         *
         * <p> Returns {@link TrendingStickerSets TrendingStickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to return.
         * @param offset The offset from which to return the sticker sets; must be non-negative.
         * @param limit The maximum number of sticker sets to be returned; up to 100. For optimal performance, the number of returned sticker sets is chosen by TDLib and can be smaller than the specified limit, even if the end of the list has not been reached.
         */
        public GetTrendingStickerSets(StickerType stickerType, int offset, int limit) {
            this.stickerType = stickerType;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -531085986;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a user by their identifier. This is an offline request if the current user is not a bot.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class GetUser extends Function<User> {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns information about a user by their identifier. This is an offline request if the current user is not a bot.
         *
         * <p> Returns {@link User User} </p>
         */
        public GetUser() {
        }

        /**
         * Creates a function, which returns information about a user by their identifier. This is an offline request if the current user is not a bot.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param userId User identifier.
         */
        public GetUser(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1117363211;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of boosts applied to a chat by a given user; requires administrator rights in the chat; for bots only.
     *
     * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
     */
    public static class GetUserChatBoosts extends Function<FoundChatBoosts> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifier of the user.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns the list of boosts applied to a chat by a given user; requires administrator rights in the chat; for bots only.
         *
         * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
         */
        public GetUserChatBoosts() {
        }

        /**
         * Creates a function, which returns the list of boosts applied to a chat by a given user; requires administrator rights in the chat; for bots only.
         *
         * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
         *
         * @param chatId Identifier of the chat.
         * @param userId Identifier of the user.
         */
        public GetUserChatBoosts(long chatId, long userId) {
            this.chatId = chatId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1190205543;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns full information about a user by their identifier.
     *
     * <p> Returns {@link UserFullInfo UserFullInfo} </p>
     */
    public static class GetUserFullInfo extends Function<UserFullInfo> {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns full information about a user by their identifier.
         *
         * <p> Returns {@link UserFullInfo UserFullInfo} </p>
         */
        public GetUserFullInfo() {
        }

        /**
         * Creates a function, which returns full information about a user by their identifier.
         *
         * <p> Returns {@link UserFullInfo UserFullInfo} </p>
         *
         * @param userId User identifier.
         */
        public GetUserFullInfo(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -776823720;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link, which can be used to get information about the current user.
     *
     * <p> Returns {@link UserLink UserLink} </p>
     */
    public static class GetUserLink extends Function<UserLink> {

        /**
         * Default constructor for a function, which returns an HTTPS link, which can be used to get information about the current user.
         *
         * <p> Returns {@link UserLink UserLink} </p>
         */
        public GetUserLink() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1226839270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current privacy settings.
     *
     * <p> Returns {@link UserPrivacySettingRules UserPrivacySettingRules} </p>
     */
    public static class GetUserPrivacySettingRules extends Function<UserPrivacySettingRules> {
        /**
         * The privacy setting.
         */
        public UserPrivacySetting setting;

        /**
         * Default constructor for a function, which returns the current privacy settings.
         *
         * <p> Returns {@link UserPrivacySettingRules UserPrivacySettingRules} </p>
         */
        public GetUserPrivacySettingRules() {
        }

        /**
         * Creates a function, which returns the current privacy settings.
         *
         * <p> Returns {@link UserPrivacySettingRules UserPrivacySettingRules} </p>
         *
         * @param setting The privacy setting.
         */
        public GetUserPrivacySettingRules(UserPrivacySetting setting) {
            this.setting = setting;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2077223311;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the profile photos of a user. Personal and public photo aren't returned.
     *
     * <p> Returns {@link ChatPhotos ChatPhotos} </p>
     */
    public static class GetUserProfilePhotos extends Function<ChatPhotos> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The number of photos to skip; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of photos to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the profile photos of a user. Personal and public photo aren't returned.
         *
         * <p> Returns {@link ChatPhotos ChatPhotos} </p>
         */
        public GetUserProfilePhotos() {
        }

        /**
         * Creates a function, which returns the profile photos of a user. Personal and public photo aren't returned.
         *
         * <p> Returns {@link ChatPhotos ChatPhotos} </p>
         *
         * @param userId User identifier.
         * @param offset The number of photos to skip; must be non-negative.
         * @param limit The maximum number of photos to be returned; up to 100.
         */
        public GetUserProfilePhotos(long userId, int offset, int limit) {
            this.userId = userId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -908132798;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns support information for the given user; for Telegram support only.
     *
     * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
     */
    public static class GetUserSupportInfo extends Function<UserSupportInfo> {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns support information for the given user; for Telegram support only.
         *
         * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
         */
        public GetUserSupportInfo() {
        }

        /**
         * Creates a function, which returns support information for the given user; for Telegram support only.
         *
         * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
         *
         * @param userId User identifier.
         */
        public GetUserSupportInfo(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1957008133;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of participant identifiers, on whose behalf a video chat in the chat can be joined.
     *
     * <p> Returns {@link MessageSenders MessageSenders} </p>
     */
    public static class GetVideoChatAvailableParticipants extends Function<MessageSenders> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of participant identifiers, on whose behalf a video chat in the chat can be joined.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         */
        public GetVideoChatAvailableParticipants() {
        }

        /**
         * Creates a function, which returns the list of participant identifiers, on whose behalf a video chat in the chat can be joined.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetVideoChatAvailableParticipants(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1000496379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns RTMP URL for streaming to the chat; requires owner privileges.
     *
     * <p> Returns {@link RtmpUrl RtmpUrl} </p>
     */
    public static class GetVideoChatRtmpUrl extends Function<RtmpUrl> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns RTMP URL for streaming to the chat; requires owner privileges.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         */
        public GetVideoChatRtmpUrl() {
        }

        /**
         * Creates a function, which returns RTMP URL for streaming to the chat; requires owner privileges.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetVideoChatRtmpUrl(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1210784543;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS URL of a Web App to open after a link of the type internalLinkTypeWebApp is clicked.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetWebAppLinkUrl extends Function<HttpUrl> {
        /**
         * Identifier of the chat in which the link was clicked; pass 0 if none.
         */
        public long chatId;
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Short name of the Web App.
         */
        public String webAppShortName;
        /**
         * Start parameter from internalLinkTypeWebApp.
         */
        public String startParameter;
        /**
         * Preferred Web App theme; pass null to use the default theme.
         */
        public ThemeParameters theme;
        /**
         * Short name of the application; 0-64 English letters, digits, and underscores.
         */
        public String applicationName;
        /**
         * Pass true if the current user allowed the bot to send them messages.
         */
        public boolean allowWriteAccess;

        /**
         * Default constructor for a function, which returns an HTTPS URL of a Web App to open after a link of the type internalLinkTypeWebApp is clicked.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetWebAppLinkUrl() {
        }

        /**
         * Creates a function, which returns an HTTPS URL of a Web App to open after a link of the type internalLinkTypeWebApp is clicked.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param chatId Identifier of the chat in which the link was clicked; pass 0 if none.
         * @param botUserId Identifier of the target bot.
         * @param webAppShortName Short name of the Web App.
         * @param startParameter Start parameter from internalLinkTypeWebApp.
         * @param theme Preferred Web App theme; pass null to use the default theme.
         * @param applicationName Short name of the application; 0-64 English letters, digits, and underscores.
         * @param allowWriteAccess Pass true if the current user allowed the bot to send them messages.
         */
        public GetWebAppLinkUrl(long chatId, long botUserId, String webAppShortName, String startParameter, ThemeParameters theme, String applicationName, boolean allowWriteAccess) {
            this.chatId = chatId;
            this.botUserId = botUserId;
            this.webAppShortName = webAppShortName;
            this.startParameter = startParameter;
            this.theme = theme;
            this.applicationName = applicationName;
            this.allowWriteAccess = allowWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1326379980;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS URL of a Web App to open from the side menu, a keyboardButtonTypeWebApp button, an inlineQueryResultsButtonTypeWebApp button, or an internalLinkTypeSideMenuBot link.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetWebAppUrl extends Function<HttpUrl> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * The URL from a keyboardButtonTypeWebApp button, inlineQueryResultsButtonTypeWebApp button, an internalLinkTypeSideMenuBot link, or an empty when the bot is opened from the side menu.
         */
        public String url;
        /**
         * Preferred Web App theme; pass null to use the default theme.
         */
        public ThemeParameters theme;
        /**
         * Short name of the application; 0-64 English letters, digits, and underscores.
         */
        public String applicationName;

        /**
         * Default constructor for a function, which returns an HTTPS URL of a Web App to open from the side menu, a keyboardButtonTypeWebApp button, an inlineQueryResultsButtonTypeWebApp button, or an internalLinkTypeSideMenuBot link.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetWebAppUrl() {
        }

        /**
         * Creates a function, which returns an HTTPS URL of a Web App to open from the side menu, a keyboardButtonTypeWebApp button, an inlineQueryResultsButtonTypeWebApp button, or an internalLinkTypeSideMenuBot link.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param url The URL from a keyboardButtonTypeWebApp button, inlineQueryResultsButtonTypeWebApp button, an internalLinkTypeSideMenuBot link, or an empty when the bot is opened from the side menu.
         * @param theme Preferred Web App theme; pass null to use the default theme.
         * @param applicationName Short name of the application; 0-64 English letters, digits, and underscores.
         */
        public GetWebAppUrl(long botUserId, String url, ThemeParameters theme, String applicationName) {
            this.botUserId = botUserId;
            this.url = url;
            this.theme = theme;
            this.applicationName = applicationName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1690578110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an instant view version of a web page if available. Returns a 404 error if the web page has no instant view page.
     *
     * <p> Returns {@link WebPageInstantView WebPageInstantView} </p>
     */
    public static class GetWebPageInstantView extends Function<WebPageInstantView> {
        /**
         * The web page URL.
         */
        public String url;
        /**
         * Pass true to get full instant view for the web page.
         */
        public boolean forceFull;

        /**
         * Default constructor for a function, which returns an instant view version of a web page if available. Returns a 404 error if the web page has no instant view page.
         *
         * <p> Returns {@link WebPageInstantView WebPageInstantView} </p>
         */
        public GetWebPageInstantView() {
        }

        /**
         * Creates a function, which returns an instant view version of a web page if available. Returns a 404 error if the web page has no instant view page.
         *
         * <p> Returns {@link WebPageInstantView WebPageInstantView} </p>
         *
         * @param url The web page URL.
         * @param forceFull Pass true to get full instant view for the web page.
         */
        public GetWebPageInstantView(String url, boolean forceFull) {
            this.url = url;
            this.forceFull = forceFull;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1962649975;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Hides the list of contacts that have close birthdays for 24 hours.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class HideContactCloseBirthdays extends Function<Ok> {

        /**
         * Default constructor for a function, which hides the list of contacts that have close birthdays for 24 hours.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public HideContactCloseBirthdays() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1163065221;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Hides a suggested action.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class HideSuggestedAction extends Function<Ok> {
        /**
         * Suggested action to hide.
         */
        public SuggestedAction action;

        /**
         * Default constructor for a function, which hides a suggested action.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public HideSuggestedAction() {
        }

        /**
         * Creates a function, which hides a suggested action.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param action Suggested action to hide.
         */
        public HideSuggestedAction(SuggestedAction action) {
            this.action = action;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1561384065;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds new contacts or edits existing contacts by their phone numbers; contacts' user identifiers are ignored.
     *
     * <p> Returns {@link ImportedContacts ImportedContacts} </p>
     */
    public static class ImportContacts extends Function<ImportedContacts> {
        /**
         * The list of contacts to import or edit; contacts' vCard are ignored and are not imported.
         */
        public Contact[] contacts;

        /**
         * Default constructor for a function, which adds new contacts or edits existing contacts by their phone numbers; contacts' user identifiers are ignored.
         *
         * <p> Returns {@link ImportedContacts ImportedContacts} </p>
         */
        public ImportContacts() {
        }

        /**
         * Creates a function, which adds new contacts or edits existing contacts by their phone numbers; contacts' user identifiers are ignored.
         *
         * <p> Returns {@link ImportedContacts ImportedContacts} </p>
         *
         * @param contacts The list of contacts to import or edit; contacts' vCard are ignored and are not imported.
         */
        public ImportContacts(Contact[] contacts) {
            this.contacts = contacts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -215132767;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Imports messages exported from another app.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ImportMessages extends Function<Ok> {
        /**
         * Identifier of a chat to which the messages will be imported. It must be an identifier of a private chat with a mutual contact or an identifier of a supergroup chat with canChangeInfo member right.
         */
        public long chatId;
        /**
         * File with messages to import. Only inputFileLocal and inputFileGenerated are supported. The file must not be previously uploaded.
         */
        public InputFile messageFile;
        /**
         * Files used in the imported messages. Only inputFileLocal and inputFileGenerated are supported. The files must not be previously uploaded.
         */
        public InputFile[] attachedFiles;

        /**
         * Default constructor for a function, which imports messages exported from another app.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ImportMessages() {
        }

        /**
         * Creates a function, which imports messages exported from another app.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of a chat to which the messages will be imported. It must be an identifier of a private chat with a mutual contact or an identifier of a supergroup chat with canChangeInfo member right.
         * @param messageFile File with messages to import. Only inputFileLocal and inputFileGenerated are supported. The file must not be previously uploaded.
         * @param attachedFiles Files used in the imported messages. Only inputFileLocal and inputFileGenerated are supported. The files must not be previously uploaded.
         */
        public ImportMessages(long chatId, InputFile messageFile, InputFile[] attachedFiles) {
            this.chatId = chatId;
            this.messageFile = messageFile;
            this.attachedFiles = attachedFiles;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1864116784;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Invites users to an active group call. Sends a service message of type messageInviteVideoChatParticipants for video chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class InviteGroupCallParticipants extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * User identifiers. At most 10 users can be invited simultaneously.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which invites users to an active group call. Sends a service message of type messageInviteVideoChatParticipants for video chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public InviteGroupCallParticipants() {
        }

        /**
         * Creates a function, which invites users to an active group call. Sends a service message of type messageInviteVideoChatParticipants for video chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param userIds User identifiers. At most 10 users can be invited simultaneously.
         */
        public InviteGroupCallParticipants(int groupCallId, long[] userIds) {
            this.groupCallId = groupCallId;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1867097679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds the current user as a new member to a chat. Private and secret chats can't be joined using this method. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class JoinChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which adds the current user as a new member to a chat. Private and secret chats can't be joined using this method. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public JoinChat() {
        }

        /**
         * Creates a function, which adds the current user as a new member to a chat. Private and secret chats can't be joined using this method. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public JoinChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 326769313;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Uses an invite link to add the current user to the chat if possible. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class JoinChatByInviteLink extends Function<Chat> {
        /**
         * Invite link to use.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which uses an invite link to add the current user to the chat if possible. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public JoinChatByInviteLink() {
        }

        /**
         * Creates a function, which uses an invite link to add the current user to the chat if possible. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param inviteLink Invite link to use.
         */
        public JoinChatByInviteLink(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1049973882;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Joins an active group call. Returns join response payload for tgcalls.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class JoinGroupCall extends Function<Text> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Identifier of a group call participant, which will be used to join the call; pass null to join as self; video chats only.
         */
        public MessageSender participantId;
        /**
         * Caller audio channel synchronization source identifier; received from tgcalls.
         */
        public int audioSourceId;
        /**
         * Group call join payload; received from tgcalls.
         */
        public String payload;
        /**
         * Pass true to join the call with muted microphone.
         */
        public boolean isMuted;
        /**
         * Pass true if the user's video is enabled.
         */
        public boolean isMyVideoEnabled;
        /**
         * If non-empty, invite hash to be used to join the group call without being muted by administrators.
         */
        public String inviteHash;

        /**
         * Default constructor for a function, which joins an active group call. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public JoinGroupCall() {
        }

        /**
         * Creates a function, which joins an active group call. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param groupCallId Group call identifier.
         * @param participantId Identifier of a group call participant, which will be used to join the call; pass null to join as self; video chats only.
         * @param audioSourceId Caller audio channel synchronization source identifier; received from tgcalls.
         * @param payload Group call join payload; received from tgcalls.
         * @param isMuted Pass true to join the call with muted microphone.
         * @param isMyVideoEnabled Pass true if the user's video is enabled.
         * @param inviteHash If non-empty, invite hash to be used to join the group call without being muted by administrators.
         */
        public JoinGroupCall(int groupCallId, MessageSender participantId, int audioSourceId, String payload, boolean isMuted, boolean isMyVideoEnabled, String inviteHash) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.audioSourceId = audioSourceId;
            this.payload = payload;
            this.isMuted = isMuted;
            this.isMyVideoEnabled = isMyVideoEnabled;
            this.inviteHash = inviteHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1043773467;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Launches a prepaid Telegram Premium giveaway.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LaunchPrepaidPremiumGiveaway extends Function<Ok> {
        /**
         * Unique identifier of the prepaid giveaway.
         */
        public long giveawayId;
        /**
         * Giveaway parameters.
         */
        public PremiumGiveawayParameters parameters;

        /**
         * Default constructor for a function, which launches a prepaid Telegram Premium giveaway.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LaunchPrepaidPremiumGiveaway() {
        }

        /**
         * Creates a function, which launches a prepaid Telegram Premium giveaway.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param giveawayId Unique identifier of the prepaid giveaway.
         * @param parameters Giveaway parameters.
         */
        public LaunchPrepaidPremiumGiveaway(long giveawayId, PremiumGiveawayParameters parameters) {
            this.giveawayId = giveawayId;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395195553;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes the current user from chat members. Private and secret chats can't be left using this method.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LeaveChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes the current user from chat members. Private and secret chats can't be left using this method.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LeaveChat() {
        }

        /**
         * Creates a function, which removes the current user from chat members. Private and secret chats can't be left using this method.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public LeaveChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1825080735;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Leaves a group call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LeaveGroupCall extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which leaves a group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LeaveGroupCall() {
        }

        /**
         * Creates a function, which leaves a group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public LeaveGroupCall(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 980152233;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more active stories from a story list. The loaded stories will be sent through updates. Active stories are sorted by the pair (activeStories.order, activeStories.storySenderChatId) in descending order. Returns a 404 error if all active stories have been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadActiveStories extends Function<Ok> {
        /**
         * The story list in which to load active stories.
         */
        public StoryList storyList;

        /**
         * Default constructor for a function, which loads more active stories from a story list. The loaded stories will be sent through updates. Active stories are sorted by the pair (activeStories.order, activeStories.storySenderChatId) in descending order. Returns a 404 error if all active stories have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadActiveStories() {
        }

        /**
         * Creates a function, which loads more active stories from a story list. The loaded stories will be sent through updates. Active stories are sorted by the pair (activeStories.order, activeStories.storySenderChatId) in descending order. Returns a 404 error if all active stories have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyList The story list in which to load active stories.
         */
        public LoadActiveStories(StoryList storyList) {
            this.storyList = storyList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2106390328;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more chats from a chat list. The loaded chats and their positions in the chat list will be sent through updates. Chats are sorted by the pair (chat.position.order, chat.id) in descending order. Returns a 404 error if all chats have been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadChats extends Function<Ok> {
        /**
         * The chat list in which to load chats; pass null to load chats from the main chat list.
         */
        public ChatList chatList;
        /**
         * The maximum number of chats to be loaded. For optimal performance, the number of loaded chats is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which loads more chats from a chat list. The loaded chats and their positions in the chat list will be sent through updates. Chats are sorted by the pair (chat.position.order, chat.id) in descending order. Returns a 404 error if all chats have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadChats() {
        }

        /**
         * Creates a function, which loads more chats from a chat list. The loaded chats and their positions in the chat list will be sent through updates. Chats are sorted by the pair (chat.position.order, chat.id) in descending order. Returns a 404 error if all chats have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatList The chat list in which to load chats; pass null to load chats from the main chat list.
         * @param limit The maximum number of chats to be loaded. For optimal performance, the number of loaded chats is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public LoadChats(ChatList chatList, int limit) {
            this.chatList = chatList;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1885635205;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more participants of a group call. The loaded participants will be received through updates. Use the field groupCall.loadedAllParticipants to check whether all participants have already been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadGroupCallParticipants extends Function<Ok> {
        /**
         * Group call identifier. The group call must be previously received through getGroupCall and must be joined or being joined.
         */
        public int groupCallId;
        /**
         * The maximum number of participants to load; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which loads more participants of a group call. The loaded participants will be received through updates. Use the field groupCall.loadedAllParticipants to check whether all participants have already been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadGroupCallParticipants() {
        }

        /**
         * Creates a function, which loads more participants of a group call. The loaded participants will be received through updates. Use the field groupCall.loadedAllParticipants to check whether all participants have already been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier. The group call must be previously received through getGroupCall and must be joined or being joined.
         * @param limit The maximum number of participants to load; up to 100.
         */
        public LoadGroupCallParticipants(int groupCallId, int limit) {
            this.groupCallId = groupCallId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 938720974;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads quick reply messages that can be sent by a given quick reply shortcut. The loaded messages will be sent through updateQuickReplyShortcutMessages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadQuickReplyShortcutMessages extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut.
         */
        public int shortcutId;

        /**
         * Default constructor for a function, which loads quick reply messages that can be sent by a given quick reply shortcut. The loaded messages will be sent through updateQuickReplyShortcutMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadQuickReplyShortcutMessages() {
        }

        /**
         * Creates a function, which loads quick reply messages that can be sent by a given quick reply shortcut. The loaded messages will be sent through updateQuickReplyShortcutMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut.
         */
        public LoadQuickReplyShortcutMessages(int shortcutId) {
            this.shortcutId = shortcutId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -46092588;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads quick reply shortcuts created by the current user. The loaded topics will be sent through updateQuickReplyShortcuts.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadQuickReplyShortcuts extends Function<Ok> {

        /**
         * Default constructor for a function, which loads quick reply shortcuts created by the current user. The loaded topics will be sent through updateQuickReplyShortcuts.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadQuickReplyShortcuts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1016614243;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more Saved Messages topics. The loaded topics will be sent through updateSavedMessagesTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadSavedMessagesTopics extends Function<Ok> {
        /**
         * The maximum number of topics to be loaded. For optimal performance, the number of loaded topics is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which loads more Saved Messages topics. The loaded topics will be sent through updateSavedMessagesTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadSavedMessagesTopics() {
        }

        /**
         * Creates a function, which loads more Saved Messages topics. The loaded topics will be sent through updateSavedMessagesTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param limit The maximum number of topics to be loaded. For optimal performance, the number of loaded topics is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public LoadSavedMessagesTopics(int limit) {
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 289855160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Closes the TDLib instance after a proper logout. Requires an available network connection. All local data will be destroyed. After the logout completes, updateAuthorizationState with authorizationStateClosed will be sent.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LogOut extends Function<Ok> {

        /**
         * Default constructor for a function, which closes the TDLib instance after a proper logout. Requires an available network connection. All local data will be destroyed. After the logout completes, updateAuthorizationState with authorizationStateClosed will be sent.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LogOut() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1581923301;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats).
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which informs TDLib that the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats).
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenChat() {
        }

        /**
         * Creates a function, which informs TDLib that the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats).
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public OpenChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -323371509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a chat was opened from the list of similar chats. The method is independent of openChat and closeChat methods.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenChatSimilarChat extends Function<Ok> {
        /**
         * Identifier of the original chat, which similar chats were requested.
         */
        public long chatId;
        /**
         * Identifier of the opened chat.
         */
        public long openedChatId;

        /**
         * Default constructor for a function, which informs TDLib that a chat was opened from the list of similar chats. The method is independent of openChat and closeChat methods.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenChatSimilarChat() {
        }

        /**
         * Creates a function, which informs TDLib that a chat was opened from the list of similar chats. The method is independent of openChat and closeChat methods.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the original chat, which similar chats were requested.
         * @param openedChatId Identifier of the opened chat.
         */
        public OpenChatSimilarChat(long chatId, long openedChatId) {
            this.chatId = chatId;
            this.openedChatId = openedChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1884883949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenMessageContent extends Function<Ok> {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Identifier of the message with the opened content.
         */
        public long messageId;

        /**
         * Default constructor for a function, which informs TDLib that the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenMessageContent() {
        }

        /**
         * Creates a function, which informs TDLib that the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Identifier of the message with the opened content.
         */
        public OpenMessageContent(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -739088005;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a story is opened and is being viewed by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenStory extends Function<Ok> {
        /**
         * The identifier of the sender of the opened story.
         */
        public long storySenderChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;

        /**
         * Default constructor for a function, which informs TDLib that a story is opened and is being viewed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenStory() {
        }

        /**
         * Creates a function, which informs TDLib that a story is opened and is being viewed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storySenderChatId The identifier of the sender of the opened story.
         * @param storyId The identifier of the story.
         */
        public OpenStory(long storySenderChatId, int storyId) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -824542083;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a Web App is being opened from the attachment menu, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an inlineKeyboardButtonTypeWebApp button. For each bot, a confirmation alert about data sent to the bot must be shown once.
     *
     * <p> Returns {@link WebAppInfo WebAppInfo} </p>
     */
    public static class OpenWebApp extends Function<WebAppInfo> {
        /**
         * Identifier of the chat in which the Web App is opened. The Web App can't be opened in secret chats.
         */
        public long chatId;
        /**
         * Identifier of the bot, providing the Web App.
         */
        public long botUserId;
        /**
         * The URL from an inlineKeyboardButtonTypeWebApp button, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an empty string otherwise.
         */
        public String url;
        /**
         * Preferred Web App theme; pass null to use the default theme.
         */
        public ThemeParameters theme;
        /**
         * Short name of the application; 0-64 English letters, digits, and underscores.
         */
        public String applicationName;
        /**
         * If not 0, the message thread identifier in which the message will be sent.
         */
        public long messageThreadId;
        /**
         * Information about the message or story to be replied in the message sent by the Web App; pass null if none.
         */
        public InputMessageReplyTo replyTo;

        /**
         * Default constructor for a function, which informs TDLib that a Web App is being opened from the attachment menu, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an inlineKeyboardButtonTypeWebApp button. For each bot, a confirmation alert about data sent to the bot must be shown once.
         *
         * <p> Returns {@link WebAppInfo WebAppInfo} </p>
         */
        public OpenWebApp() {
        }

        /**
         * Creates a function, which informs TDLib that a Web App is being opened from the attachment menu, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an inlineKeyboardButtonTypeWebApp button. For each bot, a confirmation alert about data sent to the bot must be shown once.
         *
         * <p> Returns {@link WebAppInfo WebAppInfo} </p>
         *
         * @param chatId Identifier of the chat in which the Web App is opened. The Web App can't be opened in secret chats.
         * @param botUserId Identifier of the bot, providing the Web App.
         * @param url The URL from an inlineKeyboardButtonTypeWebApp button, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an empty string otherwise.
         * @param theme Preferred Web App theme; pass null to use the default theme.
         * @param applicationName Short name of the application; 0-64 English letters, digits, and underscores.
         * @param messageThreadId If not 0, the message thread identifier in which the message will be sent.
         * @param replyTo Information about the message or story to be replied in the message sent by the Web App; pass null if none.
         */
        public OpenWebApp(long chatId, long botUserId, String url, ThemeParameters theme, String applicationName, long messageThreadId, InputMessageReplyTo replyTo) {
            this.chatId = chatId;
            this.botUserId = botUserId;
            this.url = url;
            this.theme = theme;
            this.applicationName = applicationName;
            this.messageThreadId = messageThreadId;
            this.replyTo = replyTo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1339660624;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted.
     *
     * <p> Returns {@link StorageStatistics StorageStatistics} </p>
     */
    public static class OptimizeStorage extends Function<StorageStatistics> {
        /**
         * Limit on the total size of files after deletion, in bytes. Pass -1 to use the default limit.
         */
        public long size;
        /**
         * Limit on the time that has passed since the last time a file was accessed (or creation time for some filesystems). Pass -1 to use the default limit.
         */
        public int ttl;
        /**
         * Limit on the total number of files after deletion. Pass -1 to use the default limit.
         */
        public int count;
        /**
         * The amount of time after the creation of a file during which it can't be deleted, in seconds. Pass -1 to use the default value.
         */
        public int immunityDelay;
        /**
         * If non-empty, only files with the given types are considered. By default, all types except thumbnails, profile photos, stickers and wallpapers are deleted.
         */
        public FileType[] fileTypes;
        /**
         * If non-empty, only files from the given chats are considered. Use 0 as chat identifier to delete files not belonging to any chat (e.g., profile photos).
         */
        public long[] chatIds;
        /**
         * If non-empty, files from the given chats are excluded. Use 0 as chat identifier to exclude all files not belonging to any chat (e.g., profile photos).
         */
        public long[] excludeChatIds;
        /**
         * Pass true if statistics about the files that were deleted must be returned instead of the whole storage usage statistics. Affects only returned statistics.
         */
        public boolean returnDeletedFileStatistics;
        /**
         * Same as in getStorageStatistics. Affects only returned statistics.
         */
        public int chatLimit;

        /**
         * Default constructor for a function, which optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted.
         *
         * <p> Returns {@link StorageStatistics StorageStatistics} </p>
         */
        public OptimizeStorage() {
        }

        /**
         * Creates a function, which optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted.
         *
         * <p> Returns {@link StorageStatistics StorageStatistics} </p>
         *
         * @param size Limit on the total size of files after deletion, in bytes. Pass -1 to use the default limit.
         * @param ttl Limit on the time that has passed since the last time a file was accessed (or creation time for some filesystems). Pass -1 to use the default limit.
         * @param count Limit on the total number of files after deletion. Pass -1 to use the default limit.
         * @param immunityDelay The amount of time after the creation of a file during which it can't be deleted, in seconds. Pass -1 to use the default value.
         * @param fileTypes If non-empty, only files with the given types are considered. By default, all types except thumbnails, profile photos, stickers and wallpapers are deleted.
         * @param chatIds If non-empty, only files from the given chats are considered. Use 0 as chat identifier to delete files not belonging to any chat (e.g., profile photos).
         * @param excludeChatIds If non-empty, files from the given chats are excluded. Use 0 as chat identifier to exclude all files not belonging to any chat (e.g., profile photos).
         * @param returnDeletedFileStatistics Pass true if statistics about the files that were deleted must be returned instead of the whole storage usage statistics. Affects only returned statistics.
         * @param chatLimit Same as in getStorageStatistics. Affects only returned statistics.
         */
        public OptimizeStorage(long size, int ttl, int count, int immunityDelay, FileType[] fileTypes, long[] chatIds, long[] excludeChatIds, boolean returnDeletedFileStatistics, int chatLimit) {
            this.size = size;
            this.ttl = ttl;
            this.count = count;
            this.immunityDelay = immunityDelay;
            this.fileTypes = fileTypes;
            this.chatIds = chatIds;
            this.excludeChatIds = excludeChatIds;
            this.returnDeletedFileStatistics = returnDeletedFileStatistics;
            this.chatLimit = chatLimit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 853186759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Parses Markdown entities in a human-friendly format, ignoring markup errors. Can be called synchronously.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class ParseMarkdown extends Function<FormattedText> {
        /**
         * The text to parse. For example, &quot;__italic__ ~~strikethrough~~ ||spoiler|| **bold** `code` ```pre``` __[italic__ textUrl](telegram.org) _Italic**bold italic_Bold**&quot;.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which parses Markdown entities in a human-friendly format, ignoring markup errors. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public ParseMarkdown() {
        }

        /**
         * Creates a function, which parses Markdown entities in a human-friendly format, ignoring markup errors. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text The text to parse. For example, &quot;__italic__ ~~strikethrough~~ ||spoiler|| **bold** `code` ```pre``` __[italic__ textUrl](telegram.org) _Italic**bold italic_Bold**&quot;.
         */
        public ParseMarkdown(FormattedText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 756366063;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Parses Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl and MentionName entities from a marked-up text. Can be called synchronously.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class ParseTextEntities extends Function<FormattedText> {
        /**
         * The text to parse.
         */
        public String text;
        /**
         * Text parse mode.
         */
        public TextParseMode parseMode;

        /**
         * Default constructor for a function, which parses Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl and MentionName entities from a marked-up text. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public ParseTextEntities() {
        }

        /**
         * Creates a function, which parses Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl and MentionName entities from a marked-up text. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text The text to parse.
         * @param parseMode Text parse mode.
         */
        public ParseTextEntities(String text, TextParseMode parseMode) {
            this.text = text;
            this.parseMode = parseMode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1709194593;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Pins a message in a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class PinChatMessage extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifier of the new pinned message.
         */
        public long messageId;
        /**
         * Pass true to disable notification about the pinned message. Notifications are always disabled in channels and private chats.
         */
        public boolean disableNotification;
        /**
         * Pass true to pin the message only for self; private chats only.
         */
        public boolean onlyForSelf;

        /**
         * Default constructor for a function, which pins a message in a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public PinChatMessage() {
        }

        /**
         * Creates a function, which pins a message in a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageId Identifier of the new pinned message.
         * @param disableNotification Pass true to disable notification about the pinned message. Notifications are always disabled in channels and private chats.
         * @param onlyForSelf Pass true to pin the message only for self; private chats only.
         */
        public PinChatMessage(long chatId, long messageId, boolean disableNotification, boolean onlyForSelf) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.disableNotification = disableNotification;
            this.onlyForSelf = onlyForSelf;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2034719663;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Computes time needed to receive a response from a Telegram server through a proxy. Can be called before authorization.
     *
     * <p> Returns {@link Seconds Seconds} </p>
     */
    public static class PingProxy extends Function<Seconds> {
        /**
         * Proxy identifier. Use 0 to ping a Telegram server without a proxy.
         */
        public int proxyId;

        /**
         * Default constructor for a function, which computes time needed to receive a response from a Telegram server through a proxy. Can be called before authorization.
         *
         * <p> Returns {@link Seconds Seconds} </p>
         */
        public PingProxy() {
        }

        /**
         * Creates a function, which computes time needed to receive a response from a Telegram server through a proxy. Can be called before authorization.
         *
         * <p> Returns {@link Seconds Seconds} </p>
         *
         * @param proxyId Proxy identifier. Use 0 to ping a Telegram server without a proxy.
         */
        public PingProxy(int proxyId) {
            this.proxyId = proxyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -979681103;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Preliminary uploads a file to the cloud before sending it in a message, which can be useful for uploading of being recorded voice and video notes. In all other cases there is no need to preliminary upload a file. Updates updateFile will be used to notify about upload progress. The upload will not be completed until the file is sent in a message.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class PreliminaryUploadFile extends Function<File> {
        /**
         * File to upload.
         */
        public InputFile file;
        /**
         * File type; pass null if unknown.
         */
        public FileType fileType;
        /**
         * Priority of the upload (1-32). The higher the priority, the earlier the file will be uploaded. If the priorities of two files are equal, then the first one for which preliminaryUploadFile was called will be uploaded first.
         */
        public int priority;

        /**
         * Default constructor for a function, which preliminary uploads a file to the cloud before sending it in a message, which can be useful for uploading of being recorded voice and video notes. In all other cases there is no need to preliminary upload a file. Updates updateFile will be used to notify about upload progress. The upload will not be completed until the file is sent in a message.
         *
         * <p> Returns {@link File File} </p>
         */
        public PreliminaryUploadFile() {
        }

        /**
         * Creates a function, which preliminary uploads a file to the cloud before sending it in a message, which can be useful for uploading of being recorded voice and video notes. In all other cases there is no need to preliminary upload a file. Updates updateFile will be used to notify about upload progress. The upload will not be completed until the file is sent in a message.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param file File to upload.
         * @param fileType File type; pass null if unknown.
         * @param priority Priority of the upload (1-32). The higher the priority, the earlier the file will be uploaded. If the priorities of two files are equal, then the first one for which preliminaryUploadFile was called will be uploaded first.
         */
        public PreliminaryUploadFile(InputFile file, FileType fileType, int priority) {
            this.file = file;
            this.fileType = fileType;
            this.priority = priority;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1894239129;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Process new chats added to a shareable chat folder by its owner.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessChatFolderNewChats extends Function<Ok> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Identifiers of the new chats, which are added to the chat folder. The chats are automatically joined if they aren't joined yet.
         */
        public long[] addedChatIds;

        /**
         * Default constructor for a function, which process new chats added to a shareable chat folder by its owner.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessChatFolderNewChats() {
        }

        /**
         * Creates a function, which process new chats added to a shareable chat folder by its owner.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param addedChatIds Identifiers of the new chats, which are added to the chat folder. The chats are automatically joined if they aren't joined yet.
         */
        public ProcessChatFolderNewChats(int chatFolderId, long[] addedChatIds) {
            this.chatFolderId = chatFolderId;
            this.addedChatIds = addedChatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1498280672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Handles a pending join request in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessChatJoinRequest extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user that sent the request.
         */
        public long userId;
        /**
         * Pass true to approve the request; pass false to decline it.
         */
        public boolean approve;

        /**
         * Default constructor for a function, which handles a pending join request in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessChatJoinRequest() {
        }

        /**
         * Creates a function, which handles a pending join request in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param userId Identifier of the user that sent the request.
         * @param approve Pass true to approve the request; pass false to decline it.
         */
        public ProcessChatJoinRequest(long chatId, long userId, boolean approve) {
            this.chatId = chatId;
            this.userId = userId;
            this.approve = approve;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1004876963;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Handles all pending join requests for a given link in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessChatJoinRequests extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link for which to process join requests. If empty, all join requests will be processed. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         */
        public String inviteLink;
        /**
         * Pass true to approve all requests; pass false to decline them.
         */
        public boolean approve;

        /**
         * Default constructor for a function, which handles all pending join requests for a given link in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessChatJoinRequests() {
        }

        /**
         * Creates a function, which handles all pending join requests for a given link in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link for which to process join requests. If empty, all join requests will be processed. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         * @param approve Pass true to approve all requests; pass false to decline them.
         */
        public ProcessChatJoinRequests(long chatId, String inviteLink, boolean approve) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.approve = approve;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1048722894;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Handles a push notification. Returns error with code 406 if the push notification is not supported and connection to the server is required to fetch new data. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessPushNotification extends Function<Ok> {
        /**
         * JSON-encoded push notification payload with all fields sent by the server, and &quot;google.sentTime&quot; and &quot;google.notification.sound&quot; fields added.
         */
        public String payload;

        /**
         * Default constructor for a function, which handles a push notification. Returns error with code 406 if the push notification is not supported and connection to the server is required to fetch new data. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessPushNotification() {
        }

        /**
         * Creates a function, which handles a push notification. Returns error with code 406 if the push notification is not supported and connection to the server is required to fetch new data. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param payload JSON-encoded push notification payload with all fields sent by the server, and &quot;google.sentTime&quot; and &quot;google.notification.sound&quot; fields added.
         */
        public ProcessPushNotification(String payload) {
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 786679952;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Rates recognized speech in a video note or a voice note message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RateSpeechRecognition extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Pass true if the speech recognition is good.
         */
        public boolean isGood;

        /**
         * Default constructor for a function, which rates recognized speech in a video note or a voice note message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RateSpeechRecognition() {
        }

        /**
         * Creates a function, which rates recognized speech in a video note or a voice note message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param isGood Pass true if the speech recognition is good.
         */
        public RateSpeechRecognition(long chatId, long messageId, boolean isGood) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.isGood = isGood;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -287521867;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all mentions in a chat as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllChatMentions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which marks all mentions in a chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllChatMentions() {
        }

        /**
         * Creates a function, which marks all mentions in a chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReadAllChatMentions(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1357558453;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all reactions in a chat or a forum topic as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllChatReactions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which marks all reactions in a chat or a forum topic as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllChatReactions() {
        }

        /**
         * Creates a function, which marks all reactions in a chat or a forum topic as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReadAllChatReactions(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1421973357;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all mentions in a forum topic as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllMessageThreadMentions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message thread identifier in which mentions are marked as read.
         */
        public long messageThreadId;

        /**
         * Default constructor for a function, which marks all mentions in a forum topic as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllMessageThreadMentions() {
        }

        /**
         * Creates a function, which marks all mentions in a forum topic as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageThreadId Message thread identifier in which mentions are marked as read.
         */
        public ReadAllMessageThreadMentions(long chatId, long messageThreadId) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1323136341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all reactions in a forum topic as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllMessageThreadReactions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message thread identifier in which reactions are marked as read.
         */
        public long messageThreadId;

        /**
         * Default constructor for a function, which marks all reactions in a forum topic as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllMessageThreadReactions() {
        }

        /**
         * Creates a function, which marks all reactions in a forum topic as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageThreadId Message thread identifier in which reactions are marked as read.
         */
        public ReadAllMessageThreadReactions(long chatId, long messageThreadId) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -792975554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Traverse all chats in a chat list and marks all messages in the chats as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadChatList extends Function<Ok> {
        /**
         * Chat list in which to mark all chats as read.
         */
        public ChatList chatList;

        /**
         * Default constructor for a function, which traverse all chats in a chat list and marks all messages in the chats as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadChatList() {
        }

        /**
         * Creates a function, which traverse all chats in a chat list and marks all messages in the chats as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatList Chat list in which to mark all chats as read.
         */
        public ReadChatList(ChatList chatList) {
            this.chatList = chatList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1117480790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reads a part of a file from the TDLib file cache and returns read bytes. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct read from the file.
     *
     * <p> Returns {@link FilePart FilePart} </p>
     */
    public static class ReadFilePart extends Function<FilePart> {
        /**
         * Identifier of the file. The file must be located in the TDLib file cache.
         */
        public int fileId;
        /**
         * The offset from which to read the file.
         */
        public long offset;
        /**
         * Number of bytes to read. An error will be returned if there are not enough bytes available in the file from the specified position. Pass 0 to read all available data from the specified position.
         */
        public long count;

        /**
         * Default constructor for a function, which reads a part of a file from the TDLib file cache and returns read bytes. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct read from the file.
         *
         * <p> Returns {@link FilePart FilePart} </p>
         */
        public ReadFilePart() {
        }

        /**
         * Creates a function, which reads a part of a file from the TDLib file cache and returns read bytes. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct read from the file.
         *
         * <p> Returns {@link FilePart FilePart} </p>
         *
         * @param fileId Identifier of the file. The file must be located in the TDLib file cache.
         * @param offset The offset from which to read the file.
         * @param count Number of bytes to read. An error will be returned if there are not enough bytes available in the file from the specified position. Pass 0 to read all available data from the specified position.
         */
        public ReadFilePart(int fileId, long offset, long count) {
            this.fileId = fileId;
            this.offset = offset;
            this.count = count;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 906798861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Readds quick reply messages which failed to add. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is readded, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be readded, null will be returned instead of the message.
     *
     * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
     */
    public static class ReaddQuickReplyShortcutMessages extends Function<QuickReplyMessages> {
        /**
         * Name of the target shortcut.
         */
        public String shortcutName;
        /**
         * Identifiers of the quick reply messages to readd. Message identifiers must be in a strictly increasing order.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which readds quick reply messages which failed to add. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is readded, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be readded, null will be returned instead of the message.
         *
         * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
         */
        public ReaddQuickReplyShortcutMessages() {
        }

        /**
         * Creates a function, which readds quick reply messages which failed to add. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is readded, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be readded, null will be returned instead of the message.
         *
         * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
         *
         * @param shortcutName Name of the target shortcut.
         * @param messageIds Identifiers of the quick reply messages to readd. Message identifiers must be in a strictly increasing order.
         */
        public ReaddQuickReplyShortcutMessages(String shortcutName, long[] messageIds) {
            this.shortcutName = shortcutName;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 387399566;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Recognizes speech in a video note or a voice note message. The message must be successfully sent, must not be scheduled, and must be from a non-secret chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RecognizeSpeech extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which recognizes speech in a video note or a voice note message. The message must be successfully sent, must not be scheduled, and must be from a non-secret chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RecognizeSpeech() {
        }

        /**
         * Creates a function, which recognizes speech in a video note or a voice note message. The message must be successfully sent, must not be scheduled, and must be from a non-secret chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         */
        public RecognizeSpeech(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1741947577;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Recovers the 2-step verification password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RecoverAuthenticationPassword extends Function<Ok> {
        /**
         * Recovery code to check.
         */
        public String recoveryCode;
        /**
         * New 2-step verification password of the user; may be empty to remove the password.
         */
        public String newPassword;
        /**
         * New password hint; may be empty.
         */
        public String newHint;

        /**
         * Default constructor for a function, which recovers the 2-step verification password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RecoverAuthenticationPassword() {
        }

        /**
         * Creates a function, which recovers the 2-step verification password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param recoveryCode Recovery code to check.
         * @param newPassword New 2-step verification password of the user; may be empty to remove the password.
         * @param newHint New password hint; may be empty.
         */
        public RecoverAuthenticationPassword(String recoveryCode, String newPassword, String newHint) {
            this.recoveryCode = recoveryCode;
            this.newPassword = newPassword;
            this.newHint = newHint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -131001053;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Recovers the 2-step verification password using a recovery code sent to an email address that was previously set up.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class RecoverPassword extends Function<PasswordState> {
        /**
         * Recovery code to check.
         */
        public String recoveryCode;
        /**
         * New 2-step verification password of the user; may be empty to remove the password.
         */
        public String newPassword;
        /**
         * New password hint; may be empty.
         */
        public String newHint;

        /**
         * Default constructor for a function, which recovers the 2-step verification password using a recovery code sent to an email address that was previously set up.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public RecoverPassword() {
        }

        /**
         * Creates a function, which recovers the 2-step verification password using a recovery code sent to an email address that was previously set up.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         *
         * @param recoveryCode Recovery code to check.
         * @param newPassword New 2-step verification password of the user; may be empty to remove the password.
         * @param newHint New password hint; may be empty.
         */
        public RecoverPassword(String recoveryCode, String newPassword, String newHint) {
            this.recoveryCode = recoveryCode;
            this.newPassword = newPassword;
            this.newHint = newHint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1524262541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Refunds a previously done payment in Telegram Stars.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RefundStarPayment extends Function<Ok> {
        /**
         * Identifier of the user that did the payment.
         */
        public long userId;
        /**
         * Telegram payment identifier.
         */
        public String telegramPaymentChargeId;

        /**
         * Default constructor for a function, which refunds a previously done payment in Telegram Stars.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RefundStarPayment() {
        }

        /**
         * Creates a function, which refunds a previously done payment in Telegram Stars.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user that did the payment.
         * @param telegramPaymentChargeId Telegram payment identifier.
         */
        public RefundStarPayment(long userId, String telegramPaymentChargeId) {
            this.userId = userId;
            this.telegramPaymentChargeId = telegramPaymentChargeId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1804165035;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Registers the currently used device for receiving push notifications. Returns a globally unique identifier of the push notification subscription.
     *
     * <p> Returns {@link PushReceiverId PushReceiverId} </p>
     */
    public static class RegisterDevice extends Function<PushReceiverId> {
        /**
         * Device token.
         */
        public DeviceToken deviceToken;
        /**
         * List of user identifiers of other users currently using the application.
         */
        public long[] otherUserIds;

        /**
         * Default constructor for a function, which registers the currently used device for receiving push notifications. Returns a globally unique identifier of the push notification subscription.
         *
         * <p> Returns {@link PushReceiverId PushReceiverId} </p>
         */
        public RegisterDevice() {
        }

        /**
         * Creates a function, which registers the currently used device for receiving push notifications. Returns a globally unique identifier of the push notification subscription.
         *
         * <p> Returns {@link PushReceiverId PushReceiverId} </p>
         *
         * @param deviceToken Device token.
         * @param otherUserIds List of user identifiers of other users currently using the application.
         */
        public RegisterDevice(DeviceToken deviceToken, long[] otherUserIds) {
            this.deviceToken = deviceToken;
            this.otherUserIds = otherUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 366088823;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Finishes user registration. Works only when the current authorization state is authorizationStateWaitRegistration.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RegisterUser extends Function<Ok> {
        /**
         * The first name of the user; 1-64 characters.
         */
        public String firstName;
        /**
         * The last name of the user; 0-64 characters.
         */
        public String lastName;
        /**
         * Pass true to disable notification about the current user joining Telegram for other users that added them to contact list.
         */
        public boolean disableNotification;

        /**
         * Default constructor for a function, which finishes user registration. Works only when the current authorization state is authorizationStateWaitRegistration.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RegisterUser() {
        }

        /**
         * Creates a function, which finishes user registration. Works only when the current authorization state is authorizationStateWaitRegistration.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param firstName The first name of the user; 1-64 characters.
         * @param lastName The last name of the user; 0-64 characters.
         * @param disableNotification Pass true to disable notification about the current user joining Telegram for other users that added them to contact list.
         */
        public RegisterUser(String firstName, String lastName, boolean disableNotification) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.disableNotification = disableNotification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1012247828;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all files from the file download list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveAllFilesFromDownloads extends Function<Ok> {
        /**
         * Pass true to remove only active downloads, including paused.
         */
        public boolean onlyActive;
        /**
         * Pass true to remove only completed downloads.
         */
        public boolean onlyCompleted;
        /**
         * Pass true to delete the file from the TDLib file cache.
         */
        public boolean deleteFromCache;

        /**
         * Default constructor for a function, which removes all files from the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveAllFilesFromDownloads() {
        }

        /**
         * Creates a function, which removes all files from the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param onlyActive Pass true to remove only active downloads, including paused.
         * @param onlyCompleted Pass true to remove only completed downloads.
         * @param deleteFromCache Pass true to delete the file from the TDLib file cache.
         */
        public RemoveAllFilesFromDownloads(boolean onlyActive, boolean onlyCompleted, boolean deleteFromCache) {
            this.onlyActive = onlyActive;
            this.onlyCompleted = onlyCompleted;
            this.deleteFromCache = deleteFromCache;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1186433402;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes the connected business bot from a specific chat by adding the chat to businessRecipients.excludedChatIds.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveBusinessConnectedBotFromChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes the connected business bot from a specific chat by adding the chat to businessRecipients.excludedChatIds.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveBusinessConnectedBotFromChat() {
        }

        /**
         * Creates a function, which removes the connected business bot from a specific chat by adding the chat to businessRecipients.excludedChatIds.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public RemoveBusinessConnectedBotFromChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2020766707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a chat action bar without any other action.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveChatActionBar extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes a chat action bar without any other action.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveChatActionBar() {
        }

        /**
         * Creates a function, which removes a chat action bar without any other action.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public RemoveChatActionBar(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1650968070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes users from the contact list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveContacts extends Function<Ok> {
        /**
         * Identifiers of users to be deleted.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which removes users from the contact list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveContacts() {
        }

        /**
         * Creates a function, which removes users from the contact list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userIds Identifiers of users to be deleted.
         */
        public RemoveContacts(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1943858054;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a sticker from the list of favorite stickers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveFavoriteSticker extends Function<Ok> {
        /**
         * Sticker file to delete from the list.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which removes a sticker from the list of favorite stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveFavoriteSticker() {
        }

        /**
         * Creates a function, which removes a sticker from the list of favorite stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker file to delete from the list.
         */
        public RemoveFavoriteSticker(InputFile sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1152945264;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a file from the file download list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveFileFromDownloads extends Function<Ok> {
        /**
         * Identifier of the downloaded file.
         */
        public int fileId;
        /**
         * Pass true to delete the file from the TDLib file cache.
         */
        public boolean deleteFromCache;

        /**
         * Default constructor for a function, which removes a file from the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveFileFromDownloads() {
        }

        /**
         * Creates a function, which removes a file from the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the downloaded file.
         * @param deleteFromCache Pass true to delete the file from the TDLib file cache.
         */
        public RemoveFileFromDownloads(int fileId, boolean deleteFromCache) {
            this.fileId = fileId;
            this.deleteFromCache = deleteFromCache;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1460060142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes background from the list of installed backgrounds.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveInstalledBackground extends Function<Ok> {
        /**
         * The background identifier.
         */
        public long backgroundId;

        /**
         * Default constructor for a function, which removes background from the list of installed backgrounds.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveInstalledBackground() {
        }

        /**
         * Creates a function, which removes background from the list of installed backgrounds.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param backgroundId The background identifier.
         */
        public RemoveInstalledBackground(long backgroundId) {
            this.backgroundId = backgroundId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1346446652;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a reaction from a message. A chosen reaction can always be removed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveMessageReaction extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Type of the reaction to remove.
         */
        public ReactionType reactionType;

        /**
         * Default constructor for a function, which removes a reaction from a message. A chosen reaction can always be removed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveMessageReaction() {
        }

        /**
         * Creates a function, which removes a reaction from a message. A chosen reaction can always be removed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param reactionType Type of the reaction to remove.
         */
        public RemoveMessageReaction(long chatId, long messageId, ReactionType reactionType) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.reactionType = reactionType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1756934789;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes an active notification from notification list. Needs to be called only if the notification is removed by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveNotification extends Function<Ok> {
        /**
         * Identifier of notification group to which the notification belongs.
         */
        public int notificationGroupId;
        /**
         * Identifier of removed notification.
         */
        public int notificationId;

        /**
         * Default constructor for a function, which removes an active notification from notification list. Needs to be called only if the notification is removed by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveNotification() {
        }

        /**
         * Creates a function, which removes an active notification from notification list. Needs to be called only if the notification is removed by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param notificationGroupId Identifier of notification group to which the notification belongs.
         * @param notificationId Identifier of removed notification.
         */
        public RemoveNotification(int notificationGroupId, int notificationId) {
            this.notificationGroupId = notificationGroupId;
            this.notificationId = notificationId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 862630734;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a group of active notifications. Needs to be called only if the notification group is removed by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveNotificationGroup extends Function<Ok> {
        /**
         * Notification group identifier.
         */
        public int notificationGroupId;
        /**
         * The maximum identifier of removed notifications.
         */
        public int maxNotificationId;

        /**
         * Default constructor for a function, which removes a group of active notifications. Needs to be called only if the notification group is removed by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveNotificationGroup() {
        }

        /**
         * Creates a function, which removes a group of active notifications. Needs to be called only if the notification group is removed by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param notificationGroupId Notification group identifier.
         * @param maxNotificationId The maximum identifier of removed notifications.
         */
        public RemoveNotificationGroup(int notificationGroupId, int maxNotificationId) {
            this.notificationGroupId = notificationGroupId;
            this.maxNotificationId = maxNotificationId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1713005454;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a proxy server. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveProxy extends Function<Ok> {
        /**
         * Proxy identifier.
         */
        public int proxyId;

        /**
         * Default constructor for a function, which removes a proxy server. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveProxy() {
        }

        /**
         * Creates a function, which removes a proxy server. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param proxyId Proxy identifier.
         */
        public RemoveProxy(int proxyId) {
            this.proxyId = proxyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1369219847;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a hashtag from the list of recently used hashtags.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveRecentHashtag extends Function<Ok> {
        /**
         * Hashtag to delete.
         */
        public String hashtag;

        /**
         * Default constructor for a function, which removes a hashtag from the list of recently used hashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveRecentHashtag() {
        }

        /**
         * Creates a function, which removes a hashtag from the list of recently used hashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param hashtag Hashtag to delete.
         */
        public RemoveRecentHashtag(String hashtag) {
            this.hashtag = hashtag;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1013735260;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a sticker from the list of recently used stickers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveRecentSticker extends Function<Ok> {
        /**
         * Pass true to remove the sticker from the list of stickers recently attached to photo or video files; pass false to remove the sticker from the list of recently sent stickers.
         */
        public boolean isAttached;
        /**
         * Sticker file to delete.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which removes a sticker from the list of recently used stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveRecentSticker() {
        }

        /**
         * Creates a function, which removes a sticker from the list of recently used stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param isAttached Pass true to remove the sticker from the list of stickers recently attached to photo or video files; pass false to remove the sticker from the list of recently sent stickers.
         * @param sticker Sticker file to delete.
         */
        public RemoveRecentSticker(boolean isAttached, InputFile sticker) {
            this.isAttached = isAttached;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1246577677;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a chat from the list of recently found chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveRecentlyFoundChat extends Function<Ok> {
        /**
         * Identifier of the chat to be removed.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes a chat from the list of recently found chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveRecentlyFoundChat() {
        }

        /**
         * Creates a function, which removes a chat from the list of recently found chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to be removed.
         */
        public RemoveRecentlyFoundChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 717340444;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes an animation from the list of saved animations.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveSavedAnimation extends Function<Ok> {
        /**
         * Animation file to be removed.
         */
        public InputFile animation;

        /**
         * Default constructor for a function, which removes an animation from the list of saved animations.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveSavedAnimation() {
        }

        /**
         * Creates a function, which removes an animation from the list of saved animations.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param animation Animation file to be removed.
         */
        public RemoveSavedAnimation(InputFile animation) {
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -495605479;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a notification sound from the list of saved notification sounds.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveSavedNotificationSound extends Function<Ok> {
        /**
         * Identifier of the notification sound.
         */
        public long notificationSoundId;

        /**
         * Default constructor for a function, which removes a notification sound from the list of saved notification sounds.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveSavedNotificationSound() {
        }

        /**
         * Creates a function, which removes a notification sound from the list of saved notification sounds.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param notificationSoundId Identifier of the notification sound.
         */
        public RemoveSavedNotificationSound(long notificationSoundId) {
            this.notificationSoundId = notificationSoundId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -480032946;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a hashtag or a cashtag from the list of recently searched for hashtags or cashtags.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveSearchedForTag extends Function<Ok> {
        /**
         * Hashtag or cashtag to delete.
         */
        public String tag;

        /**
         * Default constructor for a function, which removes a hashtag or a cashtag from the list of recently searched for hashtags or cashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveSearchedForTag() {
        }

        /**
         * Creates a function, which removes a hashtag or a cashtag from the list of recently searched for hashtags or cashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param tag Hashtag or cashtag to delete.
         */
        public RemoveSearchedForTag(String tag) {
            this.tag = tag;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 891382730;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a sticker from the set to which it belongs. The sticker set must be owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveStickerFromSet extends Function<Ok> {
        /**
         * Sticker to remove from the set.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which removes a sticker from the set to which it belongs. The sticker set must be owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveStickerFromSet() {
        }

        /**
         * Creates a function, which removes a sticker from the set to which it belongs. The sticker set must be owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker to remove from the set.
         */
        public RemoveStickerFromSet(InputFile sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1642196644;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveTopChat extends Function<Ok> {
        /**
         * Category of frequently used chats.
         */
        public TopChatCategory category;
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveTopChat() {
        }

        /**
         * Creates a function, which removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param category Category of frequently used chats.
         * @param chatId Chat identifier.
         */
        public RemoveTopChat(TopChatCategory category, long chatId) {
            this.category = category;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1907876267;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of active usernames of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderActiveUsernames extends Function<Ok> {
        /**
         * The new order of active usernames. All currently active usernames must be specified.
         */
        public String[] usernames;

        /**
         * Default constructor for a function, which changes order of active usernames of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderActiveUsernames() {
        }

        /**
         * Creates a function, which changes order of active usernames of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param usernames The new order of active usernames. All currently active usernames must be specified.
         */
        public ReorderActiveUsernames(String[] usernames) {
            this.usernames = usernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -455399375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of active usernames of a bot. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderBotActiveUsernames extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * The new order of active usernames. All currently active usernames must be specified.
         */
        public String[] usernames;

        /**
         * Default constructor for a function, which changes order of active usernames of a bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderBotActiveUsernames() {
        }

        /**
         * Creates a function, which changes order of active usernames of a bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param usernames The new order of active usernames. All currently active usernames must be specified.
         */
        public ReorderBotActiveUsernames(long botUserId, String[] usernames) {
            this.botUserId = botUserId;
            this.usernames = usernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1602301664;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of chat folders.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderChatFolders extends Function<Ok> {
        /**
         * Identifiers of chat folders in the new correct order.
         */
        public int[] chatFolderIds;
        /**
         * Position of the main chat list among chat folders, 0-based. Can be non-zero only for Premium users.
         */
        public int mainChatListPosition;

        /**
         * Default constructor for a function, which changes the order of chat folders.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderChatFolders() {
        }

        /**
         * Creates a function, which changes the order of chat folders.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatFolderIds Identifiers of chat folders in the new correct order.
         * @param mainChatListPosition Position of the main chat list among chat folders, 0-based. Can be non-zero only for Premium users.
         */
        public ReorderChatFolders(int[] chatFolderIds, int mainChatListPosition) {
            this.chatFolderIds = chatFolderIds;
            this.mainChatListPosition = mainChatListPosition;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1665299546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of installed sticker sets.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderInstalledStickerSets extends Function<Ok> {
        /**
         * Type of the sticker sets to reorder.
         */
        public StickerType stickerType;
        /**
         * Identifiers of installed sticker sets in the new correct order.
         */
        public long[] stickerSetIds;

        /**
         * Default constructor for a function, which changes the order of installed sticker sets.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderInstalledStickerSets() {
        }

        /**
         * Creates a function, which changes the order of installed sticker sets.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param stickerType Type of the sticker sets to reorder.
         * @param stickerSetIds Identifiers of installed sticker sets in the new correct order.
         */
        public ReorderInstalledStickerSets(StickerType stickerType, long[] stickerSetIds) {
            this.stickerType = stickerType;
            this.stickerSetIds = stickerSetIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1074928158;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of quick reply shortcuts.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderQuickReplyShortcuts extends Function<Ok> {
        /**
         * The new order of quick reply shortcuts.
         */
        public int[] shortcutIds;

        /**
         * Default constructor for a function, which changes the order of quick reply shortcuts.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderQuickReplyShortcuts() {
        }

        /**
         * Creates a function, which changes the order of quick reply shortcuts.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutIds The new order of quick reply shortcuts.
         */
        public ReorderQuickReplyShortcuts(int[] shortcutIds) {
            this.shortcutIds = shortcutIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2052799232;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of active usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderSupergroupActiveUsernames extends Function<Ok> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * The new order of active usernames. All currently active usernames must be specified.
         */
        public String[] usernames;

        /**
         * Default constructor for a function, which changes order of active usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderSupergroupActiveUsernames() {
        }

        /**
         * Creates a function, which changes order of active usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param usernames The new order of active usernames. All currently active usernames must be specified.
         */
        public ReorderSupergroupActiveUsernames(long supergroupId, String[] usernames) {
            this.supergroupId = supergroupId;
            this.usernames = usernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1962466095;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces current primary invite link for a chat with a new primary invite link. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class ReplacePrimaryChatInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which replaces current primary invite link for a chat with a new primary invite link. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public ReplacePrimaryChatInviteLink() {
        }

        /**
         * Creates a function, which replaces current primary invite link for a chat with a new primary invite link. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReplacePrimaryChatInviteLink(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1067350941;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces existing sticker in a set. The function is equivalent to removeStickerFromSet, then addStickerToSet, then setStickerPositionInSet.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReplaceStickerInSet extends Function<Ok> {
        /**
         * Sticker set owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;
        /**
         * Sticker to remove from the set.
         */
        public InputFile oldSticker;
        /**
         * Sticker to add to the set.
         */
        public InputSticker newSticker;

        /**
         * Default constructor for a function, which replaces existing sticker in a set. The function is equivalent to removeStickerFromSet, then addStickerToSet, then setStickerPositionInSet.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReplaceStickerInSet() {
        }

        /**
         * Creates a function, which replaces existing sticker in a set. The function is equivalent to removeStickerFromSet, then addStickerToSet, then setStickerPositionInSet.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Sticker set owner; ignored for regular users.
         * @param name Sticker set name. The sticker set must be owned by the current user.
         * @param oldSticker Sticker to remove from the set.
         * @param newSticker Sticker to add to the set.
         */
        public ReplaceStickerInSet(long userId, String name, InputFile oldSticker, InputSticker newSticker) {
            this.userId = userId;
            this.name = name;
            this.oldSticker = oldSticker;
            this.newSticker = newSticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -406311399;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces the current RTMP URL for streaming to the chat; requires owner privileges.
     *
     * <p> Returns {@link RtmpUrl RtmpUrl} </p>
     */
    public static class ReplaceVideoChatRtmpUrl extends Function<RtmpUrl> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which replaces the current RTMP URL for streaming to the chat; requires owner privileges.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         */
        public ReplaceVideoChatRtmpUrl() {
        }

        /**
         * Creates a function, which replaces the current RTMP URL for streaming to the chat; requires owner privileges.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReplaceVideoChatRtmpUrl(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 558862304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports that authentication code wasn't delivered via SMS; for official mobile applications only. Works only when the current authorization state is authorizationStateWaitCode.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportAuthenticationCodeMissing extends Function<Ok> {
        /**
         * Current mobile network code.
         */
        public String mobileNetworkCode;

        /**
         * Default constructor for a function, which reports that authentication code wasn't delivered via SMS; for official mobile applications only. Works only when the current authorization state is authorizationStateWaitCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportAuthenticationCodeMissing() {
        }

        /**
         * Creates a function, which reports that authentication code wasn't delivered via SMS; for official mobile applications only. Works only when the current authorization state is authorizationStateWaitCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param mobileNetworkCode Current mobile network code.
         */
        public ReportAuthenticationCodeMissing(String mobileNetworkCode) {
            this.mobileNetworkCode = mobileNetworkCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1846555064;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a chat to the Telegram moderators. A chat can be reported only from the chat action bar, or if chat.canBeReported.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifiers of reported messages; may be empty to report the whole chat.
         */
        public long[] messageIds;
        /**
         * The reason for reporting the chat.
         */
        public ReportReason reason;
        /**
         * Additional report details; 0-1024 characters.
         */
        public String text;

        /**
         * Default constructor for a function, which reports a chat to the Telegram moderators. A chat can be reported only from the chat action bar, or if chat.canBeReported.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportChat() {
        }

        /**
         * Creates a function, which reports a chat to the Telegram moderators. A chat can be reported only from the chat action bar, or if chat.canBeReported.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageIds Identifiers of reported messages; may be empty to report the whole chat.
         * @param reason The reason for reporting the chat.
         * @param text Additional report details; 0-1024 characters.
         */
        public ReportChat(long chatId, long[] messageIds, ReportReason reason, String text) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.reason = reason;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1071617544;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a chat photo to the Telegram moderators. A chat photo can be reported only if chat.canBeReported.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportChatPhoto extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the photo to report. Only full photos from chatPhoto can be reported.
         */
        public int fileId;
        /**
         * The reason for reporting the chat photo.
         */
        public ReportReason reason;
        /**
         * Additional report details; 0-1024 characters.
         */
        public String text;

        /**
         * Default constructor for a function, which reports a chat photo to the Telegram moderators. A chat photo can be reported only if chat.canBeReported.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportChatPhoto() {
        }

        /**
         * Creates a function, which reports a chat photo to the Telegram moderators. A chat photo can be reported only if chat.canBeReported.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param fileId Identifier of the photo to report. Only full photos from chatPhoto can be reported.
         * @param reason The reason for reporting the chat photo.
         * @param text Additional report details; 0-1024 characters.
         */
        public ReportChatPhoto(long chatId, int fileId, ReportReason reason, String text) {
            this.chatId = chatId;
            this.fileId = fileId;
            this.reason = reason;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -646966648;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a sponsored message to Telegram moderators.
     *
     * <p> Returns {@link ReportChatSponsoredMessageResult ReportChatSponsoredMessageResult} </p>
     */
    public static class ReportChatSponsoredMessage extends Function<ReportChatSponsoredMessageResult> {
        /**
         * Chat identifier of the sponsored message.
         */
        public long chatId;
        /**
         * Identifier of the sponsored message.
         */
        public long messageId;
        /**
         * Option identifier chosen by the user; leave empty for the initial request.
         */
        public byte[] optionId;

        /**
         * Default constructor for a function, which reports a sponsored message to Telegram moderators.
         *
         * <p> Returns {@link ReportChatSponsoredMessageResult ReportChatSponsoredMessageResult} </p>
         */
        public ReportChatSponsoredMessage() {
        }

        /**
         * Creates a function, which reports a sponsored message to Telegram moderators.
         *
         * <p> Returns {@link ReportChatSponsoredMessageResult ReportChatSponsoredMessageResult} </p>
         *
         * @param chatId Chat identifier of the sponsored message.
         * @param messageId Identifier of the sponsored message.
         * @param optionId Option identifier chosen by the user; leave empty for the initial request.
         */
        public ReportChatSponsoredMessage(long chatId, long messageId, byte[] optionId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.optionId = optionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -868330562;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports reactions set on a message to the Telegram moderators. Reactions on a message can be reported only if message.canReportReactions.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportMessageReactions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Identifier of the sender, which added the reaction.
         */
        public MessageSender senderId;

        /**
         * Default constructor for a function, which reports reactions set on a message to the Telegram moderators. Reactions on a message can be reported only if message.canReportReactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportMessageReactions() {
        }

        /**
         * Creates a function, which reports reactions set on a message to the Telegram moderators. Reactions on a message can be reported only if message.canReportReactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param senderId Identifier of the sender, which added the reaction.
         */
        public ReportMessageReactions(long chatId, long messageId, MessageSender senderId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.senderId = senderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 919111719;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports that authentication code wasn't delivered via SMS to the specified phone number; for official mobile applications only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportPhoneNumberCodeMissing extends Function<Ok> {
        /**
         * Current mobile network code.
         */
        public String mobileNetworkCode;

        /**
         * Default constructor for a function, which reports that authentication code wasn't delivered via SMS to the specified phone number; for official mobile applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportPhoneNumberCodeMissing() {
        }

        /**
         * Creates a function, which reports that authentication code wasn't delivered via SMS to the specified phone number; for official mobile applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param mobileNetworkCode Current mobile network code.
         */
        public ReportPhoneNumberCodeMissing(String mobileNetworkCode) {
            this.mobileNetworkCode = mobileNetworkCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -895175341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a story to the Telegram moderators.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportStory extends Function<Ok> {
        /**
         * The identifier of the sender of the story to report.
         */
        public long storySenderChatId;
        /**
         * The identifier of the story to report.
         */
        public int storyId;
        /**
         * The reason for reporting the story.
         */
        public ReportReason reason;
        /**
         * Additional report details; 0-1024 characters.
         */
        public String text;

        /**
         * Default constructor for a function, which reports a story to the Telegram moderators.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportStory() {
        }

        /**
         * Creates a function, which reports a story to the Telegram moderators.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storySenderChatId The identifier of the sender of the story to report.
         * @param storyId The identifier of the story to report.
         * @param reason The reason for reporting the story.
         * @param text Additional report details; 0-1024 characters.
         */
        public ReportStory(long storySenderChatId, int storyId, ReportReason reason, String text) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
            this.reason = reason;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1688244069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a false deletion of a message by aggressive anti-spam checks; requires administrator rights in the supergroup. Can be called only for messages from chatEventMessageDeleted with canReportAntiSpamFalsePositive == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportSupergroupAntiSpamFalsePositive extends Function<Ok> {
        /**
         * Supergroup identifier.
         */
        public long supergroupId;
        /**
         * Identifier of the erroneously deleted message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which reports a false deletion of a message by aggressive anti-spam checks; requires administrator rights in the supergroup. Can be called only for messages from chatEventMessageDeleted with canReportAntiSpamFalsePositive == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportSupergroupAntiSpamFalsePositive() {
        }

        /**
         * Creates a function, which reports a false deletion of a message by aggressive anti-spam checks; requires administrator rights in the supergroup. Can be called only for messages from chatEventMessageDeleted with canReportAntiSpamFalsePositive == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Supergroup identifier.
         * @param messageId Identifier of the erroneously deleted message.
         */
        public ReportSupergroupAntiSpamFalsePositive(long supergroupId, long messageId) {
            this.supergroupId = supergroupId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -516050872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports messages in a supergroup as spam; requires administrator rights in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportSupergroupSpam extends Function<Ok> {
        /**
         * Supergroup identifier.
         */
        public long supergroupId;
        /**
         * Identifiers of messages to report.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which reports messages in a supergroup as spam; requires administrator rights in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportSupergroupSpam() {
        }

        /**
         * Creates a function, which reports messages in a supergroup as spam; requires administrator rights in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Supergroup identifier.
         * @param messageIds Identifiers of messages to report.
         */
        public ReportSupergroupSpam(long supergroupId, long[] messageIds) {
            this.supergroupId = supergroupId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -94825000;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Requests to send a 2-step verification password recovery code to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RequestAuthenticationPasswordRecovery extends Function<Ok> {

        /**
         * Default constructor for a function, which requests to send a 2-step verification password recovery code to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RequestAuthenticationPasswordRecovery() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1393896118;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Requests to send a 2-step verification password recovery code to an email address that was previously set up.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class RequestPasswordRecovery extends Function<EmailAddressAuthenticationCodeInfo> {

        /**
         * Default constructor for a function, which requests to send a 2-step verification password recovery code to an email address that was previously set up.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public RequestPasswordRecovery() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -13777582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Requests QR code authentication by scanning a QR code on another logged in device. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RequestQrCodeAuthentication extends Function<Ok> {
        /**
         * List of user identifiers of other users currently using the application.
         */
        public long[] otherUserIds;

        /**
         * Default constructor for a function, which requests QR code authentication by scanning a QR code on another logged in device. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RequestQrCodeAuthentication() {
        }

        /**
         * Creates a function, which requests QR code authentication by scanning a QR code on another logged in device. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param otherUserIds List of user identifiers of other users currently using the application.
         */
        public RequestQrCodeAuthentication(long[] otherUserIds) {
            this.otherUserIds = otherUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1363496527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode, the nextCodeType of the result is not null and the server-specified timeout has passed, or when the current authorization state is authorizationStateWaitEmailCode.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResendAuthenticationCode extends Function<Ok> {
        /**
         * Reason of code resending; pass null if unknown.
         */
        public ResendCodeReason reason;

        /**
         * Default constructor for a function, which resends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode, the nextCodeType of the result is not null and the server-specified timeout has passed, or when the current authorization state is authorizationStateWaitEmailCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResendAuthenticationCode() {
        }

        /**
         * Creates a function, which resends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode, the nextCodeType of the result is not null and the server-specified timeout has passed, or when the current authorization state is authorizationStateWaitEmailCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param reason Reason of code resending; pass null if unknown.
         */
        public ResendAuthenticationCode(ResendCodeReason reason) {
            this.reason = reason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1506755656;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends the code to verify an email address to be added to a user's Telegram Passport.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class ResendEmailAddressVerificationCode extends Function<EmailAddressAuthenticationCodeInfo> {

        /**
         * Default constructor for a function, which resends the code to verify an email address to be added to a user's Telegram Passport.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public ResendEmailAddressVerificationCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1872416732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends the login email address verification code.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class ResendLoginEmailAddressCode extends Function<EmailAddressAuthenticationCodeInfo> {

        /**
         * Default constructor for a function, which resends the login email address verification code.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public ResendLoginEmailAddressCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 292966933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends messages which failed to send. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is re-sent, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be re-sent, null will be returned instead of the message.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class ResendMessages extends Function<Messages> {
        /**
         * Identifier of the chat to send messages.
         */
        public long chatId;
        /**
         * Identifiers of the messages to resend. Message identifiers must be in a strictly increasing order.
         */
        public long[] messageIds;
        /**
         * New manually chosen quote from the message to be replied; pass null if none. Ignored if more than one message is re-sent, or if messageSendingStateFailed.needAnotherReplyQuote == false.
         */
        public InputTextQuote quote;

        /**
         * Default constructor for a function, which resends messages which failed to send. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is re-sent, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be re-sent, null will be returned instead of the message.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public ResendMessages() {
        }

        /**
         * Creates a function, which resends messages which failed to send. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is re-sent, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be re-sent, null will be returned instead of the message.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Identifier of the chat to send messages.
         * @param messageIds Identifiers of the messages to resend. Message identifiers must be in a strictly increasing order.
         * @param quote New manually chosen quote from the message to be replied; pass null if none. Ignored if more than one message is re-sent, or if messageSendingStateFailed.needAnotherReplyQuote == false.
         */
        public ResendMessages(long chatId, long[] messageIds, InputTextQuote quote) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.quote = quote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2010327226;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends the authentication code sent to a phone number. Works only if the previously received authenticationCodeInfo nextCodeType was not null and the server-specified timeout has passed.
     *
     * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
     */
    public static class ResendPhoneNumberCode extends Function<AuthenticationCodeInfo> {
        /**
         * Reason of code resending; pass null if unknown.
         */
        public ResendCodeReason reason;

        /**
         * Default constructor for a function, which resends the authentication code sent to a phone number. Works only if the previously received authenticationCodeInfo nextCodeType was not null and the server-specified timeout has passed.
         *
         * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
         */
        public ResendPhoneNumberCode() {
        }

        /**
         * Creates a function, which resends the authentication code sent to a phone number. Works only if the previously received authenticationCodeInfo nextCodeType was not null and the server-specified timeout has passed.
         *
         * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
         *
         * @param reason Reason of code resending; pass null if unknown.
         */
        public ResendPhoneNumberCode(ResendCodeReason reason) {
            this.reason = reason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1808704551;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends the 2-step verification recovery email address verification code.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class ResendRecoveryEmailAddressCode extends Function<PasswordState> {

        /**
         * Default constructor for a function, which resends the 2-step verification recovery email address verification code.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public ResendRecoveryEmailAddressCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 433483548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resets all chat and scope notification settings to their default values. By default, all chats are unmuted and message previews are shown.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResetAllNotificationSettings extends Function<Ok> {

        /**
         * Default constructor for a function, which resets all chat and scope notification settings to their default values. By default, all chats are unmuted and message previews are shown.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResetAllNotificationSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -174020359;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resets the login email address. May return an error with a message &quot;TASK_ALREADY_EXISTS&quot; if reset is still pending. Works only when the current authorization state is authorizationStateWaitEmailCode and authorizationState.canResetEmailAddress == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResetAuthenticationEmailAddress extends Function<Ok> {

        /**
         * Default constructor for a function, which resets the login email address. May return an error with a message &quot;TASK_ALREADY_EXISTS&quot; if reset is still pending. Works only when the current authorization state is authorizationStateWaitEmailCode and authorizationState.canResetEmailAddress == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResetAuthenticationEmailAddress() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -415075796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resets list of installed backgrounds to its default value.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResetInstalledBackgrounds extends Function<Ok> {

        /**
         * Default constructor for a function, which resets list of installed backgrounds to its default value.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResetInstalledBackgrounds() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1884553559;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resets all network data usage statistics to zero. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResetNetworkStatistics extends Function<Ok> {

        /**
         * Default constructor for a function, which resets all network data usage statistics to zero. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResetNetworkStatistics() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1646452102;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes 2-step verification password without previous password and access to recovery email address. The password can't be reset immediately and the request needs to be repeated after the specified time.
     *
     * <p> Returns {@link ResetPasswordResult ResetPasswordResult} </p>
     */
    public static class ResetPassword extends Function<ResetPasswordResult> {

        /**
         * Default constructor for a function, which removes 2-step verification password without previous password and access to recovery email address. The password can't be reset immediately and the request needs to be repeated after the specified time.
         *
         * <p> Returns {@link ResetPasswordResult ResetPasswordResult} </p>
         */
        public ResetPassword() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -593589091;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Revokes invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links. If a primary link is revoked, then additionally to the revoked link returns new primary link.
     *
     * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
     */
    public static class RevokeChatInviteLink extends Function<ChatInviteLinks> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to be revoked.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which revokes invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links. If a primary link is revoked, then additionally to the revoked link returns new primary link.
         *
         * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
         */
        public RevokeChatInviteLink() {
        }

        /**
         * Creates a function, which revokes invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links. If a primary link is revoked, then additionally to the revoked link returns new primary link.
         *
         * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to be revoked.
         */
        public RevokeChatInviteLink(long chatId, String inviteLink) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -776514135;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Revokes invite link for a group call. Requires groupCall.canBeManaged group call flag.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RevokeGroupCallInviteLink extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which revokes invite link for a group call. Requires groupCall.canBeManaged group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RevokeGroupCallInviteLink() {
        }

        /**
         * Creates a function, which revokes invite link for a group call. Requires groupCall.canBeManaged group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public RevokeGroupCallInviteLink(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 501589140;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Saves application log event on the server. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SaveApplicationLogEvent extends Function<Ok> {
        /**
         * Event type.
         */
        public String type;
        /**
         * Optional chat identifier, associated with the event.
         */
        public long chatId;
        /**
         * The log event data.
         */
        public JsonValue data;

        /**
         * Default constructor for a function, which saves application log event on the server. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SaveApplicationLogEvent() {
        }

        /**
         * Creates a function, which saves application log event on the server. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param type Event type.
         * @param chatId Optional chat identifier, associated with the event.
         * @param data The log event data.
         */
        public SaveApplicationLogEvent(String type, long chatId, JsonValue data) {
            this.type = type;
            this.chatId = chatId;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -811154930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for a background by its name.
     *
     * <p> Returns {@link Background Background} </p>
     */
    public static class SearchBackground extends Function<Background> {
        /**
         * The name of the background.
         */
        public String name;

        /**
         * Default constructor for a function, which searches for a background by its name.
         *
         * <p> Returns {@link Background Background} </p>
         */
        public SearchBackground() {
        }

        /**
         * Creates a function, which searches for a background by its name.
         *
         * <p> Returns {@link Background Background} </p>
         *
         * @param name The name of the background.
         */
        public SearchBackground(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2130996959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for call messages. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchCallMessages extends Function<FoundMessages> {
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Pass true to search only for messages with missed/declined calls.
         */
        public boolean onlyMissed;

        /**
         * Default constructor for a function, which searches for call messages. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchCallMessages() {
        }

        /**
         * Creates a function, which searches for call messages. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param onlyMissed Pass true to search only for messages with missed/declined calls.
         */
        public SearchCallMessages(String offset, int limit, boolean onlyMissed) {
            this.offset = offset;
            this.limit = limit;
            this.onlyMissed = onlyMissed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1942229221;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for a specified query in the first name, last name and usernames of the members of a specified chat. Requires administrator rights if the chat is a channel.
     *
     * <p> Returns {@link ChatMembers ChatMembers} </p>
     */
    public static class SearchChatMembers extends Function<ChatMembers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of users to be returned; up to 200.
         */
        public int limit;
        /**
         * The type of users to search for; pass null to search among all chat members.
         */
        public ChatMembersFilter filter;

        /**
         * Default constructor for a function, which searches for a specified query in the first name, last name and usernames of the members of a specified chat. Requires administrator rights if the chat is a channel.
         *
         * <p> Returns {@link ChatMembers ChatMembers} </p>
         */
        public SearchChatMembers() {
        }

        /**
         * Creates a function, which searches for a specified query in the first name, last name and usernames of the members of a specified chat. Requires administrator rights if the chat is a channel.
         *
         * <p> Returns {@link ChatMembers ChatMembers} </p>
         *
         * @param chatId Chat identifier.
         * @param query Query to search for.
         * @param limit The maximum number of users to be returned; up to 200.
         * @param filter The type of users to search for; pass null to search among all chat members.
         */
        public SearchChatMembers(long chatId, String query, int limit, ChatMembersFilter filter) {
            this.chatId = chatId;
            this.query = query;
            this.limit = limit;
            this.filter = filter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -445823291;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. Cannot be used in secret chats with a non-empty query (searchSecretMessages must be used instead), or without an enabled message database. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit. A combination of query, senderId, filter and messageThreadId search criteria is expected to be supported, only if it is required for Telegram official application implementation.
     *
     * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
     */
    public static class SearchChatMessages extends Function<FoundChatMessages> {
        /**
         * Identifier of the chat in which to search messages.
         */
        public long chatId;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * Identifier of the sender of messages to search for; pass null to search for messages from any sender. Not supported in secret chats.
         */
        public MessageSender senderId;
        /**
         * Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative offset to get the specified message and some newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Additional filter for messages to search; pass null to search for all messages.
         */
        public SearchMessagesFilter filter;
        /**
         * If not 0, only messages in the specified thread will be returned; supergroups only.
         */
        public long messageThreadId;
        /**
         * If not 0, only messages in the specified Saved Messages topic will be returned; pass 0 to return all messages, or for chats other than Saved Messages.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. Cannot be used in secret chats with a non-empty query (searchSecretMessages must be used instead), or without an enabled message database. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit. A combination of query, senderId, filter and messageThreadId search criteria is expected to be supported, only if it is required for Telegram official application implementation.
         *
         * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
         */
        public SearchChatMessages() {
        }

        /**
         * Creates a function, which searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. Cannot be used in secret chats with a non-empty query (searchSecretMessages must be used instead), or without an enabled message database. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit. A combination of query, senderId, filter and messageThreadId search criteria is expected to be supported, only if it is required for Telegram official application implementation.
         *
         * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
         *
         * @param chatId Identifier of the chat in which to search messages.
         * @param query Query to search for.
         * @param senderId Identifier of the sender of messages to search for; pass null to search for messages from any sender. Not supported in secret chats.
         * @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative offset to get the specified message and some newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param filter Additional filter for messages to search; pass null to search for all messages.
         * @param messageThreadId If not 0, only messages in the specified thread will be returned; supergroups only.
         * @param savedMessagesTopicId If not 0, only messages in the specified Saved Messages topic will be returned; pass 0 to return all messages, or for chats other than Saved Messages.
         */
        public SearchChatMessages(long chatId, String query, MessageSender senderId, long fromMessageId, int offset, int limit, SearchMessagesFilter filter, long messageThreadId, long savedMessagesTopicId) {
            this.chatId = chatId;
            this.query = query;
            this.senderId = senderId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
            this.filter = filter;
            this.messageThreadId = messageThreadId;
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -539052602;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class SearchChatRecentLocationMessages extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The maximum number of messages to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public SearchChatRecentLocationMessages() {
        }

        /**
         * Creates a function, which returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         * @param limit The maximum number of messages to be returned.
         */
        public SearchChatRecentLocationMessages(long chatId, int limit) {
            this.chatId = chatId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 950238950;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for the specified query in the title and username of already known chats; this is an offline request. Returns chats in the order seen in the main chat list.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class SearchChats extends Function<Chats> {
        /**
         * Query to search for. If the query is empty, returns up to 50 recently found chats.
         */
        public String query;
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for the specified query in the title and username of already known chats; this is an offline request. Returns chats in the order seen in the main chat list.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public SearchChats() {
        }

        /**
         * Creates a function, which searches for the specified query in the title and username of already known chats; this is an offline request. Returns chats in the order seen in the main chat list.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param query Query to search for. If the query is empty, returns up to 50 recently found chats.
         * @param limit The maximum number of chats to be returned.
         */
        public SearchChats(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1879787060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of users and location-based supergroups nearby. The list of users nearby will be updated for 60 seconds after the request by the updates updateUsersNearby. The request must be sent again every 25 seconds with adjusted location to not miss new chats.
     *
     * <p> Returns {@link ChatsNearby ChatsNearby} </p>
     */
    public static class SearchChatsNearby extends Function<ChatsNearby> {
        /**
         * Current user location.
         */
        public Location location;

        /**
         * Default constructor for a function, which returns a list of users and location-based supergroups nearby. The list of users nearby will be updated for 60 seconds after the request by the updates updateUsersNearby. The request must be sent again every 25 seconds with adjusted location to not miss new chats.
         *
         * <p> Returns {@link ChatsNearby ChatsNearby} </p>
         */
        public SearchChatsNearby() {
        }

        /**
         * Creates a function, which returns a list of users and location-based supergroups nearby. The list of users nearby will be updated for 60 seconds after the request by the updates updateUsersNearby. The request must be sent again every 25 seconds with adjusted location to not miss new chats.
         *
         * <p> Returns {@link ChatsNearby ChatsNearby} </p>
         *
         * @param location Current user location.
         */
        public SearchChatsNearby(Location location) {
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -196753377;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the main chat list.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class SearchChatsOnServer extends Function<Chats> {
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the main chat list.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public SearchChatsOnServer() {
        }

        /**
         * Creates a function, which searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the main chat list.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param query Query to search for.
         * @param limit The maximum number of chats to be returned.
         */
        public SearchChatsOnServer(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1158402188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for the specified query in the first names, last names and usernames of the known user contacts.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class SearchContacts extends Function<Users> {
        /**
         * Query to search for; may be empty to return all contacts.
         */
        public String query;
        /**
         * The maximum number of users to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for the specified query in the first names, last names and usernames of the known user contacts.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public SearchContacts() {
        }

        /**
         * Creates a function, which searches for the specified query in the first names, last names and usernames of the known user contacts.
         *
         * <p> Returns {@link Users Users} </p>
         *
         * @param query Query to search for; may be empty to return all contacts.
         * @param limit The maximum number of users to be returned.
         */
        public SearchContacts(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1794690715;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for emojis by keywords. Supported only if the file database is enabled. Order of results is unspecified.
     *
     * <p> Returns {@link EmojiKeywords EmojiKeywords} </p>
     */
    public static class SearchEmojis extends Function<EmojiKeywords> {
        /**
         * Text to search for.
         */
        public String text;
        /**
         * List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public String[] inputLanguageCodes;

        /**
         * Default constructor for a function, which searches for emojis by keywords. Supported only if the file database is enabled. Order of results is unspecified.
         *
         * <p> Returns {@link EmojiKeywords EmojiKeywords} </p>
         */
        public SearchEmojis() {
        }

        /**
         * Creates a function, which searches for emojis by keywords. Supported only if the file database is enabled. Order of results is unspecified.
         *
         * <p> Returns {@link EmojiKeywords EmojiKeywords} </p>
         *
         * @param text Text to search for.
         * @param inputLanguageCodes List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public SearchEmojis(String text, String[] inputLanguageCodes) {
            this.text = text;
            this.inputLanguageCodes = inputLanguageCodes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1456187668;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for files in the file download list or recently downloaded files from the list.
     *
     * <p> Returns {@link FoundFileDownloads FoundFileDownloads} </p>
     */
    public static class SearchFileDownloads extends Function<FoundFileDownloads> {
        /**
         * Query to search for; may be empty to return all downloaded files.
         */
        public String query;
        /**
         * Pass true to search only for active downloads, including paused.
         */
        public boolean onlyActive;
        /**
         * Pass true to search only for completed downloads.
         */
        public boolean onlyCompleted;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of files to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for files in the file download list or recently downloaded files from the list.
         *
         * <p> Returns {@link FoundFileDownloads FoundFileDownloads} </p>
         */
        public SearchFileDownloads() {
        }

        /**
         * Creates a function, which searches for files in the file download list or recently downloaded files from the list.
         *
         * <p> Returns {@link FoundFileDownloads FoundFileDownloads} </p>
         *
         * @param query Query to search for; may be empty to return all downloaded files.
         * @param onlyActive Pass true to search only for active downloads, including paused.
         * @param onlyCompleted Pass true to search only for completed downloads.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of files to be returned.
         */
        public SearchFileDownloads(String query, boolean onlyActive, boolean onlyCompleted, String offset, int limit) {
            this.query = query;
            this.onlyActive = onlyActive;
            this.onlyCompleted = onlyCompleted;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 706611286;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for recently used hashtags by their prefix.
     *
     * <p> Returns {@link Hashtags Hashtags} </p>
     */
    public static class SearchHashtags extends Function<Hashtags> {
        /**
         * Hashtag prefix to search for.
         */
        public String prefix;
        /**
         * The maximum number of hashtags to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for recently used hashtags by their prefix.
         *
         * <p> Returns {@link Hashtags Hashtags} </p>
         */
        public SearchHashtags() {
        }

        /**
         * Creates a function, which searches for recently used hashtags by their prefix.
         *
         * <p> Returns {@link Hashtags Hashtags} </p>
         *
         * @param prefix Hashtag prefix to search for.
         * @param limit The maximum number of hashtags to be returned.
         */
        public SearchHashtags(String prefix, int limit) {
            this.prefix = prefix;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1043637617;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for installed sticker sets by looking for specified query in their title and name.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class SearchInstalledStickerSets extends Function<StickerSets> {
        /**
         * Type of the sticker sets to search for.
         */
        public StickerType stickerType;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of sticker sets to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for installed sticker sets by looking for specified query in their title and name.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public SearchInstalledStickerSets() {
        }

        /**
         * Creates a function, which searches for installed sticker sets by looking for specified query in their title and name.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to search for.
         * @param query Query to search for.
         * @param limit The maximum number of sticker sets to return.
         */
        public SearchInstalledStickerSets(StickerType stickerType, String query, int limit) {
            this.stickerType = stickerType;
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2120122276;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chatId, messageId)). For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchMessages extends Function<FoundMessages> {
        /**
         * Chat list in which to search messages; pass null to search in all chats regardless of their chat list. Only Main and Archive chat lists are supported.
         */
        public ChatList chatList;
        /**
         * Pass true to search only for messages in channels.
         */
        public boolean onlyInChannels;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Additional filter for messages to search; pass null to search for all messages. Filters searchMessagesFilterMention, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, searchMessagesFilterFailedToSend, and searchMessagesFilterPinned are unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * If not 0, the minimum date of the messages to return.
         */
        public int minDate;
        /**
         * If not 0, the maximum date of the messages to return.
         */
        public int maxDate;

        /**
         * Default constructor for a function, which searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chatId, messageId)). For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchMessages() {
        }

        /**
         * Creates a function, which searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chatId, messageId)). For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param chatList Chat list in which to search messages; pass null to search in all chats regardless of their chat list. Only Main and Archive chat lists are supported.
         * @param onlyInChannels Pass true to search only for messages in channels.
         * @param query Query to search for.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param filter Additional filter for messages to search; pass null to search for all messages. Filters searchMessagesFilterMention, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, searchMessagesFilterFailedToSend, and searchMessagesFilterPinned are unsupported in this function.
         * @param minDate If not 0, the minimum date of the messages to return.
         * @param maxDate If not 0, the maximum date of the messages to return.
         */
        public SearchMessages(ChatList chatList, boolean onlyInChannels, String query, String offset, int limit, SearchMessagesFilter filter, int minDate, int maxDate) {
            this.chatList = chatList;
            this.onlyInChannels = onlyInChannels;
            this.query = query;
            this.offset = offset;
            this.limit = limit;
            this.filter = filter;
            this.minDate = minDate;
            this.maxDate = maxDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 838452169;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for outgoing messages with content of the type messageDocument in all chats except secret chats. Returns the results in reverse chronological order.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchOutgoingDocumentMessages extends Function<FoundMessages> {
        /**
         * Query to search for in document file name and message caption.
         */
        public String query;
        /**
         * The maximum number of messages to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for outgoing messages with content of the type messageDocument in all chats except secret chats. Returns the results in reverse chronological order.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchOutgoingDocumentMessages() {
        }

        /**
         * Creates a function, which searches for outgoing messages with content of the type messageDocument in all chats except secret chats. Returns the results in reverse chronological order.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param query Query to search for in document file name and message caption.
         * @param limit The maximum number of messages to be returned; up to 100.
         */
        public SearchOutgoingDocumentMessages(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1071397762;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches a public chat by its username. Currently, only private chats, supergroups and channels can be public. Returns the chat if found; otherwise, an error is returned.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class SearchPublicChat extends Function<Chat> {
        /**
         * Username to be resolved.
         */
        public String username;

        /**
         * Default constructor for a function, which searches a public chat by its username. Currently, only private chats, supergroups and channels can be public. Returns the chat if found; otherwise, an error is returned.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public SearchPublicChat() {
        }

        /**
         * Creates a function, which searches a public chat by its username. Currently, only private chats, supergroups and channels can be public. Returns the chat if found; otherwise, an error is returned.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param username Username to be resolved.
         */
        public SearchPublicChat(String username) {
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 857135533;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches public chats by looking for specified query in their username and title. Currently, only private chats, supergroups and channels can be public. Returns a meaningful number of results. Excludes private chats with contacts and chats from the chat list from the results.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class SearchPublicChats extends Function<Chats> {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Default constructor for a function, which searches public chats by looking for specified query in their username and title. Currently, only private chats, supergroups and channels can be public. Returns a meaningful number of results. Excludes private chats with contacts and chats from the chat list from the results.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public SearchPublicChats() {
        }

        /**
         * Creates a function, which searches public chats by looking for specified query in their username and title. Currently, only private chats, supergroups and channels can be public. Returns a meaningful number of results. Excludes private chats with contacts and chats from the chat list from the results.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param query Query to search for.
         */
        public SearchPublicChats(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 970385337;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public channel posts containing the given hashtag or cashtag. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchPublicMessagesByTag extends Function<FoundMessages> {
        /**
         * Hashtag or cashtag to search for.
         */
        public String tag;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for public channel posts containing the given hashtag or cashtag. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchPublicMessagesByTag() {
        }

        /**
         * Creates a function, which searches for public channel posts containing the given hashtag or cashtag. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param tag Hashtag or cashtag to search for.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchPublicMessagesByTag(String tag, String offset, int limit) {
            this.tag = tag;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 630680746;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public stories by the given address location. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundStories FoundStories} </p>
     */
    public static class SearchPublicStoriesByLocation extends Function<FoundStories> {
        /**
         * Address of the location.
         */
        public LocationAddress address;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for public stories by the given address location. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         */
        public SearchPublicStoriesByLocation() {
        }

        /**
         * Creates a function, which searches for public stories by the given address location. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         *
         * @param address Address of the location.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchPublicStoriesByLocation(LocationAddress address, String offset, int limit) {
            this.address = address;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1596709256;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public stories containing the given hashtag or cashtag. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundStories FoundStories} </p>
     */
    public static class SearchPublicStoriesByTag extends Function<FoundStories> {
        /**
         * Hashtag or cashtag to search for.
         */
        public String tag;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for public stories containing the given hashtag or cashtag. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         */
        public SearchPublicStoriesByTag() {
        }

        /**
         * Creates a function, which searches for public stories containing the given hashtag or cashtag. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         *
         * @param tag Hashtag or cashtag to search for.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchPublicStoriesByTag(String tag, String offset, int limit) {
            this.tag = tag;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1437593502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public stories from the given venue. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundStories FoundStories} </p>
     */
    public static class SearchPublicStoriesByVenue extends Function<FoundStories> {
        /**
         * Provider of the venue.
         */
        public String venueProvider;
        /**
         * Identifier of the venue in the provider database.
         */
        public String venueId;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for public stories from the given venue. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         */
        public SearchPublicStoriesByVenue() {
        }

        /**
         * Creates a function, which searches for public stories from the given venue. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         *
         * @param venueProvider Provider of the venue.
         * @param venueId Identifier of the venue in the provider database.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchPublicStoriesByVenue(String venueProvider, String venueId, String offset, int limit) {
            this.venueProvider = venueProvider;
            this.venueId = venueId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -686136790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for a given quote in a text. Returns found quote start position in UTF-16 code units. Returns a 404 error if the quote is not found. Can be called synchronously.
     *
     * <p> Returns {@link FoundPosition FoundPosition} </p>
     */
    public static class SearchQuote extends Function<FoundPosition> {
        /**
         * Text in which to search for the quote.
         */
        public FormattedText text;
        /**
         * Quote to search for.
         */
        public FormattedText quote;
        /**
         * Approximate quote position in UTF-16 code units.
         */
        public int quotePosition;

        /**
         * Default constructor for a function, which searches for a given quote in a text. Returns found quote start position in UTF-16 code units. Returns a 404 error if the quote is not found. Can be called synchronously.
         *
         * <p> Returns {@link FoundPosition FoundPosition} </p>
         */
        public SearchQuote() {
        }

        /**
         * Creates a function, which searches for a given quote in a text. Returns found quote start position in UTF-16 code units. Returns a 404 error if the quote is not found. Can be called synchronously.
         *
         * <p> Returns {@link FoundPosition FoundPosition} </p>
         *
         * @param text Text in which to search for the quote.
         * @param quote Quote to search for.
         * @param quotePosition Approximate quote position in UTF-16 code units.
         */
        public SearchQuote(FormattedText text, FormattedText quote, int quotePosition) {
            this.text = text;
            this.quote = quote;
            this.quotePosition = quotePosition;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1751384351;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for the specified query in the title and username of up to 50 recently found chats; this is an offline request.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class SearchRecentlyFoundChats extends Function<Chats> {
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for the specified query in the title and username of up to 50 recently found chats; this is an offline request.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public SearchRecentlyFoundChats() {
        }

        /**
         * Creates a function, which searches for the specified query in the title and username of up to 50 recently found chats; this is an offline request.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param query Query to search for.
         * @param limit The maximum number of chats to be returned.
         */
        public SearchRecentlyFoundChats(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1647445393;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for messages tagged by the given reaction and with the given words in the Saved Messages chat; for Telegram Premium users only. Returns the results in reverse chronological order, i.e. in order of decreasing messageId For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
     */
    public static class SearchSavedMessages extends Function<FoundChatMessages> {
        /**
         * If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages.
         */
        public long savedMessagesTopicId;
        /**
         * Tag to search for; pass null to return all suitable messages.
         */
        public ReactionType tag;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative offset to get the specified message and some newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for messages tagged by the given reaction and with the given words in the Saved Messages chat; for Telegram Premium users only. Returns the results in reverse chronological order, i.e. in order of decreasing messageId For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
         */
        public SearchSavedMessages() {
        }

        /**
         * Creates a function, which searches for messages tagged by the given reaction and with the given words in the Saved Messages chat; for Telegram Premium users only. Returns the results in reverse chronological order, i.e. in order of decreasing messageId For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
         *
         * @param savedMessagesTopicId If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages.
         * @param tag Tag to search for; pass null to return all suitable messages.
         * @param query Query to search for.
         * @param fromMessageId Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative offset to get the specified message and some newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchSavedMessages(long savedMessagesTopicId, ReactionType tag, String query, long fromMessageId, int offset, int limit) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.tag = tag;
            this.query = query;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1969512554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance, the number of returned messages is chosen by TDLib.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchSecretMessages extends Function<FoundMessages> {
        /**
         * Identifier of the chat in which to search. Specify 0 to search in all secret chats.
         */
        public long chatId;
        /**
         * Query to search for. If empty, searchChatMessages must be used instead.
         */
        public String query;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Additional filter for messages to search; pass null to search for all messages.
         */
        public SearchMessagesFilter filter;

        /**
         * Default constructor for a function, which searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchSecretMessages() {
        }

        /**
         * Creates a function, which searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param chatId Identifier of the chat in which to search. Specify 0 to search in all secret chats.
         * @param query Query to search for. If empty, searchChatMessages must be used instead.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param filter Additional filter for messages to search; pass null to search for all messages.
         */
        public SearchSecretMessages(long chatId, String query, String offset, int limit, SearchMessagesFilter filter) {
            this.chatId = chatId;
            this.query = query;
            this.offset = offset;
            this.limit = limit;
            this.filter = filter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -852865892;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for a sticker set by its name.
     *
     * <p> Returns {@link StickerSet StickerSet} </p>
     */
    public static class SearchStickerSet extends Function<StickerSet> {
        /**
         * Name of the sticker set.
         */
        public String name;

        /**
         * Default constructor for a function, which searches for a sticker set by its name.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         */
        public SearchStickerSet() {
        }

        /**
         * Creates a function, which searches for a sticker set by its name.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         *
         * @param name Name of the sticker set.
         */
        public SearchStickerSet(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1157930222;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class SearchStickerSets extends Function<StickerSets> {
        /**
         * Type of the sticker sets to return.
         */
        public StickerType stickerType;
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Default constructor for a function, which searches for sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public SearchStickerSets() {
        }

        /**
         * Creates a function, which searches for sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to return.
         * @param query Query to search for.
         */
        public SearchStickerSets(StickerType stickerType, String query) {
            this.stickerType = stickerType;
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 262801004;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for stickers from public sticker sets that correspond to any of the given emoji.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class SearchStickers extends Function<Stickers> {
        /**
         * Type of the stickers to return.
         */
        public StickerType stickerType;
        /**
         * Space-separated list of emojis to search for; must be non-empty.
         */
        public String emojis;
        /**
         * The maximum number of stickers to be returned; 0-100.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for stickers from public sticker sets that correspond to any of the given emoji.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public SearchStickers() {
        }

        /**
         * Creates a function, which searches for stickers from public sticker sets that correspond to any of the given emoji.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param stickerType Type of the stickers to return.
         * @param emojis Space-separated list of emojis to search for; must be non-empty.
         * @param limit The maximum number of stickers to be returned; 0-100.
         */
        public SearchStickers(StickerType stickerType, String emojis, int limit) {
            this.stickerType = stickerType;
            this.emojis = emojis;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1709577973;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches specified query by word prefixes in the provided strings. Returns 0-based positions of strings that matched. Can be called synchronously.
     *
     * <p> Returns {@link FoundPositions FoundPositions} </p>
     */
    public static class SearchStringsByPrefix extends Function<FoundPositions> {
        /**
         * The strings to search in for the query.
         */
        public String[] strings;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of objects to return.
         */
        public int limit;
        /**
         * Pass true to receive no results for an empty query.
         */
        public boolean returnNoneForEmptyQuery;

        /**
         * Default constructor for a function, which searches specified query by word prefixes in the provided strings. Returns 0-based positions of strings that matched. Can be called synchronously.
         *
         * <p> Returns {@link FoundPositions FoundPositions} </p>
         */
        public SearchStringsByPrefix() {
        }

        /**
         * Creates a function, which searches specified query by word prefixes in the provided strings. Returns 0-based positions of strings that matched. Can be called synchronously.
         *
         * <p> Returns {@link FoundPositions FoundPositions} </p>
         *
         * @param strings The strings to search in for the query.
         * @param query Query to search for.
         * @param limit The maximum number of objects to return.
         * @param returnNoneForEmptyQuery Pass true to receive no results for an empty query.
         */
        public SearchStringsByPrefix(String[] strings, String query, int limit, boolean returnNoneForEmptyQuery) {
            this.strings = strings;
            this.query = query;
            this.limit = limit;
            this.returnNoneForEmptyQuery = returnNoneForEmptyQuery;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2023251463;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches a user by their phone number. Returns a 404 error if the user can't be found.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class SearchUserByPhoneNumber extends Function<User> {
        /**
         * Phone number to search for.
         */
        public String phoneNumber;
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which searches a user by their phone number. Returns a 404 error if the user can't be found.
         *
         * <p> Returns {@link User User} </p>
         */
        public SearchUserByPhoneNumber() {
        }

        /**
         * Creates a function, which searches a user by their phone number. Returns a 404 error if the user can't be found.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param phoneNumber Phone number to search for.
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public SearchUserByPhoneNumber(String phoneNumber, boolean onlyLocal) {
            this.phoneNumber = phoneNumber;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -343757368;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches a user by a token from the user's link.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class SearchUserByToken extends Function<User> {
        /**
         * Token to search for.
         */
        public String token;

        /**
         * Default constructor for a function, which searches a user by a token from the user's link.
         *
         * <p> Returns {@link User User} </p>
         */
        public SearchUserByToken() {
        }

        /**
         * Creates a function, which searches a user by a token from the user's link.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param token Token to search for.
         */
        public SearchUserByToken(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -666766282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a Web App by its short name. Returns a 404 error if the Web App is not found.
     *
     * <p> Returns {@link FoundWebApp FoundWebApp} </p>
     */
    public static class SearchWebApp extends Function<FoundWebApp> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Short name of the Web App.
         */
        public String webAppShortName;

        /**
         * Default constructor for a function, which returns information about a Web App by its short name. Returns a 404 error if the Web App is not found.
         *
         * <p> Returns {@link FoundWebApp FoundWebApp} </p>
         */
        public SearchWebApp() {
        }

        /**
         * Creates a function, which returns information about a Web App by its short name. Returns a 404 error if the Web App is not found.
         *
         * <p> Returns {@link FoundWebApp FoundWebApp} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param webAppShortName Short name of the Web App.
         */
        public SearchWebApp(long botUserId, String webAppShortName) {
            this.botUserId = botUserId;
            this.webAppShortName = webAppShortName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1241740747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends Firebase Authentication SMS to the phone number of the user. Works only when the current authorization state is authorizationStateWaitCode and the server returned code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendAuthenticationFirebaseSms extends Function<Ok> {
        /**
         * Play Integrity API or SafetyNet Attestation API token for the Android application, or secret from push notification for the iOS application.
         */
        public String token;

        /**
         * Default constructor for a function, which sends Firebase Authentication SMS to the phone number of the user. Works only when the current authorization state is authorizationStateWaitCode and the server returned code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendAuthenticationFirebaseSms() {
        }

        /**
         * Creates a function, which sends Firebase Authentication SMS to the phone number of the user. Works only when the current authorization state is authorizationStateWaitCode and the server returned code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param token Play Integrity API or SafetyNet Attestation API token for the Android application, or secret from push notification for the iOS application.
         */
        public SendAuthenticationFirebaseSms(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 364994111;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Invites a bot to a chat (if it is not yet a member) and sends it the /start command; requires canInviteUsers member right. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class SendBotStartMessage extends Function<Message> {
        /**
         * Identifier of the bot.
         */
        public long botUserId;
        /**
         * Identifier of the target chat.
         */
        public long chatId;
        /**
         * A hidden parameter sent to the bot for deep linking purposes (https://core.telegram.org/bots#deep-linking).
         */
        public String parameter;

        /**
         * Default constructor for a function, which invites a bot to a chat (if it is not yet a member) and sends it the /start command; requires canInviteUsers member right. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public SendBotStartMessage() {
        }

        /**
         * Creates a function, which invites a bot to a chat (if it is not yet a member) and sends it the /start command; requires canInviteUsers member right. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param botUserId Identifier of the bot.
         * @param chatId Identifier of the target chat.
         * @param parameter A hidden parameter sent to the bot for deep linking purposes (https://core.telegram.org/bots#deep-linking).
         */
        public SendBotStartMessage(long botUserId, long chatId, String parameter) {
            this.botUserId = botUserId;
            this.chatId = chatId;
            this.parameter = parameter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1435877650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a message on behalf of a business account; for bots only. Returns the message after it was sent.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class SendBusinessMessage extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which to send the request.
         */
        public String businessConnectionId;
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * Information about the message to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Pass true to disable notification for the message.
         */
        public boolean disableNotification;
        /**
         * Pass true if the content of the message must be protected from forwarding and saving.
         */
        public boolean protectContent;
        /**
         * Identifier of the effect to apply to the message.
         */
        public long effectId;
        /**
         * Markup for replying to the message; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which sends a message on behalf of a business account; for bots only. Returns the message after it was sent.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public SendBusinessMessage() {
        }

        /**
         * Creates a function, which sends a message on behalf of a business account; for bots only. Returns the message after it was sent.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request.
         * @param chatId Target chat.
         * @param replyTo Information about the message to be replied; pass null if none.
         * @param disableNotification Pass true to disable notification for the message.
         * @param protectContent Pass true if the content of the message must be protected from forwarding and saving.
         * @param effectId Identifier of the effect to apply to the message.
         * @param replyMarkup Markup for replying to the message; pass null if none.
         * @param inputMessageContent The content of the message to be sent.
         */
        public SendBusinessMessage(String businessConnectionId, long chatId, InputMessageReplyTo replyTo, boolean disableNotification, boolean protectContent, long effectId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.replyTo = replyTo;
            this.disableNotification = disableNotification;
            this.protectContent = protectContent;
            this.effectId = effectId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 159888387;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends 2-10 messages grouped together into an album on behalf of a business account; for bots only. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
     *
     * <p> Returns {@link BusinessMessages BusinessMessages} </p>
     */
    public static class SendBusinessMessageAlbum extends Function<BusinessMessages> {
        /**
         * Unique identifier of business connection on behalf of which to send the request.
         */
        public String businessConnectionId;
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * Information about the message to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Pass true to disable notification for the message.
         */
        public boolean disableNotification;
        /**
         * Pass true if the content of the message must be protected from forwarding and saving.
         */
        public boolean protectContent;
        /**
         * Identifier of the effect to apply to the message.
         */
        public long effectId;
        /**
         * Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public InputMessageContent[] inputMessageContents;

        /**
         * Default constructor for a function, which sends 2-10 messages grouped together into an album on behalf of a business account; for bots only. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link BusinessMessages BusinessMessages} </p>
         */
        public SendBusinessMessageAlbum() {
        }

        /**
         * Creates a function, which sends 2-10 messages grouped together into an album on behalf of a business account; for bots only. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link BusinessMessages BusinessMessages} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request.
         * @param chatId Target chat.
         * @param replyTo Information about the message to be replied; pass null if none.
         * @param disableNotification Pass true to disable notification for the message.
         * @param protectContent Pass true if the content of the message must be protected from forwarding and saving.
         * @param effectId Identifier of the effect to apply to the message.
         * @param inputMessageContents Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public SendBusinessMessageAlbum(String businessConnectionId, long chatId, InputMessageReplyTo replyTo, boolean disableNotification, boolean protectContent, long effectId, InputMessageContent[] inputMessageContents) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.replyTo = replyTo;
            this.disableNotification = disableNotification;
            this.protectContent = protectContent;
            this.effectId = effectId;
            this.inputMessageContents = inputMessageContents;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 788608366;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends debug information for a call to Telegram servers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendCallDebugInformation extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * Debug information in application-specific format.
         */
        public String debugInformation;

        /**
         * Default constructor for a function, which sends debug information for a call to Telegram servers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendCallDebugInformation() {
        }

        /**
         * Creates a function, which sends debug information for a call to Telegram servers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param debugInformation Debug information in application-specific format.
         */
        public SendCallDebugInformation(int callId, String debugInformation) {
            this.callId = callId;
            this.debugInformation = debugInformation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2019243839;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends log file for a call to Telegram servers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendCallLog extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * Call log file. Only inputFileLocal and inputFileGenerated are supported.
         */
        public InputFile logFile;

        /**
         * Default constructor for a function, which sends log file for a call to Telegram servers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendCallLog() {
        }

        /**
         * Creates a function, which sends log file for a call to Telegram servers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param logFile Call log file. Only inputFileLocal and inputFileGenerated are supported.
         */
        public SendCallLog(int callId, InputFile logFile) {
            this.callId = callId;
            this.logFile = logFile;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1057638353;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a call rating.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendCallRating extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * Call rating; 1-5.
         */
        public int rating;
        /**
         * An optional user comment if the rating is less than 5.
         */
        public String comment;
        /**
         * List of the exact types of problems with the call, specified by the user.
         */
        public CallProblem[] problems;

        /**
         * Default constructor for a function, which sends a call rating.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendCallRating() {
        }

        /**
         * Creates a function, which sends a call rating.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param rating Call rating; 1-5.
         * @param comment An optional user comment if the rating is less than 5.
         * @param problems List of the exact types of problems with the call, specified by the user.
         */
        public SendCallRating(int callId, int rating, String comment, CallProblem[] problems) {
            this.callId = callId;
            this.rating = rating;
            this.comment = comment;
            this.problems = problems;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1402719502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends call signaling data.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendCallSignalingData extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * The data.
         */
        public byte[] data;

        /**
         * Default constructor for a function, which sends call signaling data.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendCallSignalingData() {
        }

        /**
         * Creates a function, which sends call signaling data.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param data The data.
         */
        public SendCallSignalingData(int callId, byte[] data) {
            this.callId = callId;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1412280732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a notification about user activity in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendChatAction extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * If not 0, the message thread identifier in which the action was performed.
         */
        public long messageThreadId;
        /**
         * Unique identifier of business connection on behalf of which to send the request; for bots only.
         */
        public String businessConnectionId;
        /**
         * The action description; pass null to cancel the currently active action.
         */
        public ChatAction action;

        /**
         * Default constructor for a function, which sends a notification about user activity in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendChatAction() {
        }

        /**
         * Creates a function, which sends a notification about user activity in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageThreadId If not 0, the message thread identifier in which the action was performed.
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request; for bots only.
         * @param action The action description; pass null to cancel the currently active action.
         */
        public SendChatAction(long chatId, long messageThreadId, String businessConnectionId, ChatAction action) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.businessConnectionId = businessConnectionId;
            this.action = action;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2010910050;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a custom request; for bots only.
     *
     * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
     */
    public static class SendCustomRequest extends Function<CustomRequestResult> {
        /**
         * The method name.
         */
        public String method;
        /**
         * JSON-serialized method parameters.
         */
        public String parameters;

        /**
         * Default constructor for a function, which sends a custom request; for bots only.
         *
         * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
         */
        public SendCustomRequest() {
        }

        /**
         * Creates a function, which sends a custom request; for bots only.
         *
         * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
         *
         * @param method The method name.
         * @param parameters JSON-serialized method parameters.
         */
        public SendCustomRequest(String method, String parameters) {
            this.method = method;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 285045153;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a code to verify an email address to be added to a user's Telegram Passport.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class SendEmailAddressVerificationCode extends Function<EmailAddressAuthenticationCodeInfo> {
        /**
         * Email address.
         */
        public String emailAddress;

        /**
         * Default constructor for a function, which sends a code to verify an email address to be added to a user's Telegram Passport.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public SendEmailAddressVerificationCode() {
        }

        /**
         * Creates a function, which sends a code to verify an email address to be added to a user's Telegram Passport.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         *
         * @param emailAddress Email address.
         */
        public SendEmailAddressVerificationCode(String emailAddress) {
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -221621379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class SendInlineQueryResultMessage extends Function<Message> {
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * If not 0, the message thread identifier in which the message will be sent.
         */
        public long messageThreadId;
        /**
         * Information about the message or story to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Options to be used to send the message; pass null to use default options.
         */
        public MessageSendOptions options;
        /**
         * Identifier of the inline query.
         */
        public long queryId;
        /**
         * Identifier of the inline query result.
         */
        public String resultId;
        /**
         * Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption(&quot;animation_search_bot_username&quot;), getOption(&quot;photo_search_bot_username&quot;), and getOption(&quot;venue_search_bot_username&quot;).
         */
        public boolean hideViaBot;

        /**
         * Default constructor for a function, which sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public SendInlineQueryResultMessage() {
        }

        /**
         * Creates a function, which sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Target chat.
         * @param messageThreadId If not 0, the message thread identifier in which the message will be sent.
         * @param replyTo Information about the message or story to be replied; pass null if none.
         * @param options Options to be used to send the message; pass null to use default options.
         * @param queryId Identifier of the inline query.
         * @param resultId Identifier of the inline query result.
         * @param hideViaBot Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption(&quot;animation_search_bot_username&quot;), getOption(&quot;photo_search_bot_username&quot;), and getOption(&quot;venue_search_bot_username&quot;).
         */
        public SendInlineQueryResultMessage(long chatId, long messageThreadId, InputMessageReplyTo replyTo, MessageSendOptions options, long queryId, String resultId, boolean hideViaBot) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.replyTo = replyTo;
            this.options = options;
            this.queryId = queryId;
            this.resultId = resultId;
            this.hideViaBot = hideViaBot;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1182553208;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a message. Returns the sent message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class SendMessage extends Function<Message> {
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * If not 0, the message thread identifier in which the message will be sent.
         */
        public long messageThreadId;
        /**
         * Information about the message or story to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Options to be used to send the message; pass null to use default options.
         */
        public MessageSendOptions options;
        /**
         * Markup for replying to the message; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which sends a message. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public SendMessage() {
        }

        /**
         * Creates a function, which sends a message. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Target chat.
         * @param messageThreadId If not 0, the message thread identifier in which the message will be sent.
         * @param replyTo Information about the message or story to be replied; pass null if none.
         * @param options Options to be used to send the message; pass null to use default options.
         * @param replyMarkup Markup for replying to the message; pass null if none; for bots only.
         * @param inputMessageContent The content of the message to be sent.
         */
        public SendMessage(long chatId, long messageThreadId, InputMessageReplyTo replyTo, MessageSendOptions options, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.replyTo = replyTo;
            this.options = options;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -533921303;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends 2-10 messages grouped together into an album. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class SendMessageAlbum extends Function<Messages> {
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * If not 0, the message thread identifier in which the messages will be sent.
         */
        public long messageThreadId;
        /**
         * Information about the message or story to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Options to be used to send the messages; pass null to use default options.
         */
        public MessageSendOptions options;
        /**
         * Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public InputMessageContent[] inputMessageContents;

        /**
         * Default constructor for a function, which sends 2-10 messages grouped together into an album. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public SendMessageAlbum() {
        }

        /**
         * Creates a function, which sends 2-10 messages grouped together into an album. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Target chat.
         * @param messageThreadId If not 0, the message thread identifier in which the messages will be sent.
         * @param replyTo Information about the message or story to be replied; pass null if none.
         * @param options Options to be used to send the messages; pass null to use default options.
         * @param inputMessageContents Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public SendMessageAlbum(long chatId, long messageThreadId, InputMessageReplyTo replyTo, MessageSendOptions options, InputMessageContent[] inputMessageContents) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.replyTo = replyTo;
            this.options = options;
            this.inputMessageContents = inputMessageContents;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1985013029;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a Telegram Passport authorization form, effectively sharing data with the service. This method must be called after getPassportAuthorizationFormAvailableElements if some previously available elements are going to be reused.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendPassportAuthorizationForm extends Function<Ok> {
        /**
         * Authorization form identifier.
         */
        public int authorizationFormId;
        /**
         * Types of Telegram Passport elements chosen by user to complete the authorization form.
         */
        public PassportElementType[] types;

        /**
         * Default constructor for a function, which sends a Telegram Passport authorization form, effectively sharing data with the service. This method must be called after getPassportAuthorizationFormAvailableElements if some previously available elements are going to be reused.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendPassportAuthorizationForm() {
        }

        /**
         * Creates a function, which sends a Telegram Passport authorization form, effectively sharing data with the service. This method must be called after getPassportAuthorizationFormAvailableElements if some previously available elements are going to be reused.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param authorizationFormId Authorization form identifier.
         * @param types Types of Telegram Passport elements chosen by user to complete the authorization form.
         */
        public SendPassportAuthorizationForm(int authorizationFormId, PassportElementType[] types) {
            this.authorizationFormId = authorizationFormId;
            this.types = types;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 652160701;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a filled-out payment form to the bot for final verification.
     *
     * <p> Returns {@link PaymentResult PaymentResult} </p>
     */
    public static class SendPaymentForm extends Function<PaymentResult> {
        /**
         * The invoice.
         */
        public InputInvoice inputInvoice;
        /**
         * Payment form identifier returned by getPaymentForm.
         */
        public long paymentFormId;
        /**
         * Identifier returned by validateOrderInfo, or an empty string.
         */
        public String orderInfoId;
        /**
         * Identifier of a chosen shipping option, if applicable.
         */
        public String shippingOptionId;
        /**
         * The credentials chosen by user for payment; pass null for a payment in Telegram stars.
         */
        public InputCredentials credentials;
        /**
         * Chosen by the user amount of tip in the smallest units of the currency.
         */
        public long tipAmount;

        /**
         * Default constructor for a function, which sends a filled-out payment form to the bot for final verification.
         *
         * <p> Returns {@link PaymentResult PaymentResult} </p>
         */
        public SendPaymentForm() {
        }

        /**
         * Creates a function, which sends a filled-out payment form to the bot for final verification.
         *
         * <p> Returns {@link PaymentResult PaymentResult} </p>
         *
         * @param inputInvoice The invoice.
         * @param paymentFormId Payment form identifier returned by getPaymentForm.
         * @param orderInfoId Identifier returned by validateOrderInfo, or an empty string.
         * @param shippingOptionId Identifier of a chosen shipping option, if applicable.
         * @param credentials The credentials chosen by user for payment; pass null for a payment in Telegram stars.
         * @param tipAmount Chosen by the user amount of tip in the smallest units of the currency.
         */
        public SendPaymentForm(InputInvoice inputInvoice, long paymentFormId, String orderInfoId, String shippingOptionId, InputCredentials credentials, long tipAmount) {
            this.inputInvoice = inputInvoice;
            this.paymentFormId = paymentFormId;
            this.orderInfoId = orderInfoId;
            this.shippingOptionId = shippingOptionId;
            this.credentials = credentials;
            this.tipAmount = tipAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -965855094;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a code to the specified phone number. Aborts previous phone number verification if there was one. On success, returns information about the sent code.
     *
     * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
     */
    public static class SendPhoneNumberCode extends Function<AuthenticationCodeInfo> {
        /**
         * The phone number, in international format.
         */
        public String phoneNumber;
        /**
         * Settings for the authentication of the user's phone number; pass null to use default settings.
         */
        public PhoneNumberAuthenticationSettings settings;
        /**
         * Type of the request for which the code is sent.
         */
        public PhoneNumberCodeType type;

        /**
         * Default constructor for a function, which sends a code to the specified phone number. Aborts previous phone number verification if there was one. On success, returns information about the sent code.
         *
         * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
         */
        public SendPhoneNumberCode() {
        }

        /**
         * Creates a function, which sends a code to the specified phone number. Aborts previous phone number verification if there was one. On success, returns information about the sent code.
         *
         * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
         *
         * @param phoneNumber The phone number, in international format.
         * @param settings Settings for the authentication of the user's phone number; pass null to use default settings.
         * @param type Type of the request for which the code is sent.
         */
        public SendPhoneNumberCode(String phoneNumber, PhoneNumberAuthenticationSettings settings, PhoneNumberCodeType type) {
            this.phoneNumber = phoneNumber;
            this.settings = settings;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1084112144;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends Firebase Authentication SMS to the specified phone number. Works only when received a code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendPhoneNumberFirebaseSms extends Function<Ok> {
        /**
         * Play Integrity API or SafetyNet Attestation API token for the Android application, or secret from push notification for the iOS application.
         */
        public String token;

        /**
         * Default constructor for a function, which sends Firebase Authentication SMS to the specified phone number. Works only when received a code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendPhoneNumberFirebaseSms() {
        }

        /**
         * Creates a function, which sends Firebase Authentication SMS to the specified phone number. Works only when received a code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param token Play Integrity API or SafetyNet Attestation API token for the Android application, or secret from push notification for the iOS application.
         */
        public SendPhoneNumberFirebaseSms(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 261910660;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends messages from a quick reply shortcut. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class SendQuickReplyShortcutMessages extends Function<Messages> {
        /**
         * Identifier of the chat to which to send messages. The chat must be a private chat with a regular user.
         */
        public long chatId;
        /**
         * Unique identifier of the quick reply shortcut.
         */
        public int shortcutId;
        /**
         * Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates.
         */
        public int sendingId;

        /**
         * Default constructor for a function, which sends messages from a quick reply shortcut. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public SendQuickReplyShortcutMessages() {
        }

        /**
         * Creates a function, which sends messages from a quick reply shortcut. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Identifier of the chat to which to send messages. The chat must be a private chat with a regular user.
         * @param shortcutId Unique identifier of the quick reply shortcut.
         * @param sendingId Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates.
         */
        public SendQuickReplyShortcutMessages(long chatId, int shortcutId, int sendingId) {
            this.chatId = chatId;
            this.shortcutId = shortcutId;
            this.sendingId = sendingId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 232068765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a new story to a chat; requires canPostStories right for supergroup and channel chats. Returns a temporary story.
     *
     * <p> Returns {@link Story Story} </p>
     */
    public static class SendStory extends Function<Story> {
        /**
         * Identifier of the chat that will post the story.
         */
        public long chatId;
        /**
         * Content of the story.
         */
        public InputStoryContent content;
        /**
         * Clickable rectangle areas to be shown on the story media; pass null if none.
         */
        public InputStoryAreas areas;
        /**
         * Story caption; pass null to use an empty caption; 0-getOption(&quot;story_caption_length_max&quot;) characters; can have entities only if getOption(&quot;can_use_text_entities_in_story_caption&quot;).
         */
        public FormattedText caption;
        /**
         * The privacy settings for the story; ignored for stories sent to supergroup and channel chats.
         */
        public StoryPrivacySettings privacySettings;
        /**
         * Period after which the story is moved to archive, in seconds; must be one of 6 * 3600, 12 * 3600, 86400, or 2 * 86400 for Telegram Premium users, and 86400 otherwise.
         */
        public int activePeriod;
        /**
         * Full identifier of the original story, which content was used to create the story.
         */
        public StoryFullId fromStoryFullId;
        /**
         * Pass true to keep the story accessible after expiration.
         */
        public boolean isPostedToChatPage;
        /**
         * Pass true if the content of the story must be protected from forwarding and screenshotting.
         */
        public boolean protectContent;

        /**
         * Default constructor for a function, which sends a new story to a chat; requires canPostStories right for supergroup and channel chats. Returns a temporary story.
         *
         * <p> Returns {@link Story Story} </p>
         */
        public SendStory() {
        }

        /**
         * Creates a function, which sends a new story to a chat; requires canPostStories right for supergroup and channel chats. Returns a temporary story.
         *
         * <p> Returns {@link Story Story} </p>
         *
         * @param chatId Identifier of the chat that will post the story.
         * @param content Content of the story.
         * @param areas Clickable rectangle areas to be shown on the story media; pass null if none.
         * @param caption Story caption; pass null to use an empty caption; 0-getOption(&quot;story_caption_length_max&quot;) characters; can have entities only if getOption(&quot;can_use_text_entities_in_story_caption&quot;).
         * @param privacySettings The privacy settings for the story; ignored for stories sent to supergroup and channel chats.
         * @param activePeriod Period after which the story is moved to archive, in seconds; must be one of 6 * 3600, 12 * 3600, 86400, or 2 * 86400 for Telegram Premium users, and 86400 otherwise.
         * @param fromStoryFullId Full identifier of the original story, which content was used to create the story.
         * @param isPostedToChatPage Pass true to keep the story accessible after expiration.
         * @param protectContent Pass true if the content of the story must be protected from forwarding and screenshotting.
         */
        public SendStory(long chatId, InputStoryContent content, InputStoryAreas areas, FormattedText caption, StoryPrivacySettings privacySettings, int activePeriod, StoryFullId fromStoryFullId, boolean isPostedToChatPage, boolean protectContent) {
            this.chatId = chatId;
            this.content = content;
            this.areas = areas;
            this.caption = caption;
            this.privacySettings = privacySettings;
            this.activePeriod = activePeriod;
            this.fromStoryFullId = fromStoryFullId;
            this.isPostedToChatPage = isPostedToChatPage;
            this.protectContent = protectContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -424987902;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a custom request from a Web App.
     *
     * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
     */
    public static class SendWebAppCustomRequest extends Function<CustomRequestResult> {
        /**
         * Identifier of the bot.
         */
        public long botUserId;
        /**
         * The method name.
         */
        public String method;
        /**
         * JSON-serialized method parameters.
         */
        public String parameters;

        /**
         * Default constructor for a function, which sends a custom request from a Web App.
         *
         * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
         */
        public SendWebAppCustomRequest() {
        }

        /**
         * Creates a function, which sends a custom request from a Web App.
         *
         * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
         *
         * @param botUserId Identifier of the bot.
         * @param method The method name.
         * @param parameters JSON-serialized method parameters.
         */
        public SendWebAppCustomRequest(long botUserId, String method, String parameters) {
            this.botUserId = botUserId;
            this.method = method;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 922705352;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends data received from a keyboardButtonTypeWebApp Web App to a bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendWebAppData extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         */
        public String buttonText;
        /**
         * The data.
         */
        public String data;

        /**
         * Default constructor for a function, which sends data received from a keyboardButtonTypeWebApp Web App to a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendWebAppData() {
        }

        /**
         * Creates a function, which sends data received from a keyboardButtonTypeWebApp Web App to a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param buttonText Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         * @param data The data.
         */
        public SendWebAppData(long botUserId, String buttonText, String data) {
            this.botUserId = botUserId;
            this.buttonText = buttonText;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1423978996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes accent color and background custom emoji for the current user; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAccentColor extends Function<Ok> {
        /**
         * Identifier of the accent color to use.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         */
        public long backgroundCustomEmojiId;

        /**
         * Default constructor for a function, which changes accent color and background custom emoji for the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAccentColor() {
        }

        /**
         * Creates a function, which changes accent color and background custom emoji for the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param accentColorId Identifier of the accent color to use.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         */
        public SetAccentColor(int accentColorId, long backgroundCustomEmojiId) {
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1669974841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the period of inactivity after which the account of the current user will automatically be deleted.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAccountTtl extends Function<Ok> {
        /**
         * New account TTL.
         */
        public AccountTtl ttl;

        /**
         * Default constructor for a function, which changes the period of inactivity after which the account of the current user will automatically be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAccountTtl() {
        }

        /**
         * Creates a function, which changes the period of inactivity after which the account of the current user will automatically be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param ttl New account TTL.
         */
        public SetAccountTtl(AccountTtl ttl) {
            this.ttl = ttl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 701389032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Succeeds after a specified amount of time has passed. Can be called before initialization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAlarm extends Function<Ok> {
        /**
         * Number of seconds before the function returns.
         */
        public double seconds;

        /**
         * Default constructor for a function, which succeeds after a specified amount of time has passed. Can be called before initialization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAlarm() {
        }

        /**
         * Creates a function, which succeeds after a specified amount of time has passed. Can be called before initialization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param seconds Number of seconds before the function returns.
         */
        public SetAlarm(double seconds) {
            this.seconds = seconds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -873497067;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Application verification has been completed. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetApplicationVerificationToken extends Function<Ok> {
        /**
         * Unique identifier for the verification process as received from updateApplicationVerificationRequired.
         */
        public long verificationId;
        /**
         * Play Integrity API token for the Android application, or secret from push notification for the iOS application; pass an empty string to abort verification and receive error VERIFICATIONFAILED for the request.
         */
        public String token;

        /**
         * Default constructor for a function, which application verification has been completed. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetApplicationVerificationToken() {
        }

        /**
         * Creates a function, which application verification has been completed. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param verificationId Unique identifier for the verification process as received from updateApplicationVerificationRequired.
         * @param token Play Integrity API token for the Android application, or secret from push notification for the iOS application; pass an empty string to abort verification and receive error VERIFICATIONFAILED for the request.
         */
        public SetApplicationVerificationToken(long verificationId, String token) {
            this.verificationId = verificationId;
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 927248261;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes settings for automatic moving of chats to and from the Archive chat lists.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetArchiveChatListSettings extends Function<Ok> {
        /**
         * New settings.
         */
        public ArchiveChatListSettings settings;

        /**
         * Default constructor for a function, which changes settings for automatic moving of chats to and from the Archive chat lists.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetArchiveChatListSettings() {
        }

        /**
         * Creates a function, which changes settings for automatic moving of chats to and from the Archive chat lists.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings New settings.
         */
        public SetArchiveChatListSettings(ArchiveChatListSettings settings) {
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -884650998;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the email address of the user and sends an authentication code to the email address. Works only when the current authorization state is authorizationStateWaitEmailAddress.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAuthenticationEmailAddress extends Function<Ok> {
        /**
         * The email address of the user.
         */
        public String emailAddress;

        /**
         * Default constructor for a function, which sets the email address of the user and sends an authentication code to the email address. Works only when the current authorization state is authorizationStateWaitEmailAddress.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAuthenticationEmailAddress() {
        }

        /**
         * Creates a function, which sets the email address of the user and sends an authentication code to the email address. Works only when the current authorization state is authorizationStateWaitEmailAddress.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param emailAddress The email address of the user.
         */
        public SetAuthenticationEmailAddress(String emailAddress) {
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1773323522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAuthenticationPhoneNumber extends Function<Ok> {
        /**
         * The phone number of the user, in international format.
         */
        public String phoneNumber;
        /**
         * Settings for the authentication of the user's phone number; pass null to use default settings.
         */
        public PhoneNumberAuthenticationSettings settings;

        /**
         * Default constructor for a function, which sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAuthenticationPhoneNumber() {
        }

        /**
         * Creates a function, which sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param phoneNumber The phone number of the user, in international format.
         * @param settings Settings for the authentication of the user's phone number; pass null to use default settings.
         */
        public SetAuthenticationPhoneNumber(String phoneNumber, PhoneNumberAuthenticationSettings settings) {
            this.phoneNumber = phoneNumber;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 868276259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets auto-download settings.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAutoDownloadSettings extends Function<Ok> {
        /**
         * New user auto-download settings.
         */
        public AutoDownloadSettings settings;
        /**
         * Type of the network for which the new settings are relevant.
         */
        public NetworkType type;

        /**
         * Default constructor for a function, which sets auto-download settings.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAutoDownloadSettings() {
        }

        /**
         * Creates a function, which sets auto-download settings.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings New user auto-download settings.
         * @param type Type of the network for which the new settings are relevant.
         */
        public SetAutoDownloadSettings(AutoDownloadSettings settings, NetworkType type) {
            this.settings = settings;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -353671948;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets autosave settings for the given scope. The method is guaranteed to work only after at least one call to getAutosaveSettings.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAutosaveSettings extends Function<Ok> {
        /**
         * Autosave settings scope.
         */
        public AutosaveSettingsScope scope;
        /**
         * New autosave settings for the scope; pass null to set autosave settings to default.
         */
        public ScopeAutosaveSettings settings;

        /**
         * Default constructor for a function, which sets autosave settings for the given scope. The method is guaranteed to work only after at least one call to getAutosaveSettings.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAutosaveSettings() {
        }

        /**
         * Creates a function, which sets autosave settings for the given scope. The method is guaranteed to work only after at least one call to getAutosaveSettings.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param scope Autosave settings scope.
         * @param settings New autosave settings for the scope; pass null to set autosave settings to default.
         */
        public SetAutosaveSettings(AutosaveSettingsScope scope, ScopeAutosaveSettings settings) {
            this.scope = scope;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 6846656;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the bio of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBio extends Function<Ok> {
        /**
         * The new value of the user bio; 0-getOption(&quot;bio_length_max&quot;) characters without line feeds.
         */
        public String bio;

        /**
         * Default constructor for a function, which changes the bio of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBio() {
        }

        /**
         * Creates a function, which changes the bio of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param bio The new value of the user bio; 0-getOption(&quot;bio_length_max&quot;) characters without line feeds.
         */
        public SetBio(String bio) {
            this.bio = bio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1619582124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the birthdate of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBirthdate extends Function<Ok> {
        /**
         * The new value of the current user's birthdate; pass null to remove the birthdate.
         */
        public Birthdate birthdate;

        /**
         * Default constructor for a function, which changes the birthdate of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBirthdate() {
        }

        /**
         * Creates a function, which changes the birthdate of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param birthdate The new value of the current user's birthdate; pass null to remove the birthdate.
         */
        public SetBirthdate(Birthdate birthdate) {
            this.birthdate = birthdate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1319755160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the text shown in the chat with a bot if the chat is empty. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotInfoDescription extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code. If empty, the description will be shown to all users for whose languages there is no dedicated description.
         */
        public String languageCode;
        /**
         * New bot's description on the specified language.
         */
        public String description;

        /**
         * Default constructor for a function, which sets the text shown in the chat with a bot if the chat is empty. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotInfoDescription() {
        }

        /**
         * Creates a function, which sets the text shown in the chat with a bot if the chat is empty. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code. If empty, the description will be shown to all users for whose languages there is no dedicated description.
         * @param description New bot's description on the specified language.
         */
        public SetBotInfoDescription(long botUserId, String languageCode, String description) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 693574984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the text shown on a bot's profile page and sent together with the link when users share the bot. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotInfoShortDescription extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code. If empty, the short description will be shown to all users for whose languages there is no dedicated description.
         */
        public String languageCode;
        /**
         * New bot's short description on the specified language.
         */
        public String shortDescription;

        /**
         * Default constructor for a function, which sets the text shown on a bot's profile page and sent together with the link when users share the bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotInfoShortDescription() {
        }

        /**
         * Creates a function, which sets the text shown on a bot's profile page and sent together with the link when users share the bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code. If empty, the short description will be shown to all users for whose languages there is no dedicated description.
         * @param shortDescription New bot's short description on the specified language.
         */
        public SetBotInfoShortDescription(long botUserId, String languageCode, String shortDescription) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.shortDescription = shortDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 982956771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the name of a bot. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotName extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code. If empty, the name will be shown to all users for whose languages there is no dedicated name.
         */
        public String languageCode;
        /**
         * New bot's name on the specified language; 0-64 characters; must be non-empty if language code is empty.
         */
        public String name;

        /**
         * Default constructor for a function, which sets the name of a bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotName() {
        }

        /**
         * Creates a function, which sets the name of a bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code. If empty, the name will be shown to all users for whose languages there is no dedicated name.
         * @param name New bot's name on the specified language; 0-64 characters; must be non-empty if language code is empty.
         */
        public SetBotName(long botUserId, String languageCode, String name) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -761922959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a profile photo for a bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotProfilePhoto extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Profile photo to set; pass null to delete the chat photo.
         */
        public InputChatPhoto photo;

        /**
         * Default constructor for a function, which changes a profile photo for a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotProfilePhoto() {
        }

        /**
         * Creates a function, which changes a profile photo for a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param photo Profile photo to set; pass null to delete the chat photo.
         */
        public SetBotProfilePhoto(long botUserId, InputChatPhoto photo) {
            this.botUserId = botUserId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1115272346;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotUpdatesStatus extends Function<Ok> {
        /**
         * The number of pending updates.
         */
        public int pendingUpdateCount;
        /**
         * The last error message.
         */
        public String errorMessage;

        /**
         * Default constructor for a function, which informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotUpdatesStatus() {
        }

        /**
         * Creates a function, which informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param pendingUpdateCount The number of pending updates.
         * @param errorMessage The last error message.
         */
        public SetBotUpdatesStatus(int pendingUpdateCount, String errorMessage) {
            this.pendingUpdateCount = pendingUpdateCount;
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1154926191;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business away message settings of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessAwayMessageSettings extends Function<Ok> {
        /**
         * The new settings for the away message of the business; pass null to disable the away message.
         */
        public BusinessAwayMessageSettings awayMessageSettings;

        /**
         * Default constructor for a function, which changes the business away message settings of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessAwayMessageSettings() {
        }

        /**
         * Creates a function, which changes the business away message settings of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param awayMessageSettings The new settings for the away message of the business; pass null to disable the away message.
         */
        public SetBusinessAwayMessageSettings(BusinessAwayMessageSettings awayMessageSettings) {
            this.awayMessageSettings = awayMessageSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1232357484;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds or changes business bot that is connected to the current user account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessConnectedBot extends Function<Ok> {
        /**
         * Connection settings for the bot.
         */
        public BusinessConnectedBot bot;

        /**
         * Default constructor for a function, which adds or changes business bot that is connected to the current user account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessConnectedBot() {
        }

        /**
         * Creates a function, which adds or changes business bot that is connected to the current user account.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param bot Connection settings for the bot.
         */
        public SetBusinessConnectedBot(BusinessConnectedBot bot) {
            this.bot = bot;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1393459472;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business greeting message settings of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessGreetingMessageSettings extends Function<Ok> {
        /**
         * The new settings for the greeting message of the business; pass null to disable the greeting message.
         */
        public BusinessGreetingMessageSettings greetingMessageSettings;

        /**
         * Default constructor for a function, which changes the business greeting message settings of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessGreetingMessageSettings() {
        }

        /**
         * Creates a function, which changes the business greeting message settings of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param greetingMessageSettings The new settings for the greeting message of the business; pass null to disable the greeting message.
         */
        public SetBusinessGreetingMessageSettings(BusinessGreetingMessageSettings greetingMessageSettings) {
            this.greetingMessageSettings = greetingMessageSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -873120707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business location of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessLocation extends Function<Ok> {
        /**
         * The new location of the business; pass null to remove the location.
         */
        public BusinessLocation location;

        /**
         * Default constructor for a function, which changes the business location of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessLocation() {
        }

        /**
         * Creates a function, which changes the business location of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param location The new location of the business; pass null to remove the location.
         */
        public SetBusinessLocation(BusinessLocation location) {
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -344717547;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business opening hours of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessOpeningHours extends Function<Ok> {
        /**
         * The new opening hours of the business; pass null to remove the opening hours; up to 28 time intervals can be specified.
         */
        public BusinessOpeningHours openingHours;

        /**
         * Default constructor for a function, which changes the business opening hours of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessOpeningHours() {
        }

        /**
         * Creates a function, which changes the business opening hours of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param openingHours The new opening hours of the business; pass null to remove the opening hours; up to 28 time intervals can be specified.
         */
        public SetBusinessOpeningHours(BusinessOpeningHours openingHours) {
            this.openingHours = openingHours;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -462379918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business start page of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessStartPage extends Function<Ok> {
        /**
         * The new start page of the business; pass null to remove custom start page.
         */
        public InputBusinessStartPage startPage;

        /**
         * Default constructor for a function, which changes the business start page of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessStartPage() {
        }

        /**
         * Creates a function, which changes the business start page of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param startPage The new start page of the business; pass null to remove custom start page.
         */
        public SetBusinessStartPage(InputBusinessStartPage startPage) {
            this.startPage = startPage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1628616290;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes accent color and background custom emoji of a channel chat. Requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatAccentColor extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the accent color to use. The chat must have at least accentColor.minChannelChatBoostLevel boost level to pass the corresponding color.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none. Use chatBoostLevelFeatures.canSetBackgroundCustomEmoji to check whether a custom emoji can be set.
         */
        public long backgroundCustomEmojiId;

        /**
         * Default constructor for a function, which changes accent color and background custom emoji of a channel chat. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatAccentColor() {
        }

        /**
         * Creates a function, which changes accent color and background custom emoji of a channel chat. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param accentColorId Identifier of the accent color to use. The chat must have at least accentColor.minChannelChatBoostLevel boost level to pass the corresponding color.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none. Use chatBoostLevelFeatures.canSetBackgroundCustomEmoji to check whether a custom emoji can be set.
         */
        public SetChatAccentColor(long chatId, int accentColorId, long backgroundCustomEmojiId) {
            this.chatId = chatId;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 882857930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes story list in which stories from the chat are shown.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatActiveStoriesList extends Function<Ok> {
        /**
         * Identifier of the chat that posted stories.
         */
        public long chatId;
        /**
         * New list for active stories posted by the chat.
         */
        public StoryList storyList;

        /**
         * Default constructor for a function, which changes story list in which stories from the chat are shown.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatActiveStoriesList() {
        }

        /**
         * Creates a function, which changes story list in which stories from the chat are shown.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat that posted stories.
         * @param storyList New list for active stories posted by the chat.
         */
        public SetChatActiveStoriesList(long chatId, StoryList storyList) {
            this.chatId = chatId;
            this.storyList = storyList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -521970415;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes reactions, available in a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatAvailableReactions extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Reactions available in the chat. All explicitly specified emoji reactions must be active. In channel chats up to the chat's boost level custom emoji reactions can be explicitly specified.
         */
        public ChatAvailableReactions availableReactions;

        /**
         * Default constructor for a function, which changes reactions, available in a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatAvailableReactions() {
        }

        /**
         * Creates a function, which changes reactions, available in a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param availableReactions Reactions available in the chat. All explicitly specified emoji reactions must be active. In channel chats up to the chat's boost level custom emoji reactions can be explicitly specified.
         */
        public SetChatAvailableReactions(long chatId, ChatAvailableReactions availableReactions) {
            this.chatId = chatId;
            this.availableReactions = availableReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 267075078;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the background in a specific chat. Supported only in private and secret chats with non-deleted users, and in chats with sufficient boost level and canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatBackground extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The input background to use; pass null to create a new filled or chat theme background.
         */
        public InputBackground background;
        /**
         * Background type; pass null to use default background type for the chosen background; backgroundTypeChatTheme isn't supported for private and secret chats. Use chatBoostLevelFeatures.chatThemeBackgroundCount and chatBoostLevelFeatures.canSetCustomBackground to check whether the background type can be set in the boosted chat.
         */
        public BackgroundType type;
        /**
         * Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background.
         */
        public int darkThemeDimming;
        /**
         * Pass true to set background only for self; pass false to set background for all chat users. Always false for backgrounds set in boosted chats. Background can be set for both users only by Telegram Premium users and if set background isn't of the type inputBackgroundPrevious.
         */
        public boolean onlyForSelf;

        /**
         * Default constructor for a function, which sets the background in a specific chat. Supported only in private and secret chats with non-deleted users, and in chats with sufficient boost level and canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatBackground() {
        }

        /**
         * Creates a function, which sets the background in a specific chat. Supported only in private and secret chats with non-deleted users, and in chats with sufficient boost level and canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param background The input background to use; pass null to create a new filled or chat theme background.
         * @param type Background type; pass null to use default background type for the chosen background; backgroundTypeChatTheme isn't supported for private and secret chats. Use chatBoostLevelFeatures.chatThemeBackgroundCount and chatBoostLevelFeatures.canSetCustomBackground to check whether the background type can be set in the boosted chat.
         * @param darkThemeDimming Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background.
         * @param onlyForSelf Pass true to set background only for self; pass false to set background for all chat users. Always false for backgrounds set in boosted chats. Background can be set for both users only by Telegram Premium users and if set background isn't of the type inputBackgroundPrevious.
         */
        public SetChatBackground(long chatId, InputBackground background, BackgroundType type, int darkThemeDimming, boolean onlyForSelf) {
            this.chatId = chatId;
            this.background = background;
            this.type = type;
            this.darkThemeDimming = darkThemeDimming;
            this.onlyForSelf = onlyForSelf;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 246727678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes application-specific data associated with a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatClientData extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of clientData.
         */
        public String clientData;

        /**
         * Default constructor for a function, which changes application-specific data associated with a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatClientData() {
        }

        /**
         * Creates a function, which changes application-specific data associated with a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param clientData New value of clientData.
         */
        public SetChatClientData(long chatId, String clientData) {
            this.chatId = chatId;
            this.clientData = clientData;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -827119811;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes information about a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatDescription extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * New chat description; 0-255 characters.
         */
        public String description;

        /**
         * Default constructor for a function, which changes information about a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatDescription() {
        }

        /**
         * Creates a function, which changes information about a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param description New chat description; 0-255 characters.
         */
        public SetChatDescription(long chatId, String description) {
            this.chatId = chatId;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1957213277;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the discussion group of a channel chat; requires canChangeInfo administrator right in the channel if it is specified.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatDiscussionGroup extends Function<Ok> {
        /**
         * Identifier of the channel chat. Pass 0 to remove a link from the supergroup passed in the second argument to a linked channel chat (requires canPinMessages member right in the supergroup).
         */
        public long chatId;
        /**
         * Identifier of a new channel's discussion group. Use 0 to remove the discussion group. Use the method getSuitableDiscussionChats to find all suitable groups. Basic group chats must be first upgraded to supergroup chats. If new chat members don't have access to old messages in the supergroup, then toggleSupergroupIsAllHistoryAvailable must be used first to change that.
         */
        public long discussionChatId;

        /**
         * Default constructor for a function, which changes the discussion group of a channel chat; requires canChangeInfo administrator right in the channel if it is specified.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatDiscussionGroup() {
        }

        /**
         * Creates a function, which changes the discussion group of a channel chat; requires canChangeInfo administrator right in the channel if it is specified.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the channel chat. Pass 0 to remove a link from the supergroup passed in the second argument to a linked channel chat (requires canPinMessages member right in the supergroup).
         * @param discussionChatId Identifier of a new channel's discussion group. Use 0 to remove the discussion group. Use the method getSuitableDiscussionChats to find all suitable groups. Basic group chats must be first upgraded to supergroup chats. If new chat members don't have access to old messages in the supergroup, then toggleSupergroupIsAllHistoryAvailable must be used first to change that.
         */
        public SetChatDiscussionGroup(long chatId, long discussionChatId) {
            this.chatId = chatId;
            this.discussionChatId = discussionChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -918801736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the draft message in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatDraftMessage extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * If not 0, the message thread identifier in which the draft was changed.
         */
        public long messageThreadId;
        /**
         * New draft message; pass null to remove the draft. All files in draft message content must be of the type inputFileLocal. Media thumbnails and captions are ignored.
         */
        public DraftMessage draftMessage;

        /**
         * Default constructor for a function, which changes the draft message in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatDraftMessage() {
        }

        /**
         * Creates a function, which changes the draft message in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageThreadId If not 0, the message thread identifier in which the draft was changed.
         * @param draftMessage New draft message; pass null to remove the draft. All files in draft message content must be of the type inputFileLocal. Media thumbnails and captions are ignored.
         */
        public SetChatDraftMessage(long chatId, long messageThreadId, DraftMessage draftMessage) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1683889946;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the emoji status of a chat. Use chatBoostLevelFeatures.canSetEmojiStatus to check whether an emoji status can be set. Requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatEmojiStatus extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New emoji status; pass null to remove emoji status.
         */
        public EmojiStatus emojiStatus;

        /**
         * Default constructor for a function, which changes the emoji status of a chat. Use chatBoostLevelFeatures.canSetEmojiStatus to check whether an emoji status can be set. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatEmojiStatus() {
        }

        /**
         * Creates a function, which changes the emoji status of a chat. Use chatBoostLevelFeatures.canSetEmojiStatus to check whether an emoji status can be set. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param emojiStatus New emoji status; pass null to remove emoji status.
         */
        public SetChatEmojiStatus(long chatId, EmojiStatus emojiStatus) {
            this.chatId = chatId;
            this.emojiStatus = emojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1434982674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the location of a chat. Available only for some location-based supergroups, use supergroupFullInfo.canSetLocation to check whether the method is allowed to use.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatLocation extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New location for the chat; must be valid and not null.
         */
        public ChatLocation location;

        /**
         * Default constructor for a function, which changes the location of a chat. Available only for some location-based supergroups, use supergroupFullInfo.canSetLocation to check whether the method is allowed to use.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatLocation() {
        }

        /**
         * Creates a function, which changes the location of a chat. Available only for some location-based supergroups, use supergroupFullInfo.canSetLocation to check whether the method is allowed to use.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param location New location for the chat; must be valid and not null.
         */
        public SetChatLocation(long chatId, ChatLocation location) {
            this.chatId = chatId;
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -767091286;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the status of a chat member; requires canInviteUsers member right to add a chat member, canPromoteMembers administrator right to change administrator rights of the member, and canRestrictMembers administrator right to change restrictions of a user. This function is currently not suitable for transferring chat ownership; use transferChatOwnership instead. Use addChatMember or banChatMember if some additional parameters needs to be passed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatMemberStatus extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Member identifier. Chats can be only banned and unbanned in supergroups and channels.
         */
        public MessageSender memberId;
        /**
         * The new status of the member in the chat.
         */
        public ChatMemberStatus status;

        /**
         * Default constructor for a function, which changes the status of a chat member; requires canInviteUsers member right to add a chat member, canPromoteMembers administrator right to change administrator rights of the member, and canRestrictMembers administrator right to change restrictions of a user. This function is currently not suitable for transferring chat ownership; use transferChatOwnership instead. Use addChatMember or banChatMember if some additional parameters needs to be passed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatMemberStatus() {
        }

        /**
         * Creates a function, which changes the status of a chat member; requires canInviteUsers member right to add a chat member, canPromoteMembers administrator right to change administrator rights of the member, and canRestrictMembers administrator right to change restrictions of a user. This function is currently not suitable for transferring chat ownership; use transferChatOwnership instead. Use addChatMember or banChatMember if some additional parameters needs to be passed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param memberId Member identifier. Chats can be only banned and unbanned in supergroups and channels.
         * @param status The new status of the member in the chat.
         */
        public SetChatMemberStatus(long chatId, MessageSender memberId, ChatMemberStatus status) {
            this.chatId = chatId;
            this.memberId = memberId;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 81794847;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the message auto-delete or self-destruct (for secret chats) time in a chat. Requires changeInfo administrator right in basic groups, supergroups and channels Message auto-delete time can't be changed in a chat with the current user (Saved Messages) and the chat 777000 (Telegram).
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatMessageAutoDeleteTime extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New time value, in seconds; unless the chat is secret, it must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public int messageAutoDeleteTime;

        /**
         * Default constructor for a function, which changes the message auto-delete or self-destruct (for secret chats) time in a chat. Requires changeInfo administrator right in basic groups, supergroups and channels Message auto-delete time can't be changed in a chat with the current user (Saved Messages) and the chat 777000 (Telegram).
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatMessageAutoDeleteTime() {
        }

        /**
         * Creates a function, which changes the message auto-delete or self-destruct (for secret chats) time in a chat. Requires changeInfo administrator right in basic groups, supergroups and channels Message auto-delete time can't be changed in a chat with the current user (Saved Messages) and the chat 777000 (Telegram).
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageAutoDeleteTime New time value, in seconds; unless the chat is secret, it must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public SetChatMessageAutoDeleteTime(long chatId, int messageAutoDeleteTime) {
            this.chatId = chatId;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1505643265;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Selects a message sender to send messages in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatMessageSender extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New message sender for the chat.
         */
        public MessageSender messageSenderId;

        /**
         * Default constructor for a function, which selects a message sender to send messages in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatMessageSender() {
        }

        /**
         * Creates a function, which selects a message sender to send messages in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageSenderId New message sender for the chat.
         */
        public SetChatMessageSender(long chatId, MessageSender messageSenderId) {
            this.chatId = chatId;
            this.messageSenderId = messageSenderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1421513858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the notification settings of a chat. Notification settings of a chat with the current user (Saved Messages) can't be changed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatNotificationSettings extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New notification settings for the chat. If the chat is muted for more than 366 days, it is considered to be muted forever.
         */
        public ChatNotificationSettings notificationSettings;

        /**
         * Default constructor for a function, which changes the notification settings of a chat. Notification settings of a chat with the current user (Saved Messages) can't be changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatNotificationSettings() {
        }

        /**
         * Creates a function, which changes the notification settings of a chat. Notification settings of a chat with the current user (Saved Messages) can't be changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param notificationSettings New notification settings for the chat. If the chat is muted for more than 366 days, it is considered to be muted forever.
         */
        public SetChatNotificationSettings(long chatId, ChatNotificationSettings notificationSettings) {
            this.chatId = chatId;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 777199614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the chat members permissions. Supported only for basic groups and supergroups. Requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatPermissions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New non-administrator members permissions in the chat.
         */
        public ChatPermissions permissions;

        /**
         * Default constructor for a function, which changes the chat members permissions. Supported only for basic groups and supergroups. Requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatPermissions() {
        }

        /**
         * Creates a function, which changes the chat members permissions. Supported only for basic groups and supergroups. Requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param permissions New non-administrator members permissions in the chat.
         */
        public SetChatPermissions(long chatId, ChatPermissions permissions) {
            this.chatId = chatId;
            this.permissions = permissions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2138507006;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatPhoto extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New chat photo; pass null to delete the chat photo.
         */
        public InputChatPhoto photo;

        /**
         * Default constructor for a function, which changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatPhoto() {
        }

        /**
         * Creates a function, which changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param photo New chat photo; pass null to delete the chat photo.
         */
        public SetChatPhoto(long chatId, InputChatPhoto photo) {
            this.chatId = chatId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -377778941;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of pinned stories on a chat page; requires canEditStories right in the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatPinnedStories extends Function<Ok> {
        /**
         * Identifier of the chat that posted the stories.
         */
        public long chatId;
        /**
         * New list of pinned stories. All stories must be posted to the chat page first. There can be up to getOption(&quot;pinned_story_count_max&quot;) pinned stories on a chat page.
         */
        public int[] storyIds;

        /**
         * Default constructor for a function, which changes the list of pinned stories on a chat page; requires canEditStories right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatPinnedStories() {
        }

        /**
         * Creates a function, which changes the list of pinned stories on a chat page; requires canEditStories right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat that posted the stories.
         * @param storyIds New list of pinned stories. All stories must be posted to the chat page first. There can be up to getOption(&quot;pinned_story_count_max&quot;) pinned stories on a chat page.
         */
        public SetChatPinnedStories(long chatId, int[] storyIds) {
            this.chatId = chatId;
            this.storyIds = storyIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -669062355;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes accent color and background custom emoji for profile of a supergroup or channel chat. Requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatProfileAccentColor extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the accent color to use for profile; pass -1 if none. The chat must have at least profileAccentColor.minSupergroupChatBoostLevel for supergroups or profileAccentColor.minChannelChatBoostLevel for channels boost level to pass the corresponding color.
         */
        public int profileAccentColorId;
        /**
         * Identifier of a custom emoji to be shown on the chat's profile photo background; 0 if none. Use chatBoostLevelFeatures.canSetProfileBackgroundCustomEmoji to check whether a custom emoji can be set.
         */
        public long profileBackgroundCustomEmojiId;

        /**
         * Default constructor for a function, which changes accent color and background custom emoji for profile of a supergroup or channel chat. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatProfileAccentColor() {
        }

        /**
         * Creates a function, which changes accent color and background custom emoji for profile of a supergroup or channel chat. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param profileAccentColorId Identifier of the accent color to use for profile; pass -1 if none. The chat must have at least profileAccentColor.minSupergroupChatBoostLevel for supergroups or profileAccentColor.minChannelChatBoostLevel for channels boost level to pass the corresponding color.
         * @param profileBackgroundCustomEmojiId Identifier of a custom emoji to be shown on the chat's profile photo background; 0 if none. Use chatBoostLevelFeatures.canSetProfileBackgroundCustomEmoji to check whether a custom emoji can be set.
         */
        public SetChatProfileAccentColor(long chatId, int profileAccentColorId, long profileBackgroundCustomEmojiId) {
            this.chatId = chatId;
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1109896826;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the slow mode delay of a chat. Available only for supergroups; requires canRestrictMembers right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatSlowModeDelay extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New slow mode delay for the chat, in seconds; must be one of 0, 10, 30, 60, 300, 900, 3600.
         */
        public int slowModeDelay;

        /**
         * Default constructor for a function, which changes the slow mode delay of a chat. Available only for supergroups; requires canRestrictMembers right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatSlowModeDelay() {
        }

        /**
         * Creates a function, which changes the slow mode delay of a chat. Available only for supergroups; requires canRestrictMembers right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param slowModeDelay New slow mode delay for the chat, in seconds; must be one of 0, 10, 30, 60, 300, 900, 3600.
         */
        public SetChatSlowModeDelay(long chatId, int slowModeDelay) {
            this.chatId = chatId;
            this.slowModeDelay = slowModeDelay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -540350914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the chat theme. Supported only in private and secret chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatTheme extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Name of the new chat theme; pass an empty string to return the default theme.
         */
        public String themeName;

        /**
         * Default constructor for a function, which changes the chat theme. Supported only in private and secret chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatTheme() {
        }

        /**
         * Creates a function, which changes the chat theme. Supported only in private and secret chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param themeName Name of the new chat theme; pass an empty string to return the default theme.
         */
        public SetChatTheme(long chatId, String themeName) {
            this.chatId = chatId;
            this.themeName = themeName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1895234925;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the chat title. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatTitle extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New title of the chat; 1-128 characters.
         */
        public String title;

        /**
         * Default constructor for a function, which changes the chat title. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatTitle() {
        }

        /**
         * Creates a function, which changes the chat title. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param title New title of the chat; 1-128 characters.
         */
        public SetChatTitle(long chatId, String title) {
            this.chatId = chatId;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164282047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of close friends of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCloseFriends extends Function<Ok> {
        /**
         * User identifiers of close friends; the users must be contacts of the current user.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which changes the list of close friends of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCloseFriends() {
        }

        /**
         * Creates a function, which changes the list of close friends of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userIds User identifiers of close friends; the users must be contacts of the current user.
         */
        public SetCloseFriends(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1908013258;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the list of commands supported by the bot for the given user scope and language; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCommands extends Function<Ok> {
        /**
         * The scope to which the commands are relevant; pass null to change commands in the default bot command scope.
         */
        public BotCommandScope scope;
        /**
         * A two-letter ISO 639-1 language code. If empty, the commands will be applied to all users from the given scope, for which language there are no dedicated commands.
         */
        public String languageCode;
        /**
         * List of the bot's commands.
         */
        public BotCommand[] commands;

        /**
         * Default constructor for a function, which sets the list of commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCommands() {
        }

        /**
         * Creates a function, which sets the list of commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param scope The scope to which the commands are relevant; pass null to change commands in the default bot command scope.
         * @param languageCode A two-letter ISO 639-1 language code. If empty, the commands will be applied to all users from the given scope, for which language there are no dedicated commands.
         * @param commands List of the bot's commands.
         */
        public SetCommands(BotCommandScope scope, String languageCode, BotCommand[] commands) {
            this.scope = scope;
            this.languageCode = languageCode;
            this.commands = commands;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -907165606;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets a custom emoji sticker set thumbnail.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCustomEmojiStickerSetThumbnail extends Function<Ok> {
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;
        /**
         * Identifier of the custom emoji from the sticker set, which will be set as sticker set thumbnail; pass 0 to remove the sticker set thumbnail.
         */
        public long customEmojiId;

        /**
         * Default constructor for a function, which sets a custom emoji sticker set thumbnail.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCustomEmojiStickerSetThumbnail() {
        }

        /**
         * Creates a function, which sets a custom emoji sticker set thumbnail.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Sticker set name. The sticker set must be owned by the current user.
         * @param customEmojiId Identifier of the custom emoji from the sticker set, which will be set as sticker set thumbnail; pass 0 to remove the sticker set thumbnail.
         */
        public SetCustomEmojiStickerSetThumbnail(String name, long customEmojiId) {
            this.name = name;
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1122836246;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds or changes a custom local language pack to the current localization target.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCustomLanguagePack extends Function<Ok> {
        /**
         * Information about the language pack. Language pack identifier must start with 'X', consist only of English letters, digits and hyphens, and must not exceed 64 characters. Can be called before authorization.
         */
        public LanguagePackInfo info;
        /**
         * Strings of the new language pack.
         */
        public LanguagePackString[] strings;

        /**
         * Default constructor for a function, which adds or changes a custom local language pack to the current localization target.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCustomLanguagePack() {
        }

        /**
         * Creates a function, which adds or changes a custom local language pack to the current localization target.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param info Information about the language pack. Language pack identifier must start with 'X', consist only of English letters, digits and hyphens, and must not exceed 64 characters. Can be called before authorization.
         * @param strings Strings of the new language pack.
         */
        public SetCustomLanguagePack(LanguagePackInfo info, LanguagePackString[] strings) {
            this.info = info;
            this.strings = strings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -296742819;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds, edits or deletes a string in a custom local language pack. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCustomLanguagePackString extends Function<Ok> {
        /**
         * Identifier of a previously added custom local language pack in the current localization target.
         */
        public String languagePackId;
        /**
         * New language pack string.
         */
        public LanguagePackString newString;

        /**
         * Default constructor for a function, which adds, edits or deletes a string in a custom local language pack. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCustomLanguagePackString() {
        }

        /**
         * Creates a function, which adds, edits or deletes a string in a custom local language pack. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param languagePackId Identifier of a previously added custom local language pack in the current localization target.
         * @param newString New language pack string.
         */
        public SetCustomLanguagePackString(String languagePackId, LanguagePackString newString) {
            this.languagePackId = languagePackId;
            this.newString = newString;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1316365592;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDatabaseEncryptionKey extends Function<Ok> {
        /**
         * New encryption key.
         */
        public byte[] newEncryptionKey;

        /**
         * Default constructor for a function, which changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDatabaseEncryptionKey() {
        }

        /**
         * Creates a function, which changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param newEncryptionKey New encryption key.
         */
        public SetDatabaseEncryptionKey(byte[] newEncryptionKey) {
            this.newEncryptionKey = newEncryptionKey;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1204599371;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets default background for chats; adds the background to the list of installed backgrounds.
     *
     * <p> Returns {@link Background Background} </p>
     */
    public static class SetDefaultBackground extends Function<Background> {
        /**
         * The input background to use; pass null to create a new filled background.
         */
        public InputBackground background;
        /**
         * Background type; pass null to use the default type of the remote background; backgroundTypeChatTheme isn't supported.
         */
        public BackgroundType type;
        /**
         * Pass true if the background is set for a dark theme.
         */
        public boolean forDarkTheme;

        /**
         * Default constructor for a function, which sets default background for chats; adds the background to the list of installed backgrounds.
         *
         * <p> Returns {@link Background Background} </p>
         */
        public SetDefaultBackground() {
        }

        /**
         * Creates a function, which sets default background for chats; adds the background to the list of installed backgrounds.
         *
         * <p> Returns {@link Background Background} </p>
         *
         * @param background The input background to use; pass null to create a new filled background.
         * @param type Background type; pass null to use the default type of the remote background; backgroundTypeChatTheme isn't supported.
         * @param forDarkTheme Pass true if the background is set for a dark theme.
         */
        public SetDefaultBackground(InputBackground background, BackgroundType type, boolean forDarkTheme) {
            this.background = background;
            this.type = type;
            this.forDarkTheme = forDarkTheme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1982748511;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets default administrator rights for adding the bot to channel chats; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDefaultChannelAdministratorRights extends Function<Ok> {
        /**
         * Default administrator rights for adding the bot to channels; pass null to remove default rights.
         */
        public ChatAdministratorRights defaultChannelAdministratorRights;

        /**
         * Default constructor for a function, which sets default administrator rights for adding the bot to channel chats; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDefaultChannelAdministratorRights() {
        }

        /**
         * Creates a function, which sets default administrator rights for adding the bot to channel chats; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param defaultChannelAdministratorRights Default administrator rights for adding the bot to channels; pass null to remove default rights.
         */
        public SetDefaultChannelAdministratorRights(ChatAdministratorRights defaultChannelAdministratorRights) {
            this.defaultChannelAdministratorRights = defaultChannelAdministratorRights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -234004967;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets default administrator rights for adding the bot to basic group and supergroup chats; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDefaultGroupAdministratorRights extends Function<Ok> {
        /**
         * Default administrator rights for adding the bot to basic group and supergroup chats; pass null to remove default rights.
         */
        public ChatAdministratorRights defaultGroupAdministratorRights;

        /**
         * Default constructor for a function, which sets default administrator rights for adding the bot to basic group and supergroup chats; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDefaultGroupAdministratorRights() {
        }

        /**
         * Creates a function, which sets default administrator rights for adding the bot to basic group and supergroup chats; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param defaultGroupAdministratorRights Default administrator rights for adding the bot to basic group and supergroup chats; pass null to remove default rights.
         */
        public SetDefaultGroupAdministratorRights(ChatAdministratorRights defaultGroupAdministratorRights) {
            this.defaultGroupAdministratorRights = defaultGroupAdministratorRights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1700231016;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the default message auto-delete time for new chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDefaultMessageAutoDeleteTime extends Function<Ok> {
        /**
         * New default message auto-delete time; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public MessageAutoDeleteTime messageAutoDeleteTime;

        /**
         * Default constructor for a function, which changes the default message auto-delete time for new chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDefaultMessageAutoDeleteTime() {
        }

        /**
         * Creates a function, which changes the default message auto-delete time for new chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param messageAutoDeleteTime New default message auto-delete time; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public SetDefaultMessageAutoDeleteTime(MessageAutoDeleteTime messageAutoDeleteTime) {
            this.messageAutoDeleteTime = messageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1772301460;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes type of default reaction for the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDefaultReactionType extends Function<Ok> {
        /**
         * New type of the default reaction.
         */
        public ReactionType reactionType;

        /**
         * Default constructor for a function, which changes type of default reaction for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDefaultReactionType() {
        }

        /**
         * Creates a function, which changes type of default reaction for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param reactionType New type of the default reaction.
         */
        public SetDefaultReactionType(ReactionType reactionType) {
            this.reactionType = reactionType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1694730813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the emoji status of the current user; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetEmojiStatus extends Function<Ok> {
        /**
         * New emoji status; pass null to switch to the default badge.
         */
        public EmojiStatus emojiStatus;

        /**
         * Default constructor for a function, which changes the emoji status of the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetEmojiStatus() {
        }

        /**
         * Creates a function, which changes the emoji status of the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param emojiStatus New emoji status; pass null to switch to the default badge.
         */
        public SetEmojiStatus(EmojiStatus emojiStatus) {
            this.emojiStatus = emojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1829224867;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib on a file generation progress.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetFileGenerationProgress extends Function<Ok> {
        /**
         * The identifier of the generation process.
         */
        public long generationId;
        /**
         * Expected size of the generated file, in bytes; 0 if unknown.
         */
        public long expectedSize;
        /**
         * The number of bytes already generated.
         */
        public long localPrefixSize;

        /**
         * Default constructor for a function, which informs TDLib on a file generation progress.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetFileGenerationProgress() {
        }

        /**
         * Creates a function, which informs TDLib on a file generation progress.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param generationId The identifier of the generation process.
         * @param expectedSize Expected size of the generated file, in bytes; 0 if unknown.
         * @param localPrefixSize The number of bytes already generated.
         */
        public SetFileGenerationProgress(long generationId, long expectedSize, long localPrefixSize) {
            this.generationId = generationId;
            this.expectedSize = expectedSize;
            this.localPrefixSize = localPrefixSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1836403518;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the notification settings of a forum topic.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetForumTopicNotificationSettings extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message thread identifier of the forum topic.
         */
        public long messageThreadId;
        /**
         * New notification settings for the forum topic. If the topic is muted for more than 366 days, it is considered to be muted forever.
         */
        public ChatNotificationSettings notificationSettings;

        /**
         * Default constructor for a function, which changes the notification settings of a forum topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetForumTopicNotificationSettings() {
        }

        /**
         * Creates a function, which changes the notification settings of a forum topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageThreadId Message thread identifier of the forum topic.
         * @param notificationSettings New notification settings for the forum topic. If the topic is muted for more than 366 days, it is considered to be muted forever.
         */
        public SetForumTopicNotificationSettings(long chatId, long messageThreadId, ChatNotificationSettings notificationSettings) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 524498023;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Updates the game score of the specified user in the game; for bots only.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class SetGameScore extends Function<Message> {
        /**
         * The chat to which the message with the game belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Pass true to edit the game message to include the current scoreboard.
         */
        public boolean editMessage;
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The new score.
         */
        public int score;
        /**
         * Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table.
         */
        public boolean force;

        /**
         * Default constructor for a function, which updates the game score of the specified user in the game; for bots only.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public SetGameScore() {
        }

        /**
         * Creates a function, which updates the game score of the specified user in the game; for bots only.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat to which the message with the game belongs.
         * @param messageId Identifier of the message.
         * @param editMessage Pass true to edit the game message to include the current scoreboard.
         * @param userId User identifier.
         * @param score The new score.
         * @param force Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table.
         */
        public SetGameScore(long chatId, long messageId, boolean editMessage, long userId, int score, boolean force) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.editMessage = editMessage;
            this.userId = userId;
            this.score = score;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2127359430;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that speaking state of a participant of an active group has changed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetGroupCallParticipantIsSpeaking extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Group call participant's synchronization audio source identifier, or 0 for the current user.
         */
        public int audioSource;
        /**
         * Pass true if the user is speaking.
         */
        public boolean isSpeaking;

        /**
         * Default constructor for a function, which informs TDLib that speaking state of a participant of an active group has changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetGroupCallParticipantIsSpeaking() {
        }

        /**
         * Creates a function, which informs TDLib that speaking state of a participant of an active group has changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param audioSource Group call participant's synchronization audio source identifier, or 0 for the current user.
         * @param isSpeaking Pass true if the user is speaking.
         */
        public SetGroupCallParticipantIsSpeaking(int groupCallId, int audioSource, boolean isSpeaking) {
            this.groupCallId = groupCallId;
            this.audioSource = audioSource;
            this.isSpeaking = isSpeaking;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 927506917;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes volume level of a participant of an active group call. If the current user can manage the group call, then the participant's volume level will be changed for all users with the default volume level.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetGroupCallParticipantVolumeLevel extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Participant identifier.
         */
        public MessageSender participantId;
        /**
         * New participant's volume level; 1-20000 in hundreds of percents.
         */
        public int volumeLevel;

        /**
         * Default constructor for a function, which changes volume level of a participant of an active group call. If the current user can manage the group call, then the participant's volume level will be changed for all users with the default volume level.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetGroupCallParticipantVolumeLevel() {
        }

        /**
         * Creates a function, which changes volume level of a participant of an active group call. If the current user can manage the group call, then the participant's volume level will be changed for all users with the default volume level.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param participantId Participant identifier.
         * @param volumeLevel New participant's volume level; 1-20000 in hundreds of percents.
         */
        public SetGroupCallParticipantVolumeLevel(int groupCallId, MessageSender participantId, int volumeLevel) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.volumeLevel = volumeLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1753769944;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets group call title. Requires groupCall.canBeManaged group call flag.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetGroupCallTitle extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * New group call title; 1-64 characters.
         */
        public String title;

        /**
         * Default constructor for a function, which sets group call title. Requires groupCall.canBeManaged group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetGroupCallTitle() {
        }

        /**
         * Creates a function, which sets group call title. Requires groupCall.canBeManaged group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param title New group call title; 1-64 characters.
         */
        public SetGroupCallTitle(int groupCallId, String title) {
            this.groupCallId = groupCallId;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1228825139;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the period of inactivity after which sessions will automatically be terminated.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetInactiveSessionTtl extends Function<Ok> {
        /**
         * New number of days of inactivity before sessions will be automatically terminated; 1-366 days.
         */
        public int inactiveSessionTtlDays;

        /**
         * Default constructor for a function, which changes the period of inactivity after which sessions will automatically be terminated.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetInactiveSessionTtl() {
        }

        /**
         * Creates a function, which changes the period of inactivity after which sessions will automatically be terminated.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inactiveSessionTtlDays New number of days of inactivity before sessions will be automatically terminated; 1-366 days.
         */
        public SetInactiveSessionTtl(int inactiveSessionTtlDays) {
            this.inactiveSessionTtlDays = inactiveSessionTtlDays;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1570548048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Updates the game score of the specified user in a game; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetInlineGameScore extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * Pass true to edit the game message to include the current scoreboard.
         */
        public boolean editMessage;
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The new score.
         */
        public int score;
        /**
         * Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table.
         */
        public boolean force;

        /**
         * Default constructor for a function, which updates the game score of the specified user in a game; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetInlineGameScore() {
        }

        /**
         * Creates a function, which updates the game score of the specified user in a game; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param editMessage Pass true to edit the game message to include the current scoreboard.
         * @param userId User identifier.
         * @param score The new score.
         * @param force Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table.
         */
        public SetInlineGameScore(String inlineMessageId, boolean editMessage, long userId, int score, boolean force) {
            this.inlineMessageId = inlineMessageId;
            this.editMessage = editMessage;
            this.userId = userId;
            this.score = score;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -948871797;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the location of the current user. Needs to be called if getOption(&quot;is_location_visible&quot;) is true and location changes for more than 1 kilometer. Must not be called if the user has a business location.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetLocation extends Function<Ok> {
        /**
         * The new location of the user.
         */
        public Location location;

        /**
         * Default constructor for a function, which changes the location of the current user. Needs to be called if getOption(&quot;is_location_visible&quot;) is true and location changes for more than 1 kilometer. Must not be called if the user has a business location.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetLocation() {
        }

        /**
         * Creates a function, which changes the location of the current user. Needs to be called if getOption(&quot;is_location_visible&quot;) is true and location changes for more than 1 kilometer. Must not be called if the user has a business location.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param location The new location of the user.
         */
        public SetLocation(Location location) {
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 93926257;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets new log stream for internal logging of TDLib. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetLogStream extends Function<Ok> {
        /**
         * New log stream.
         */
        public LogStream logStream;

        /**
         * Default constructor for a function, which sets new log stream for internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetLogStream() {
        }

        /**
         * Creates a function, which sets new log stream for internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param logStream New log stream.
         */
        public SetLogStream(LogStream logStream) {
            this.logStream = logStream;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1364199535;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the verbosity level for a specified TDLib internal log tag. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetLogTagVerbosityLevel extends Function<Ok> {
        /**
         * Logging tag to change verbosity level.
         */
        public String tag;
        /**
         * New verbosity level; 1-1024.
         */
        public int newVerbosityLevel;

        /**
         * Default constructor for a function, which sets the verbosity level for a specified TDLib internal log tag. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetLogTagVerbosityLevel() {
        }

        /**
         * Creates a function, which sets the verbosity level for a specified TDLib internal log tag. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param tag Logging tag to change verbosity level.
         * @param newVerbosityLevel New verbosity level; 1-1024.
         */
        public SetLogTagVerbosityLevel(String tag, int newVerbosityLevel) {
            this.tag = tag;
            this.newVerbosityLevel = newVerbosityLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2095589738;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the verbosity level of the internal logging of TDLib. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetLogVerbosityLevel extends Function<Ok> {
        /**
         * New value of the verbosity level for logging. Value 0 corresponds to fatal errors, value 1 corresponds to errors, value 2 corresponds to warnings and debug warnings, value 3 corresponds to informational, value 4 corresponds to debug, value 5 corresponds to verbose debug, value greater than 5 and up to 1023 can be used to enable even more logging.
         */
        public int newVerbosityLevel;

        /**
         * Default constructor for a function, which sets the verbosity level of the internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetLogVerbosityLevel() {
        }

        /**
         * Creates a function, which sets the verbosity level of the internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param newVerbosityLevel New value of the verbosity level for logging. Value 0 corresponds to fatal errors, value 1 corresponds to errors, value 2 corresponds to warnings and debug warnings, value 3 corresponds to informational, value 4 corresponds to debug, value 5 corresponds to verbose debug, value greater than 5 and up to 1023 can be used to enable even more logging.
         */
        public SetLogVerbosityLevel(int newVerbosityLevel) {
            this.newVerbosityLevel = newVerbosityLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -303429678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the login email address of the user. The email address can be changed only if the current user already has login email and passwordState.loginEmailAddressPattern is non-empty. The change will not be applied until the new login email address is confirmed with checkLoginEmailAddressCode. To use Apple ID/Google ID instead of an email address, call checkLoginEmailAddressCode directly.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class SetLoginEmailAddress extends Function<EmailAddressAuthenticationCodeInfo> {
        /**
         * New login email address.
         */
        public String newLoginEmailAddress;

        /**
         * Default constructor for a function, which changes the login email address of the user. The email address can be changed only if the current user already has login email and passwordState.loginEmailAddressPattern is non-empty. The change will not be applied until the new login email address is confirmed with checkLoginEmailAddressCode. To use Apple ID/Google ID instead of an email address, call checkLoginEmailAddressCode directly.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public SetLoginEmailAddress() {
        }

        /**
         * Creates a function, which changes the login email address of the user. The email address can be changed only if the current user already has login email and passwordState.loginEmailAddressPattern is non-empty. The change will not be applied until the new login email address is confirmed with checkLoginEmailAddressCode. To use Apple ID/Google ID instead of an email address, call checkLoginEmailAddressCode directly.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         *
         * @param newLoginEmailAddress New login email address.
         */
        public SetLoginEmailAddress(String newLoginEmailAddress) {
            this.newLoginEmailAddress = newLoginEmailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 935019476;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets menu button for the given user or for all users; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMenuButton extends Function<Ok> {
        /**
         * Identifier of the user or 0 to set menu button for all users.
         */
        public long userId;
        /**
         * New menu button.
         */
        public BotMenuButton menuButton;

        /**
         * Default constructor for a function, which sets menu button for the given user or for all users; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMenuButton() {
        }

        /**
         * Creates a function, which sets menu button for the given user or for all users; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user or 0 to set menu button for all users.
         * @param menuButton New menu button.
         */
        public SetMenuButton(long userId, BotMenuButton menuButton) {
            this.userId = userId;
            this.menuButton = menuButton;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1269841599;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the fact-check of a message. Can be only used if getOption(&quot;can_edit_fact_check&quot;) == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMessageFactCheck extends Function<Ok> {
        /**
         * The channel chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message. The message must be one of the following types: messageAnimation, messageAudio, messageDocument, messagePhoto, messageText, messageVideo.
         */
        public long messageId;
        /**
         * New text of the fact-check; 0-getOption(&quot;fact_check_length_max&quot;) characters; pass null to remove it. Only Bold, Italic, and TextUrl entities with https://t.me/ links are supported.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which changes the fact-check of a message. Can be only used if getOption(&quot;can_edit_fact_check&quot;) == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMessageFactCheck() {
        }

        /**
         * Creates a function, which changes the fact-check of a message. Can be only used if getOption(&quot;can_edit_fact_check&quot;) == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId The channel chat the message belongs to.
         * @param messageId Identifier of the message. The message must be one of the following types: messageAnimation, messageAudio, messageDocument, messagePhoto, messageText, messageVideo.
         * @param text New text of the fact-check; 0-getOption(&quot;fact_check_length_max&quot;) characters; pass null to remove it. Only Bold, Italic, and TextUrl entities with https://t.me/ links are supported.
         */
        public SetMessageFactCheck(long chatId, long messageId, FormattedText text) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -4309752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets reactions on a message; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMessageReactions extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Types of the reaction to set.
         */
        public ReactionType[] reactionTypes;
        /**
         * Pass true if the reactions are added with a big animation.
         */
        public boolean isBig;

        /**
         * Default constructor for a function, which sets reactions on a message; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMessageReactions() {
        }

        /**
         * Creates a function, which sets reactions on a message; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param reactionTypes Types of the reaction to set.
         * @param isBig Pass true if the reactions are added with a big animation.
         */
        public SetMessageReactions(long chatId, long messageId, ReactionType[] reactionTypes, boolean isBig) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.reactionTypes = reactionTypes;
            this.isBig = isBig;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -372524900;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the block list of a message sender. Currently, only users and supergroup chats can be blocked.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMessageSenderBlockList extends Function<Ok> {
        /**
         * Identifier of a message sender to block/unblock.
         */
        public MessageSender senderId;
        /**
         * New block list for the message sender; pass null to unblock the message sender.
         */
        public BlockList blockList;

        /**
         * Default constructor for a function, which changes the block list of a message sender. Currently, only users and supergroup chats can be blocked.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMessageSenderBlockList() {
        }

        /**
         * Creates a function, which changes the block list of a message sender. Currently, only users and supergroup chats can be blocked.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param senderId Identifier of a message sender to block/unblock.
         * @param blockList New block list for the message sender; pass null to unblock the message sender.
         */
        public SetMessageSenderBlockList(MessageSender senderId, BlockList blockList) {
            this.senderId = senderId;
            this.blockList = blockList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1987355503;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the first and last name of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetName extends Function<Ok> {
        /**
         * The new value of the first name for the current user; 1-64 characters.
         */
        public String firstName;
        /**
         * The new value of the optional last name for the current user; 0-64 characters.
         */
        public String lastName;

        /**
         * Default constructor for a function, which changes the first and last name of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetName() {
        }

        /**
         * Creates a function, which changes the first and last name of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param firstName The new value of the first name for the current user; 1-64 characters.
         * @param lastName The new value of the optional last name for the current user; 0-64 characters.
         */
        public SetName(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1711693584;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it must be called whenever the network is changed, even if the network type remains the same. Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetNetworkType extends Function<Ok> {
        /**
         * The new network type; pass null to set network type to networkTypeOther.
         */
        public NetworkType type;

        /**
         * Default constructor for a function, which sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it must be called whenever the network is changed, even if the network type remains the same. Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetNetworkType() {
        }

        /**
         * Creates a function, which sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it must be called whenever the network is changed, even if the network type remains the same. Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param type The new network type; pass null to set network type to networkTypeOther.
         */
        public SetNetworkType(NetworkType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -701635234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes privacy settings for new chat creation; can be used only if getOption(&quot;can_set_new_chat_privacy_settings&quot;).
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetNewChatPrivacySettings extends Function<Ok> {
        /**
         * New settings.
         */
        public NewChatPrivacySettings settings;

        /**
         * Default constructor for a function, which changes privacy settings for new chat creation; can be used only if getOption(&quot;can_set_new_chat_privacy_settings&quot;).
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetNewChatPrivacySettings() {
        }

        /**
         * Creates a function, which changes privacy settings for new chat creation; can be used only if getOption(&quot;can_set_new_chat_privacy_settings&quot;).
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings New settings.
         */
        public SetNewChatPrivacySettings(NewChatPrivacySettings settings) {
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1774139215;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetOption extends Function<Ok> {
        /**
         * The name of the option.
         */
        public String name;
        /**
         * The new value of the option; pass null to reset option value to a default value.
         */
        public OptionValue value;

        /**
         * Default constructor for a function, which sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetOption() {
        }

        /**
         * Creates a function, which sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name The name of the option.
         * @param value The new value of the option; pass null to reset option value to a default value.
         */
        public SetOption(String name, OptionValue value) {
            this.name = name;
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2114670322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds an element to the user's Telegram Passport. May return an error with a message &quot;PHONE_VERIFICATION_NEEDED&quot; or &quot;EMAIL_VERIFICATION_NEEDED&quot; if the chosen phone number or the chosen email address must be verified first.
     *
     * <p> Returns {@link PassportElement PassportElement} </p>
     */
    public static class SetPassportElement extends Function<PassportElement> {
        /**
         * Input Telegram Passport element.
         */
        public InputPassportElement element;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which adds an element to the user's Telegram Passport. May return an error with a message &quot;PHONE_VERIFICATION_NEEDED&quot; or &quot;EMAIL_VERIFICATION_NEEDED&quot; if the chosen phone number or the chosen email address must be verified first.
         *
         * <p> Returns {@link PassportElement PassportElement} </p>
         */
        public SetPassportElement() {
        }

        /**
         * Creates a function, which adds an element to the user's Telegram Passport. May return an error with a message &quot;PHONE_VERIFICATION_NEEDED&quot; or &quot;EMAIL_VERIFICATION_NEEDED&quot; if the chosen phone number or the chosen email address must be verified first.
         *
         * <p> Returns {@link PassportElement PassportElement} </p>
         *
         * @param element Input Telegram Passport element.
         * @param password The 2-step verification password of the current user.
         */
        public SetPassportElement(InputPassportElement element, String password) {
            this.element = element;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2068173212;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs the user that some of the elements in their Telegram Passport contain errors; for bots only. The user will not be able to resend the elements, until the errors are fixed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPassportElementErrors extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The errors.
         */
        public InputPassportElementError[] errors;

        /**
         * Default constructor for a function, which informs the user that some of the elements in their Telegram Passport contain errors; for bots only. The user will not be able to resend the elements, until the errors are fixed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPassportElementErrors() {
        }

        /**
         * Creates a function, which informs the user that some of the elements in their Telegram Passport contain errors; for bots only. The user will not be able to resend the elements, until the errors are fixed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param errors The errors.
         */
        public SetPassportElementErrors(long userId, InputPassportElementError[] errors) {
            this.userId = userId;
            this.errors = errors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2056754881;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the 2-step verification password for the current user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class SetPassword extends Function<PasswordState> {
        /**
         * Previous 2-step verification password of the user.
         */
        public String oldPassword;
        /**
         * New 2-step verification password of the user; may be empty to remove the password.
         */
        public String newPassword;
        /**
         * New password hint; may be empty.
         */
        public String newHint;
        /**
         * Pass true to change also the recovery email address.
         */
        public boolean setRecoveryEmailAddress;
        /**
         * New recovery email address; may be empty.
         */
        public String newRecoveryEmailAddress;

        /**
         * Default constructor for a function, which changes the 2-step verification password for the current user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public SetPassword() {
        }

        /**
         * Creates a function, which changes the 2-step verification password for the current user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         *
         * @param oldPassword Previous 2-step verification password of the user.
         * @param newPassword New 2-step verification password of the user; may be empty to remove the password.
         * @param newHint New password hint; may be empty.
         * @param setRecoveryEmailAddress Pass true to change also the recovery email address.
         * @param newRecoveryEmailAddress New recovery email address; may be empty.
         */
        public SetPassword(String oldPassword, String newPassword, String newHint, boolean setRecoveryEmailAddress, String newRecoveryEmailAddress) {
            this.oldPassword = oldPassword;
            this.newPassword = newPassword;
            this.newHint = newHint;
            this.setRecoveryEmailAddress = setRecoveryEmailAddress;
            this.newRecoveryEmailAddress = newRecoveryEmailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1193589027;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the personal chat of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPersonalChat extends Function<Ok> {
        /**
         * Identifier of the new personal chat; pass 0 to remove the chat. Use getSuitablePersonalChats to get suitable chats.
         */
        public long chatId;

        /**
         * Default constructor for a function, which changes the personal chat of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPersonalChat() {
        }

        /**
         * Creates a function, which changes the personal chat of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the new personal chat; pass 0 to remove the chat. Use getSuitablePersonalChats to get suitable chats.
         */
        public SetPersonalChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1068782668;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of pinned chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPinnedChats extends Function<Ok> {
        /**
         * Chat list in which to change the order of pinned chats.
         */
        public ChatList chatList;
        /**
         * The new list of pinned chats.
         */
        public long[] chatIds;

        /**
         * Default constructor for a function, which changes the order of pinned chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPinnedChats() {
        }

        /**
         * Creates a function, which changes the order of pinned chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatList Chat list in which to change the order of pinned chats.
         * @param chatIds The new list of pinned chats.
         */
        public SetPinnedChats(ChatList chatList, long[] chatIds) {
            this.chatList = chatList;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -695640000;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of pinned forum topics; requires canManageTopics right in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPinnedForumTopics extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new list of pinned forum topics.
         */
        public long[] messageThreadIds;

        /**
         * Default constructor for a function, which changes the order of pinned forum topics; requires canManageTopics right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPinnedForumTopics() {
        }

        /**
         * Creates a function, which changes the order of pinned forum topics; requires canManageTopics right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageThreadIds The new list of pinned forum topics.
         */
        public SetPinnedForumTopics(long chatId, long[] messageThreadIds) {
            this.chatId = chatId;
            this.messageThreadIds = messageThreadIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -475084011;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of pinned Saved Messages topics.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPinnedSavedMessagesTopics extends Function<Ok> {
        /**
         * Identifiers of the new pinned Saved Messages topics.
         */
        public long[] savedMessagesTopicIds;

        /**
         * Default constructor for a function, which changes the order of pinned Saved Messages topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPinnedSavedMessagesTopics() {
        }

        /**
         * Creates a function, which changes the order of pinned Saved Messages topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param savedMessagesTopicIds Identifiers of the new pinned Saved Messages topics.
         */
        public SetPinnedSavedMessagesTopics(long[] savedMessagesTopicIds) {
            this.savedMessagesTopicIds = savedMessagesTopicIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -194818924;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the user answer to a poll. A poll in quiz mode can be answered only once.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPollAnswer extends Function<Ok> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll.
         */
        public long messageId;
        /**
         * 0-based identifiers of answer options, chosen by the user. User can choose more than 1 answer option only is the poll allows multiple answers.
         */
        public int[] optionIds;

        /**
         * Default constructor for a function, which changes the user answer to a poll. A poll in quiz mode can be answered only once.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPollAnswer() {
        }

        /**
         * Creates a function, which changes the user answer to a poll. A poll in quiz mode can be answered only once.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll.
         * @param optionIds 0-based identifiers of answer options, chosen by the user. User can choose more than 1 answer option only is the poll allows multiple answers.
         */
        public SetPollAnswer(long chatId, long messageId, int[] optionIds) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.optionIds = optionIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1399388792;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes accent color and background custom emoji for profile of the current user; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetProfileAccentColor extends Function<Ok> {
        /**
         * Identifier of the accent color to use for profile; pass -1 if none.
         */
        public int profileAccentColorId;
        /**
         * Identifier of a custom emoji to be shown on the user's profile photo background; 0 if none.
         */
        public long profileBackgroundCustomEmojiId;

        /**
         * Default constructor for a function, which changes accent color and background custom emoji for profile of the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetProfileAccentColor() {
        }

        /**
         * Creates a function, which changes accent color and background custom emoji for profile of the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param profileAccentColorId Identifier of the accent color to use for profile; pass -1 if none.
         * @param profileBackgroundCustomEmojiId Identifier of a custom emoji to be shown on the user's profile photo background; 0 if none.
         */
        public SetProfileAccentColor(int profileAccentColorId, long profileBackgroundCustomEmojiId) {
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1986281112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a profile photo for the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetProfilePhoto extends Function<Ok> {
        /**
         * Profile photo to set.
         */
        public InputChatPhoto photo;
        /**
         * Pass true to set a public photo, which will be visible even the main photo is hidden by privacy settings.
         */
        public boolean isPublic;

        /**
         * Default constructor for a function, which changes a profile photo for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetProfilePhoto() {
        }

        /**
         * Creates a function, which changes a profile photo for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param photo Profile photo to set.
         * @param isPublic Pass true to set a public photo, which will be visible even the main photo is hidden by privacy settings.
         */
        public SetProfilePhoto(InputChatPhoto photo, boolean isPublic) {
            this.photo = photo;
            this.isPublic = isPublic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2048260627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes name of a quick reply shortcut.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetQuickReplyShortcutName extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut.
         */
        public int shortcutId;
        /**
         * New name for the shortcut. Use checkQuickReplyShortcutName to check its validness.
         */
        public String name;

        /**
         * Default constructor for a function, which changes name of a quick reply shortcut.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetQuickReplyShortcutName() {
        }

        /**
         * Creates a function, which changes name of a quick reply shortcut.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut.
         * @param name New name for the shortcut. Use checkQuickReplyShortcutName to check its validness.
         */
        public SetQuickReplyShortcutName(int shortcutId, String name) {
            this.shortcutId = shortcutId;
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 186709105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes notification settings for reactions.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetReactionNotificationSettings extends Function<Ok> {
        /**
         * The new notification settings for reactions.
         */
        public ReactionNotificationSettings notificationSettings;

        /**
         * Default constructor for a function, which changes notification settings for reactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetReactionNotificationSettings() {
        }

        /**
         * Creates a function, which changes notification settings for reactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param notificationSettings The new notification settings for reactions.
         */
        public SetReactionNotificationSettings(ReactionNotificationSettings notificationSettings) {
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1186124949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes privacy settings for message read date.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetReadDatePrivacySettings extends Function<Ok> {
        /**
         * New settings.
         */
        public ReadDatePrivacySettings settings;

        /**
         * Default constructor for a function, which changes privacy settings for message read date.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetReadDatePrivacySettings() {
        }

        /**
         * Creates a function, which changes privacy settings for message read date.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings New settings.
         */
        public SetReadDatePrivacySettings(ReadDatePrivacySettings settings) {
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 493913782;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the 2-step verification recovery email address of the user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed. If newRecoveryEmailAddress is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class SetRecoveryEmailAddress extends Function<PasswordState> {
        /**
         * The 2-step verification password of the current user.
         */
        public String password;
        /**
         * New recovery email address.
         */
        public String newRecoveryEmailAddress;

        /**
         * Default constructor for a function, which changes the 2-step verification recovery email address of the user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed. If newRecoveryEmailAddress is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public SetRecoveryEmailAddress() {
        }

        /**
         * Creates a function, which changes the 2-step verification recovery email address of the user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed. If newRecoveryEmailAddress is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         *
         * @param password The 2-step verification password of the current user.
         * @param newRecoveryEmailAddress New recovery email address.
         */
        public SetRecoveryEmailAddress(String password, String newRecoveryEmailAddress) {
            this.password = password;
            this.newRecoveryEmailAddress = newRecoveryEmailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1981836385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes label of a Saved Messages tag; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSavedMessagesTagLabel extends Function<Ok> {
        /**
         * The tag which label will be changed.
         */
        public ReactionType tag;
        /**
         * New label for the tag; 0-12 characters.
         */
        public String label;

        /**
         * Default constructor for a function, which changes label of a Saved Messages tag; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSavedMessagesTagLabel() {
        }

        /**
         * Creates a function, which changes label of a Saved Messages tag; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param tag The tag which label will be changed.
         * @param label New label for the tag; 0-12 characters.
         */
        public SetSavedMessagesTagLabel(ReactionType tag, String label) {
            this.tag = tag;
            this.label = label;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1338323696;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes notification settings for chats of a given type.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetScopeNotificationSettings extends Function<Ok> {
        /**
         * Types of chats for which to change the notification settings.
         */
        public NotificationSettingsScope scope;
        /**
         * The new notification settings for the given scope.
         */
        public ScopeNotificationSettings notificationSettings;

        /**
         * Default constructor for a function, which changes notification settings for chats of a given type.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetScopeNotificationSettings() {
        }

        /**
         * Creates a function, which changes notification settings for chats of a given type.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param scope Types of chats for which to change the notification settings.
         * @param notificationSettings The new notification settings for the given scope.
         */
        public SetScopeNotificationSettings(NotificationSettingsScope scope, ScopeNotificationSettings notificationSettings) {
            this.scope = scope;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2049984966;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of emojis corresponding to a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerEmojis extends Function<Ok> {
        /**
         * Sticker.
         */
        public InputFile sticker;
        /**
         * New string with 1-20 emoji corresponding to the sticker.
         */
        public String emojis;

        /**
         * Default constructor for a function, which changes the list of emojis corresponding to a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerEmojis() {
        }

        /**
         * Creates a function, which changes the list of emojis corresponding to a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker.
         * @param emojis New string with 1-20 emoji corresponding to the sticker.
         */
        public SetStickerEmojis(InputFile sticker, String emojis) {
            this.sticker = sticker;
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -638843855;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of keywords of a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerKeywords extends Function<Ok> {
        /**
         * Sticker.
         */
        public InputFile sticker;
        /**
         * List of up to 20 keywords with total length up to 64 characters, which can be used to find the sticker.
         */
        public String[] keywords;

        /**
         * Default constructor for a function, which changes the list of keywords of a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerKeywords() {
        }

        /**
         * Creates a function, which changes the list of keywords of a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker.
         * @param keywords List of up to 20 keywords with total length up to 64 characters, which can be used to find the sticker.
         */
        public SetStickerKeywords(InputFile sticker, String[] keywords) {
            this.sticker = sticker;
            this.keywords = keywords;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 137223565;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the mask position of a mask sticker. The sticker must belong to a mask sticker set that is owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerMaskPosition extends Function<Ok> {
        /**
         * Sticker.
         */
        public InputFile sticker;
        /**
         * Position where the mask is placed; pass null to remove mask position.
         */
        public MaskPosition maskPosition;

        /**
         * Default constructor for a function, which changes the mask position of a mask sticker. The sticker must belong to a mask sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerMaskPosition() {
        }

        /**
         * Creates a function, which changes the mask position of a mask sticker. The sticker must belong to a mask sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker.
         * @param maskPosition Position where the mask is placed; pass null to remove mask position.
         */
        public SetStickerMaskPosition(InputFile sticker, MaskPosition maskPosition) {
            this.sticker = sticker;
            this.maskPosition = maskPosition;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1202280912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the position of a sticker in the set to which it belongs. The sticker set must be owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerPositionInSet extends Function<Ok> {
        /**
         * Sticker.
         */
        public InputFile sticker;
        /**
         * New position of the sticker in the set, 0-based.
         */
        public int position;

        /**
         * Default constructor for a function, which changes the position of a sticker in the set to which it belongs. The sticker set must be owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerPositionInSet() {
        }

        /**
         * Creates a function, which changes the position of a sticker in the set to which it belongs. The sticker set must be owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker.
         * @param position New position of the sticker in the set, 0-based.
         */
        public SetStickerPositionInSet(InputFile sticker, int position) {
            this.sticker = sticker;
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2075281185;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets a sticker set thumbnail.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerSetThumbnail extends Function<Ok> {
        /**
         * Sticker set owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;
        /**
         * Thumbnail to set; pass null to remove the sticker set thumbnail.
         */
        public InputFile thumbnail;
        /**
         * Format of the thumbnail; pass null if thumbnail is removed.
         */
        public StickerFormat format;

        /**
         * Default constructor for a function, which sets a sticker set thumbnail.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerSetThumbnail() {
        }

        /**
         * Creates a function, which sets a sticker set thumbnail.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Sticker set owner; ignored for regular users.
         * @param name Sticker set name. The sticker set must be owned by the current user.
         * @param thumbnail Thumbnail to set; pass null to remove the sticker set thumbnail.
         * @param format Format of the thumbnail; pass null if thumbnail is removed.
         */
        public SetStickerSetThumbnail(long userId, String name, InputFile thumbnail, StickerFormat format) {
            this.userId = userId;
            this.name = name;
            this.thumbnail = thumbnail;
            this.format = format;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1677617458;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets a sticker set title.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerSetTitle extends Function<Ok> {
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;
        /**
         * New sticker set title.
         */
        public String title;

        /**
         * Default constructor for a function, which sets a sticker set title.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerSetTitle() {
        }

        /**
         * Creates a function, which sets a sticker set title.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Sticker set name. The sticker set must be owned by the current user.
         * @param title New sticker set title.
         */
        public SetStickerSetTitle(String name, String title) {
            this.name = name;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1693004706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes privacy settings of a story. The method can be called only for stories posted on behalf of the current user and if story.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStoryPrivacySettings extends Function<Ok> {
        /**
         * Identifier of the story.
         */
        public int storyId;
        /**
         * The new privacy settigs for the story.
         */
        public StoryPrivacySettings privacySettings;

        /**
         * Default constructor for a function, which changes privacy settings of a story. The method can be called only for stories posted on behalf of the current user and if story.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStoryPrivacySettings() {
        }

        /**
         * Creates a function, which changes privacy settings of a story. The method can be called only for stories posted on behalf of the current user and if story.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyId Identifier of the story.
         * @param privacySettings The new privacy settigs for the story.
         */
        public SetStoryPrivacySettings(int storyId, StoryPrivacySettings privacySettings) {
            this.storyId = storyId;
            this.privacySettings = privacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -655801550;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes chosen reaction on a story that has already been sent.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStoryReaction extends Function<Ok> {
        /**
         * The identifier of the sender of the story.
         */
        public long storySenderChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;
        /**
         * Type of the reaction to set; pass null to remove the reaction. `reactionTypeCustomEmoji` reactions can be used only by Telegram Premium users.
         */
        public ReactionType reactionType;
        /**
         * Pass true if the reaction needs to be added to recent reactions.
         */
        public boolean updateRecentReactions;

        /**
         * Default constructor for a function, which changes chosen reaction on a story that has already been sent.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStoryReaction() {
        }

        /**
         * Creates a function, which changes chosen reaction on a story that has already been sent.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storySenderChatId The identifier of the sender of the story.
         * @param storyId The identifier of the story.
         * @param reactionType Type of the reaction to set; pass null to remove the reaction. `reactionTypeCustomEmoji` reactions can be used only by Telegram Premium users.
         * @param updateRecentReactions Pass true if the reaction needs to be added to recent reactions.
         */
        public SetStoryReaction(long storySenderChatId, int storyId, ReactionType reactionType, boolean updateRecentReactions) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
            this.reactionType = reactionType;
            this.updateRecentReactions = updateRecentReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1400156249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the custom emoji sticker set of a supergroup; requires canChangeInfo administrator right. The chat must have at least chatBoostFeatures.minCustomEmojiStickerSetBoostLevel boost level to pass the corresponding color.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupCustomEmojiStickerSet extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of the custom emoji sticker set identifier for the supergroup. Use 0 to remove the custom emoji sticker set in the supergroup.
         */
        public long customEmojiStickerSetId;

        /**
         * Default constructor for a function, which changes the custom emoji sticker set of a supergroup; requires canChangeInfo administrator right. The chat must have at least chatBoostFeatures.minCustomEmojiStickerSetBoostLevel boost level to pass the corresponding color.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupCustomEmojiStickerSet() {
        }

        /**
         * Creates a function, which changes the custom emoji sticker set of a supergroup; requires canChangeInfo administrator right. The chat must have at least chatBoostFeatures.minCustomEmojiStickerSetBoostLevel boost level to pass the corresponding color.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param customEmojiStickerSetId New value of the custom emoji sticker set identifier for the supergroup. Use 0 to remove the custom emoji sticker set in the supergroup.
         */
        public SetSupergroupCustomEmojiStickerSet(long supergroupId, long customEmojiStickerSetId) {
            this.supergroupId = supergroupId;
            this.customEmojiStickerSetId = customEmojiStickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1328894639;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the sticker set of a supergroup; requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupStickerSet extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of the supergroup sticker set identifier. Use 0 to remove the supergroup sticker set.
         */
        public long stickerSetId;

        /**
         * Default constructor for a function, which changes the sticker set of a supergroup; requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupStickerSet() {
        }

        /**
         * Creates a function, which changes the sticker set of a supergroup; requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param stickerSetId New value of the supergroup sticker set identifier. Use 0 to remove the supergroup sticker set.
         */
        public SetSupergroupStickerSet(long supergroupId, long stickerSetId) {
            this.supergroupId = supergroupId;
            this.stickerSetId = stickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2056344215;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupUnrestrictBoostCount extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of the unrestrictBoostCount supergroup setting; 0-8. Use 0 to remove the setting.
         */
        public int unrestrictBoostCount;

        /**
         * Default constructor for a function, which changes the number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupUnrestrictBoostCount() {
        }

        /**
         * Creates a function, which changes the number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param unrestrictBoostCount New value of the unrestrictBoostCount supergroup setting; 0-8. Use 0 to remove the setting.
         */
        public SetSupergroupUnrestrictBoostCount(long supergroupId, int unrestrictBoostCount) {
            this.supergroupId = supergroupId;
            this.unrestrictBoostCount = unrestrictBoostCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 969814179;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the editable username of a supergroup or channel, requires owner privileges in the supergroup or channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupUsername extends Function<Ok> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * New value of the username. Use an empty string to remove the username. The username can't be completely removed if there is another active or disabled username.
         */
        public String username;

        /**
         * Default constructor for a function, which changes the editable username of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupUsername() {
        }

        /**
         * Creates a function, which changes the editable username of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param username New value of the username. Use an empty string to remove the username. The username can't be completely removed if there is another active or disabled username.
         */
        public SetSupergroupUsername(long supergroupId, String username) {
            this.supergroupId = supergroupId;
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1346325252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetTdlibParameters extends Function<Ok> {
        /**
         * Pass true to use Telegram test environment instead of the production environment.
         */
        public boolean useTestDc;
        /**
         * The path to the directory for the persistent database; if empty, the current working directory will be used.
         */
        public String databaseDirectory;
        /**
         * The path to the directory for storing files; if empty, databaseDirectory will be used.
         */
        public String filesDirectory;
        /**
         * Encryption key for the database. If the encryption key is invalid, then an error with code 401 will be returned.
         */
        public byte[] databaseEncryptionKey;
        /**
         * Pass true to keep information about downloaded and uploaded files between application restarts.
         */
        public boolean useFileDatabase;
        /**
         * Pass true to keep cache of users, basic groups, supergroups, channels and secret chats between restarts. Implies useFileDatabase.
         */
        public boolean useChatInfoDatabase;
        /**
         * Pass true to keep cache of chats and messages between restarts. Implies useChatInfoDatabase.
         */
        public boolean useMessageDatabase;
        /**
         * Pass true to enable support for secret chats.
         */
        public boolean useSecretChats;
        /**
         * Application identifier for Telegram API access, which can be obtained at https://my.telegram.org.
         */
        public int apiId;
        /**
         * Application identifier hash for Telegram API access, which can be obtained at https://my.telegram.org.
         */
        public String apiHash;
        /**
         * IETF language tag of the user's operating system language; must be non-empty.
         */
        public String systemLanguageCode;
        /**
         * Model of the device the application is being run on; must be non-empty.
         */
        public String deviceModel;
        /**
         * Version of the operating system the application is being run on. If empty, the version is automatically detected by TDLib.
         */
        public String systemVersion;
        /**
         * Application version; must be non-empty.
         */
        public String applicationVersion;

        /**
         * Default constructor for a function, which sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetTdlibParameters() {
        }

        /**
         * Creates a function, which sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param useTestDc Pass true to use Telegram test environment instead of the production environment.
         * @param databaseDirectory The path to the directory for the persistent database; if empty, the current working directory will be used.
         * @param filesDirectory The path to the directory for storing files; if empty, databaseDirectory will be used.
         * @param databaseEncryptionKey Encryption key for the database. If the encryption key is invalid, then an error with code 401 will be returned.
         * @param useFileDatabase Pass true to keep information about downloaded and uploaded files between application restarts.
         * @param useChatInfoDatabase Pass true to keep cache of users, basic groups, supergroups, channels and secret chats between restarts. Implies useFileDatabase.
         * @param useMessageDatabase Pass true to keep cache of chats and messages between restarts. Implies useChatInfoDatabase.
         * @param useSecretChats Pass true to enable support for secret chats.
         * @param apiId Application identifier for Telegram API access, which can be obtained at https://my.telegram.org.
         * @param apiHash Application identifier hash for Telegram API access, which can be obtained at https://my.telegram.org.
         * @param systemLanguageCode IETF language tag of the user's operating system language; must be non-empty.
         * @param deviceModel Model of the device the application is being run on; must be non-empty.
         * @param systemVersion Version of the operating system the application is being run on. If empty, the version is automatically detected by TDLib.
         * @param applicationVersion Application version; must be non-empty.
         */
        public SetTdlibParameters(boolean useTestDc, String databaseDirectory, String filesDirectory, byte[] databaseEncryptionKey, boolean useFileDatabase, boolean useChatInfoDatabase, boolean useMessageDatabase, boolean useSecretChats, int apiId, String apiHash, String systemLanguageCode, String deviceModel, String systemVersion, String applicationVersion) {
            this.useTestDc = useTestDc;
            this.databaseDirectory = databaseDirectory;
            this.filesDirectory = filesDirectory;
            this.databaseEncryptionKey = databaseEncryptionKey;
            this.useFileDatabase = useFileDatabase;
            this.useChatInfoDatabase = useChatInfoDatabase;
            this.useMessageDatabase = useMessageDatabase;
            this.useSecretChats = useSecretChats;
            this.apiId = apiId;
            this.apiHash = apiHash;
            this.systemLanguageCode = systemLanguageCode;
            this.deviceModel = deviceModel;
            this.systemVersion = systemVersion;
            this.applicationVersion = applicationVersion;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -775883218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a personal profile photo of a contact user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUserPersonalProfilePhoto extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Profile photo to set; pass null to delete the photo; inputChatPhotoPrevious isn't supported in this function.
         */
        public InputChatPhoto photo;

        /**
         * Default constructor for a function, which changes a personal profile photo of a contact user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUserPersonalProfilePhoto() {
        }

        /**
         * Creates a function, which changes a personal profile photo of a contact user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param photo Profile photo to set; pass null to delete the photo; inputChatPhotoPrevious isn't supported in this function.
         */
        public SetUserPersonalProfilePhoto(long userId, InputChatPhoto photo) {
            this.userId = userId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 464136438;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes user privacy settings.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUserPrivacySettingRules extends Function<Ok> {
        /**
         * The privacy setting.
         */
        public UserPrivacySetting setting;
        /**
         * The new privacy rules.
         */
        public UserPrivacySettingRules rules;

        /**
         * Default constructor for a function, which changes user privacy settings.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUserPrivacySettingRules() {
        }

        /**
         * Creates a function, which changes user privacy settings.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param setting The privacy setting.
         * @param rules The new privacy rules.
         */
        public SetUserPrivacySettingRules(UserPrivacySetting setting, UserPrivacySettingRules rules) {
            this.setting = setting;
            this.rules = rules;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -473812741;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets support information for the given user; for Telegram support only.
     *
     * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
     */
    public static class SetUserSupportInfo extends Function<UserSupportInfo> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * New information message.
         */
        public FormattedText message;

        /**
         * Default constructor for a function, which sets support information for the given user; for Telegram support only.
         *
         * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
         */
        public SetUserSupportInfo() {
        }

        /**
         * Creates a function, which sets support information for the given user; for Telegram support only.
         *
         * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
         *
         * @param userId User identifier.
         * @param message New information message.
         */
        public SetUserSupportInfo(long userId, FormattedText message) {
            this.userId = userId;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2088986621;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the editable username of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUsername extends Function<Ok> {
        /**
         * The new value of the username. Use an empty string to remove the username. The username can't be completely removed if there is another active or disabled username.
         */
        public String username;

        /**
         * Default constructor for a function, which changes the editable username of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUsername() {
        }

        /**
         * Creates a function, which changes the editable username of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param username The new value of the username. Use an empty string to remove the username. The username can't be completely removed if there is another active or disabled username.
         */
        public SetUsername(String username) {
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 439901214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes default participant identifier, on whose behalf a video chat in the chat will be joined.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetVideoChatDefaultParticipant extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Default group call participant identifier to join the video chats.
         */
        public MessageSender defaultParticipantId;

        /**
         * Default constructor for a function, which changes default participant identifier, on whose behalf a video chat in the chat will be joined.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetVideoChatDefaultParticipant() {
        }

        /**
         * Creates a function, which changes default participant identifier, on whose behalf a video chat in the chat will be joined.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param defaultParticipantId Default group call participant identifier to join the video chats.
         */
        public SetVideoChatDefaultParticipant(long chatId, MessageSender defaultParticipantId) {
            this.chatId = chatId;
            this.defaultParticipantId = defaultParticipantId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -240749901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Shares a chat after pressing a keyboardButtonTypeRequestChat button with the bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ShareChatWithBot extends Function<Ok> {
        /**
         * Identifier of the chat with the bot.
         */
        public long chatId;
        /**
         * Identifier of the message with the button.
         */
        public long messageId;
        /**
         * Identifier of the button.
         */
        public int buttonId;
        /**
         * Identifier of the shared chat.
         */
        public long sharedChatId;
        /**
         * Pass true to check that the chat can be shared by the button instead of actually sharing it. Doesn't check botIsMember and botAdministratorRights restrictions. If the bot must be a member, then all chats from getGroupsInCommon and all chats, where the user can add the bot, are suitable. In the latter case the bot will be automatically added to the chat. If the bot must be an administrator, then all chats, where the bot already has requested rights or can be added to administrators by the user, are suitable. In the latter case the bot will be automatically granted requested rights.
         */
        public boolean onlyCheck;

        /**
         * Default constructor for a function, which shares a chat after pressing a keyboardButtonTypeRequestChat button with the bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ShareChatWithBot() {
        }

        /**
         * Creates a function, which shares a chat after pressing a keyboardButtonTypeRequestChat button with the bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat with the bot.
         * @param messageId Identifier of the message with the button.
         * @param buttonId Identifier of the button.
         * @param sharedChatId Identifier of the shared chat.
         * @param onlyCheck Pass true to check that the chat can be shared by the button instead of actually sharing it. Doesn't check botIsMember and botAdministratorRights restrictions. If the bot must be a member, then all chats from getGroupsInCommon and all chats, where the user can add the bot, are suitable. In the latter case the bot will be automatically added to the chat. If the bot must be an administrator, then all chats, where the bot already has requested rights or can be added to administrators by the user, are suitable. In the latter case the bot will be automatically granted requested rights.
         */
        public ShareChatWithBot(long chatId, long messageId, int buttonId, long sharedChatId, boolean onlyCheck) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.buttonId = buttonId;
            this.sharedChatId = sharedChatId;
            this.onlyCheck = onlyCheck;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1504507166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Shares the phone number of the current user with a mutual contact. Supposed to be called when the user clicks on chatActionBarSharePhoneNumber.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SharePhoneNumber extends Function<Ok> {
        /**
         * Identifier of the user with whom to share the phone number. The user must be a mutual contact.
         */
        public long userId;

        /**
         * Default constructor for a function, which shares the phone number of the current user with a mutual contact. Supposed to be called when the user clicks on chatActionBarSharePhoneNumber.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SharePhoneNumber() {
        }

        /**
         * Creates a function, which shares the phone number of the current user with a mutual contact. Supposed to be called when the user clicks on chatActionBarSharePhoneNumber.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user with whom to share the phone number. The user must be a mutual contact.
         */
        public SharePhoneNumber(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1097130069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Shares users after pressing a keyboardButtonTypeRequestUsers button with the bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ShareUsersWithBot extends Function<Ok> {
        /**
         * Identifier of the chat with the bot.
         */
        public long chatId;
        /**
         * Identifier of the message with the button.
         */
        public long messageId;
        /**
         * Identifier of the button.
         */
        public int buttonId;
        /**
         * Identifiers of the shared users.
         */
        public long[] sharedUserIds;
        /**
         * Pass true to check that the users can be shared by the button instead of actually sharing them.
         */
        public boolean onlyCheck;

        /**
         * Default constructor for a function, which shares users after pressing a keyboardButtonTypeRequestUsers button with the bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ShareUsersWithBot() {
        }

        /**
         * Creates a function, which shares users after pressing a keyboardButtonTypeRequestUsers button with the bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat with the bot.
         * @param messageId Identifier of the message with the button.
         * @param buttonId Identifier of the button.
         * @param sharedUserIds Identifiers of the shared users.
         * @param onlyCheck Pass true to check that the users can be shared by the button instead of actually sharing them.
         */
        public ShareUsersWithBot(long chatId, long messageId, int buttonId, long[] sharedUserIds, boolean onlyCheck) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.buttonId = buttonId;
            this.sharedUserIds = sharedUserIds;
            this.onlyCheck = onlyCheck;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1574608333;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Starts recording of an active group call. Requires groupCall.canBeManaged group call flag.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class StartGroupCallRecording extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Group call recording title; 0-64 characters.
         */
        public String title;
        /**
         * Pass true to record a video file instead of an audio file.
         */
        public boolean recordVideo;
        /**
         * Pass true to use portrait orientation for video instead of landscape one.
         */
        public boolean usePortraitOrientation;

        /**
         * Default constructor for a function, which starts recording of an active group call. Requires groupCall.canBeManaged group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public StartGroupCallRecording() {
        }

        /**
         * Creates a function, which starts recording of an active group call. Requires groupCall.canBeManaged group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param title Group call recording title; 0-64 characters.
         * @param recordVideo Pass true to record a video file instead of an audio file.
         * @param usePortraitOrientation Pass true to use portrait orientation for video instead of landscape one.
         */
        public StartGroupCallRecording(int groupCallId, String title, boolean recordVideo, boolean usePortraitOrientation) {
            this.groupCallId = groupCallId;
            this.title = title;
            this.recordVideo = recordVideo;
            this.usePortraitOrientation = usePortraitOrientation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1757774971;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Starts screen sharing in a joined group call. Returns join response payload for tgcalls.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class StartGroupCallScreenSharing extends Function<Text> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Screen sharing audio channel synchronization source identifier; received from tgcalls.
         */
        public int audioSourceId;
        /**
         * Group call join payload; received from tgcalls.
         */
        public String payload;

        /**
         * Default constructor for a function, which starts screen sharing in a joined group call. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public StartGroupCallScreenSharing() {
        }

        /**
         * Creates a function, which starts screen sharing in a joined group call. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param groupCallId Group call identifier.
         * @param audioSourceId Screen sharing audio channel synchronization source identifier; received from tgcalls.
         * @param payload Group call join payload; received from tgcalls.
         */
        public StartGroupCallScreenSharing(int groupCallId, int audioSourceId, String payload) {
            this.groupCallId = groupCallId;
            this.audioSourceId = audioSourceId;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -884068051;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Starts a scheduled group call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class StartScheduledGroupCall extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which starts a scheduled group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public StartScheduledGroupCall() {
        }

        /**
         * Creates a function, which starts a scheduled group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public StartScheduledGroupCall(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1519938838;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stops a poll sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class StopBusinessPoll extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message with the poll was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which stops a poll sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public StopBusinessPoll() {
        }

        /**
         * Creates a function, which stops a poll sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message with the poll was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message containing the poll.
         * @param replyMarkup The new message reply markup; pass null if none.
         */
        public StopBusinessPoll(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1142218400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stops a poll. A poll in a message can be stopped when the message has canBeEdited flag is set.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class StopPoll extends Function<Ok> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which stops a poll. A poll in a message can be stopped when the message has canBeEdited flag is set.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public StopPoll() {
        }

        /**
         * Creates a function, which stops a poll. A poll in a message can be stopped when the message has canBeEdited flag is set.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         */
        public StopPoll(long chatId, long messageId, ReplyMarkup replyMarkup) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1659374253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests a profile photo to another regular user with common messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SuggestUserProfilePhoto extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Profile photo to suggest; inputChatPhotoPrevious isn't supported in this function.
         */
        public InputChatPhoto photo;

        /**
         * Default constructor for a function, which suggests a profile photo to another regular user with common messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SuggestUserProfilePhoto() {
        }

        /**
         * Creates a function, which suggests a profile photo to another regular user with common messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param photo Profile photo to suggest; inputChatPhotoPrevious isn't supported in this function.
         */
        public SuggestUserProfilePhoto(long userId, InputChatPhoto photo) {
            this.userId = userId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1788742557;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Fetches the latest versions of all strings from a language pack in the current localization target from the server. This method doesn't need to be called explicitly for the current used/base language packs. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SynchronizeLanguagePack extends Function<Ok> {
        /**
         * Language pack identifier.
         */
        public String languagePackId;

        /**
         * Default constructor for a function, which fetches the latest versions of all strings from a language pack in the current localization target from the server. This method doesn't need to be called explicitly for the current used/base language packs. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SynchronizeLanguagePack() {
        }

        /**
         * Creates a function, which fetches the latest versions of all strings from a language pack in the current localization target from the server. This method doesn't need to be called explicitly for the current used/base language packs. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param languagePackId Language pack identifier.
         */
        public SynchronizeLanguagePack(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2065307858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Terminates all other sessions of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TerminateAllOtherSessions extends Function<Ok> {

        /**
         * Default constructor for a function, which terminates all other sessions of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TerminateAllOtherSessions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1874485523;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Terminates a session of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TerminateSession extends Function<Ok> {
        /**
         * Session identifier.
         */
        public long sessionId;

        /**
         * Default constructor for a function, which terminates a session of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TerminateSession() {
        }

        /**
         * Creates a function, which terminates a session of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sessionId Session identifier.
         */
        public TerminateSession(long sessionId) {
            this.sessionId = sessionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -407385812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received bytes; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestBytes TestBytes} </p>
     */
    public static class TestCallBytes extends Function<TestBytes> {
        /**
         * Bytes to return.
         */
        public byte[] x;

        /**
         * Default constructor for a function, which returns the received bytes; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestBytes TestBytes} </p>
         */
        public TestCallBytes() {
        }

        /**
         * Creates a function, which returns the received bytes; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestBytes TestBytes} </p>
         *
         * @param x Bytes to return.
         */
        public TestCallBytes(byte[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -736011607;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Does nothing; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TestCallEmpty extends Function<Ok> {

        /**
         * Default constructor for a function, which does nothing; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TestCallEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -627291626;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received string; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestString TestString} </p>
     */
    public static class TestCallString extends Function<TestString> {
        /**
         * String to return.
         */
        public String x;

        /**
         * Default constructor for a function, which returns the received string; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestString TestString} </p>
         */
        public TestCallString() {
        }

        /**
         * Creates a function, which returns the received string; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestString TestString} </p>
         *
         * @param x String to return.
         */
        public TestCallString(String x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1732818385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received vector of numbers; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestVectorInt TestVectorInt} </p>
     */
    public static class TestCallVectorInt extends Function<TestVectorInt> {
        /**
         * Vector of numbers to return.
         */
        public int[] x;

        /**
         * Default constructor for a function, which returns the received vector of numbers; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorInt TestVectorInt} </p>
         */
        public TestCallVectorInt() {
        }

        /**
         * Creates a function, which returns the received vector of numbers; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorInt TestVectorInt} </p>
         *
         * @param x Vector of numbers to return.
         */
        public TestCallVectorInt(int[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2137277793;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received vector of objects containing a number; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestVectorIntObject TestVectorIntObject} </p>
     */
    public static class TestCallVectorIntObject extends Function<TestVectorIntObject> {
        /**
         * Vector of objects to return.
         */
        public TestInt[] x;

        /**
         * Default constructor for a function, which returns the received vector of objects containing a number; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorIntObject TestVectorIntObject} </p>
         */
        public TestCallVectorIntObject() {
        }

        /**
         * Creates a function, which returns the received vector of objects containing a number; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorIntObject TestVectorIntObject} </p>
         *
         * @param x Vector of objects to return.
         */
        public TestCallVectorIntObject(TestInt[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1825428218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received vector of strings; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestVectorString TestVectorString} </p>
     */
    public static class TestCallVectorString extends Function<TestVectorString> {
        /**
         * Vector of strings to return.
         */
        public String[] x;

        /**
         * Default constructor for a function, which returns the received vector of strings; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorString TestVectorString} </p>
         */
        public TestCallVectorString() {
        }

        /**
         * Creates a function, which returns the received vector of strings; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorString TestVectorString} </p>
         *
         * @param x Vector of strings to return.
         */
        public TestCallVectorString(String[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -408600900;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received vector of objects containing a string; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestVectorStringObject TestVectorStringObject} </p>
     */
    public static class TestCallVectorStringObject extends Function<TestVectorStringObject> {
        /**
         * Vector of objects to return.
         */
        public TestString[] x;

        /**
         * Default constructor for a function, which returns the received vector of objects containing a string; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorStringObject TestVectorStringObject} </p>
         */
        public TestCallVectorStringObject() {
        }

        /**
         * Creates a function, which returns the received vector of objects containing a string; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorStringObject TestVectorStringObject} </p>
         *
         * @param x Vector of objects to return.
         */
        public TestCallVectorStringObject(TestString[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1527666429;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Forces an updates.getDifference call to the Telegram servers; for testing only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TestGetDifference extends Function<Ok> {

        /**
         * Default constructor for a function, which forces an updates.getDifference call to the Telegram servers; for testing only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TestGetDifference() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1747084069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a simple network request to the Telegram servers; for testing only. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TestNetwork extends Function<Ok> {

        /**
         * Default constructor for a function, which sends a simple network request to the Telegram servers; for testing only. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TestNetwork() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1343998901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a simple network request to the Telegram servers via proxy; for testing only. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TestProxy extends Function<Ok> {
        /**
         * Proxy server domain or IP address.
         */
        public String server;
        /**
         * Proxy server port.
         */
        public int port;
        /**
         * Proxy type.
         */
        public ProxyType type;
        /**
         * Identifier of a datacenter with which to test connection.
         */
        public int dcId;
        /**
         * The maximum overall timeout for the request.
         */
        public double timeout;

        /**
         * Default constructor for a function, which sends a simple network request to the Telegram servers via proxy; for testing only. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TestProxy() {
        }

        /**
         * Creates a function, which sends a simple network request to the Telegram servers via proxy; for testing only. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param server Proxy server domain or IP address.
         * @param port Proxy server port.
         * @param type Proxy type.
         * @param dcId Identifier of a datacenter with which to test connection.
         * @param timeout The maximum overall timeout for the request.
         */
        public TestProxy(String server, int port, ProxyType type, int dcId, double timeout) {
            this.server = server;
            this.port = port;
            this.type = type;
            this.dcId = dcId;
            this.timeout = timeout;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1197366626;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the specified error and ensures that the Error object is used; for testing only. Can be called synchronously.
     *
     * <p> Returns {@link Error Error} </p>
     */
    public static class TestReturnError extends Function<Error> {
        /**
         * The error to be returned.
         */
        public Error error;

        /**
         * Default constructor for a function, which returns the specified error and ensures that the Error object is used; for testing only. Can be called synchronously.
         *
         * <p> Returns {@link Error Error} </p>
         */
        public TestReturnError() {
        }

        /**
         * Creates a function, which returns the specified error and ensures that the Error object is used; for testing only. Can be called synchronously.
         *
         * <p> Returns {@link Error Error} </p>
         *
         * @param error The error to be returned.
         */
        public TestReturnError(Error error) {
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 455179506;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the squared received number; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestInt TestInt} </p>
     */
    public static class TestSquareInt extends Function<TestInt> {
        /**
         * Number to square.
         */
        public int x;

        /**
         * Default constructor for a function, which returns the squared received number; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestInt TestInt} </p>
         */
        public TestSquareInt() {
        }

        /**
         * Creates a function, which returns the squared received number; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestInt TestInt} </p>
         *
         * @param x Number to square.
         */
        public TestSquareInt(int x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -60135024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Does nothing and ensures that the Update object is used; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link Update Update} </p>
     */
    public static class TestUseUpdate extends Function<Update> {

        /**
         * Default constructor for a function, which does nothing and ensures that the Update object is used; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link Update Update} </p>
         */
        public TestUseUpdate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 717094686;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes pause state of all files in the file download list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleAllDownloadsArePaused extends Function<Ok> {
        /**
         * Pass true to pause all downloads; pass false to unpause them.
         */
        public boolean arePaused;

        /**
         * Default constructor for a function, which changes pause state of all files in the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleAllDownloadsArePaused() {
        }

        /**
         * Creates a function, which changes pause state of all files in the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param arePaused Pass true to pause all downloads; pass false to unpause them.
         */
        public ToggleAllDownloadsArePaused(boolean arePaused) {
            this.arePaused = arePaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1251512322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds or removes a bot to attachment and side menu. Bot can be added to the menu, only if userTypeBot.canBeAddedToAttachmentMenu == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleBotIsAddedToAttachmentMenu extends Function<Ok> {
        /**
         * Bot's user identifier.
         */
        public long botUserId;
        /**
         * Pass true to add the bot to attachment menu; pass false to remove the bot from attachment menu.
         */
        public boolean isAdded;
        /**
         * Pass true if the current user allowed the bot to send them messages. Ignored if isAdded is false.
         */
        public boolean allowWriteAccess;

        /**
         * Default constructor for a function, which adds or removes a bot to attachment and side menu. Bot can be added to the menu, only if userTypeBot.canBeAddedToAttachmentMenu == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleBotIsAddedToAttachmentMenu() {
        }

        /**
         * Creates a function, which adds or removes a bot to attachment and side menu. Bot can be added to the menu, only if userTypeBot.canBeAddedToAttachmentMenu == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Bot's user identifier.
         * @param isAdded Pass true to add the bot to attachment menu; pass false to remove the bot from attachment menu.
         * @param allowWriteAccess Pass true if the current user allowed the bot to send them messages. Ignored if isAdded is false.
         */
        public ToggleBotIsAddedToAttachmentMenu(long botUserId, boolean isAdded, boolean allowWriteAccess) {
            this.botUserId = botUserId;
            this.isAdded = isAdded;
            this.allowWriteAccess = allowWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1906712934;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes active state for a username of a bot. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleBotUsernameIsActive extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * The username to change.
         */
        public String username;
        /**
         * Pass true to activate the username; pass false to disable it.
         */
        public boolean isActive;

        /**
         * Default constructor for a function, which changes active state for a username of a bot. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleBotUsernameIsActive() {
        }

        /**
         * Creates a function, which changes active state for a username of a bot. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param username The username to change.
         * @param isActive Pass true to activate the username; pass false to disable it.
         */
        public ToggleBotUsernameIsActive(long botUserId, String username, boolean isActive) {
            this.botUserId = botUserId;
            this.username = username;
            this.isActive = isActive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2036569097;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Pauses or resumes the connected business bot in a specific chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleBusinessConnectedBotChatIsPaused extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true to pause the connected bot in the chat; pass false to resume the bot.
         */
        public boolean isPaused;

        /**
         * Default constructor for a function, which pauses or resumes the connected business bot in a specific chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleBusinessConnectedBotChatIsPaused() {
        }

        /**
         * Creates a function, which pauses or resumes the connected business bot in a specific chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param isPaused Pass true to pause the connected bot in the chat; pass false to resume the bot.
         */
        public ToggleBusinessConnectedBotChatIsPaused(long chatId, boolean isPaused) {
            this.chatId = chatId;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1328957509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the value of the default disableNotification parameter, used when a message is sent to a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatDefaultDisableNotification extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of defaultDisableNotification.
         */
        public boolean defaultDisableNotification;

        /**
         * Default constructor for a function, which changes the value of the default disableNotification parameter, used when a message is sent to a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatDefaultDisableNotification() {
        }

        /**
         * Creates a function, which changes the value of the default disableNotification parameter, used when a message is sent to a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param defaultDisableNotification New value of defaultDisableNotification.
         */
        public ToggleChatDefaultDisableNotification(long chatId, boolean defaultDisableNotification) {
            this.chatId = chatId;
            this.defaultDisableNotification = defaultDisableNotification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 314794002;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether chat folder tags are enabled.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatFolderTags extends Function<Ok> {
        /**
         * Pass true to enable folder tags; pass false to disable them.
         */
        public boolean areTagsEnabled;

        /**
         * Default constructor for a function, which toggles whether chat folder tags are enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatFolderTags() {
        }

        /**
         * Creates a function, which toggles whether chat folder tags are enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param areTagsEnabled Pass true to enable folder tags; pass false to disable them.
         */
        public ToggleChatFolderTags(boolean areTagsEnabled) {
            this.areTagsEnabled = areTagsEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2092209084;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the ability of users to save, forward, or copy chat content. Supported only for basic groups, supergroups and channels. Requires owner privileges.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatHasProtectedContent extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of hasProtectedContent.
         */
        public boolean hasProtectedContent;

        /**
         * Default constructor for a function, which changes the ability of users to save, forward, or copy chat content. Supported only for basic groups, supergroups and channels. Requires owner privileges.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatHasProtectedContent() {
        }

        /**
         * Creates a function, which changes the ability of users to save, forward, or copy chat content. Supported only for basic groups, supergroups and channels. Requires owner privileges.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param hasProtectedContent New value of hasProtectedContent.
         */
        public ToggleChatHasProtectedContent(long chatId, boolean hasProtectedContent) {
            this.chatId = chatId;
            this.hasProtectedContent = hasProtectedContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 975231309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the marked as unread state of a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatIsMarkedAsUnread extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of isMarkedAsUnread.
         */
        public boolean isMarkedAsUnread;

        /**
         * Default constructor for a function, which changes the marked as unread state of a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatIsMarkedAsUnread() {
        }

        /**
         * Creates a function, which changes the marked as unread state of a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param isMarkedAsUnread New value of isMarkedAsUnread.
         */
        public ToggleChatIsMarkedAsUnread(long chatId, boolean isMarkedAsUnread) {
            this.chatId = chatId;
            this.isMarkedAsUnread = isMarkedAsUnread;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -986129697;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the pinned state of a chat. There can be up to getOption(&quot;pinned_chat_count_max&quot;)/getOption(&quot;pinned_archived_chat_count_max&quot;) pinned non-secret chats and the same number of secret chats in the main/archive chat list. The limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatIsPinned extends Function<Ok> {
        /**
         * Chat list in which to change the pinned state of the chat.
         */
        public ChatList chatList;
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true to pin the chat; pass false to unpin it.
         */
        public boolean isPinned;

        /**
         * Default constructor for a function, which changes the pinned state of a chat. There can be up to getOption(&quot;pinned_chat_count_max&quot;)/getOption(&quot;pinned_archived_chat_count_max&quot;) pinned non-secret chats and the same number of secret chats in the main/archive chat list. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatIsPinned() {
        }

        /**
         * Creates a function, which changes the pinned state of a chat. There can be up to getOption(&quot;pinned_chat_count_max&quot;)/getOption(&quot;pinned_archived_chat_count_max&quot;) pinned non-secret chats and the same number of secret chats in the main/archive chat list. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatList Chat list in which to change the pinned state of the chat.
         * @param chatId Chat identifier.
         * @param isPinned Pass true to pin the chat; pass false to unpin it.
         */
        public ToggleChatIsPinned(ChatList chatList, long chatId, boolean isPinned) {
            this.chatList = chatList;
            this.chatId = chatId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1485429186;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the translatable state of a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatIsTranslatable extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of isTranslatable.
         */
        public boolean isTranslatable;

        /**
         * Default constructor for a function, which changes the translatable state of a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatIsTranslatable() {
        }

        /**
         * Creates a function, which changes the translatable state of a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param isTranslatable New value of isTranslatable.
         */
        public ToggleChatIsTranslatable(long chatId, boolean isTranslatable) {
            this.chatId = chatId;
            this.isTranslatable = isTranslatable;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1812345889;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the viewAsTopics setting of a forum chat or Saved Messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatViewAsTopics extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of viewAsTopics.
         */
        public boolean viewAsTopics;

        /**
         * Default constructor for a function, which changes the viewAsTopics setting of a forum chat or Saved Messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatViewAsTopics() {
        }

        /**
         * Creates a function, which changes the viewAsTopics setting of a forum chat or Saved Messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param viewAsTopics New value of viewAsTopics.
         */
        public ToggleChatViewAsTopics(long chatId, boolean viewAsTopics) {
            this.chatId = chatId;
            this.viewAsTopics = viewAsTopics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 724009948;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes pause state of a file in the file download list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleDownloadIsPaused extends Function<Ok> {
        /**
         * Identifier of the downloaded file.
         */
        public int fileId;
        /**
         * Pass true if the download is paused.
         */
        public boolean isPaused;

        /**
         * Default constructor for a function, which changes pause state of a file in the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleDownloadIsPaused() {
        }

        /**
         * Creates a function, which changes pause state of a file in the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the downloaded file.
         * @param isPaused Pass true if the download is paused.
         */
        public ToggleDownloadIsPaused(int fileId, boolean isPaused) {
            this.fileId = fileId;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -947493099;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a topic is closed in a forum supergroup chat; requires canManageTopics right in the supergroup unless the user is creator of the topic.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleForumTopicIsClosed extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Message thread identifier of the forum topic.
         */
        public long messageThreadId;
        /**
         * Pass true to close the topic; pass false to reopen it.
         */
        public boolean isClosed;

        /**
         * Default constructor for a function, which toggles whether a topic is closed in a forum supergroup chat; requires canManageTopics right in the supergroup unless the user is creator of the topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleForumTopicIsClosed() {
        }

        /**
         * Creates a function, which toggles whether a topic is closed in a forum supergroup chat; requires canManageTopics right in the supergroup unless the user is creator of the topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageThreadId Message thread identifier of the forum topic.
         * @param isClosed Pass true to close the topic; pass false to reopen it.
         */
        public ToggleForumTopicIsClosed(long chatId, long messageThreadId, boolean isClosed) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.isClosed = isClosed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -949712141;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the pinned state of a forum topic; requires canManageTopics right in the supergroup. There can be up to getOption(&quot;pinned_forum_topic_count_max&quot;) pinned forum topics.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleForumTopicIsPinned extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message thread identifier of the forum topic.
         */
        public long messageThreadId;
        /**
         * Pass true to pin the topic; pass false to unpin it.
         */
        public boolean isPinned;

        /**
         * Default constructor for a function, which changes the pinned state of a forum topic; requires canManageTopics right in the supergroup. There can be up to getOption(&quot;pinned_forum_topic_count_max&quot;) pinned forum topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleForumTopicIsPinned() {
        }

        /**
         * Creates a function, which changes the pinned state of a forum topic; requires canManageTopics right in the supergroup. There can be up to getOption(&quot;pinned_forum_topic_count_max&quot;) pinned forum topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageThreadId Message thread identifier of the forum topic.
         * @param isPinned Pass true to pin the topic; pass false to unpin it.
         */
        public ToggleForumTopicIsPinned(long chatId, long messageThreadId, boolean isPinned) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1181543092;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a General topic is hidden in a forum supergroup chat; requires canManageTopics right in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGeneralForumTopicIsHidden extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Pass true to hide and close the General topic; pass false to unhide it.
         */
        public boolean isHidden;

        /**
         * Default constructor for a function, which toggles whether a General topic is hidden in a forum supergroup chat; requires canManageTopics right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGeneralForumTopicIsHidden() {
        }

        /**
         * Creates a function, which toggles whether a General topic is hidden in a forum supergroup chat; requires canManageTopics right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param isHidden Pass true to hide and close the General topic; pass false to unhide it.
         */
        public ToggleGeneralForumTopicIsHidden(long chatId, boolean isHidden) {
            this.chatId = chatId;
            this.isHidden = isHidden;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1595741256;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the current user will receive a notification when the group call starts; scheduled group calls only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallEnabledStartNotification extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * New value of the enabledStartNotification setting.
         */
        public boolean enabledStartNotification;

        /**
         * Default constructor for a function, which toggles whether the current user will receive a notification when the group call starts; scheduled group calls only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallEnabledStartNotification() {
        }

        /**
         * Creates a function, which toggles whether the current user will receive a notification when the group call starts; scheduled group calls only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param enabledStartNotification New value of the enabledStartNotification setting.
         */
        public ToggleGroupCallEnabledStartNotification(int groupCallId, boolean enabledStartNotification) {
            this.groupCallId = groupCallId;
            this.enabledStartNotification = enabledStartNotification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 707839826;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether current user's video is enabled.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallIsMyVideoEnabled extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Pass true if the current user's video is enabled.
         */
        public boolean isMyVideoEnabled;

        /**
         * Default constructor for a function, which toggles whether current user's video is enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallIsMyVideoEnabled() {
        }

        /**
         * Creates a function, which toggles whether current user's video is enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param isMyVideoEnabled Pass true if the current user's video is enabled.
         */
        public ToggleGroupCallIsMyVideoEnabled(int groupCallId, boolean isMyVideoEnabled) {
            this.groupCallId = groupCallId;
            this.isMyVideoEnabled = isMyVideoEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1624289030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether current user's video is paused.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallIsMyVideoPaused extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Pass true if the current user's video is paused.
         */
        public boolean isMyVideoPaused;

        /**
         * Default constructor for a function, which toggles whether current user's video is paused.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallIsMyVideoPaused() {
        }

        /**
         * Creates a function, which toggles whether current user's video is paused.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param isMyVideoPaused Pass true if the current user's video is paused.
         */
        public ToggleGroupCallIsMyVideoPaused(int groupCallId, boolean isMyVideoPaused) {
            this.groupCallId = groupCallId;
            this.isMyVideoPaused = isMyVideoPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -478875239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether new participants of a group call can be unmuted only by administrators of the group call. Requires groupCall.canToggleMuteNewParticipants group call flag.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallMuteNewParticipants extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * New value of the muteNewParticipants setting.
         */
        public boolean muteNewParticipants;

        /**
         * Default constructor for a function, which toggles whether new participants of a group call can be unmuted only by administrators of the group call. Requires groupCall.canToggleMuteNewParticipants group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallMuteNewParticipants() {
        }

        /**
         * Creates a function, which toggles whether new participants of a group call can be unmuted only by administrators of the group call. Requires groupCall.canToggleMuteNewParticipants group call flag.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param muteNewParticipants New value of the muteNewParticipants setting.
         */
        public ToggleGroupCallMuteNewParticipants(int groupCallId, boolean muteNewParticipants) {
            this.groupCallId = groupCallId;
            this.muteNewParticipants = muteNewParticipants;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 284082626;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a group call participant hand is rased.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallParticipantIsHandRaised extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Participant identifier.
         */
        public MessageSender participantId;
        /**
         * Pass true if the user's hand needs to be raised. Only self hand can be raised. Requires groupCall.canBeManaged group call flag to lower other's hand.
         */
        public boolean isHandRaised;

        /**
         * Default constructor for a function, which toggles whether a group call participant hand is rased.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallParticipantIsHandRaised() {
        }

        /**
         * Creates a function, which toggles whether a group call participant hand is rased.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param participantId Participant identifier.
         * @param isHandRaised Pass true if the user's hand needs to be raised. Only self hand can be raised. Requires groupCall.canBeManaged group call flag to lower other's hand.
         */
        public ToggleGroupCallParticipantIsHandRaised(int groupCallId, MessageSender participantId, boolean isHandRaised) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.isHandRaised = isHandRaised;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1896127519;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a participant of an active group call is muted, unmuted, or allowed to unmute themselves.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallParticipantIsMuted extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Participant identifier.
         */
        public MessageSender participantId;
        /**
         * Pass true to mute the user; pass false to unmute them.
         */
        public boolean isMuted;

        /**
         * Default constructor for a function, which toggles whether a participant of an active group call is muted, unmuted, or allowed to unmute themselves.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallParticipantIsMuted() {
        }

        /**
         * Creates a function, which toggles whether a participant of an active group call is muted, unmuted, or allowed to unmute themselves.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param participantId Participant identifier.
         * @param isMuted Pass true to mute the user; pass false to unmute them.
         */
        public ToggleGroupCallParticipantIsMuted(int groupCallId, MessageSender participantId, boolean isMuted) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.isMuted = isMuted;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1308093433;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Pauses or unpauses screen sharing in a joined group call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallScreenSharingIsPaused extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Pass true to pause screen sharing; pass false to unpause it.
         */
        public boolean isPaused;

        /**
         * Default constructor for a function, which pauses or unpauses screen sharing in a joined group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallScreenSharingIsPaused() {
        }

        /**
         * Creates a function, which pauses or unpauses screen sharing in a joined group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param isPaused Pass true to pause screen sharing; pass false to unpause it.
         */
        public ToggleGroupCallScreenSharingIsPaused(int groupCallId, boolean isPaused) {
            this.groupCallId = groupCallId;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1602530464;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the current user has sponsored messages enabled. The setting has no effect for users without Telegram Premium for which sponsored messages are always enabled.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleHasSponsoredMessagesEnabled extends Function<Ok> {
        /**
         * Pass true to enable sponsored messages for the current user; false to disable them.
         */
        public boolean hasSponsoredMessagesEnabled;

        /**
         * Default constructor for a function, which toggles whether the current user has sponsored messages enabled. The setting has no effect for users without Telegram Premium for which sponsored messages are always enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleHasSponsoredMessagesEnabled() {
        }

        /**
         * Creates a function, which toggles whether the current user has sponsored messages enabled. The setting has no effect for users without Telegram Premium for which sponsored messages are always enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param hasSponsoredMessagesEnabled Pass true to enable sponsored messages for the current user; false to disable them.
         */
        public ToggleHasSponsoredMessagesEnabled(boolean hasSponsoredMessagesEnabled) {
            this.hasSponsoredMessagesEnabled = hasSponsoredMessagesEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1963285740;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the pinned state of a Saved Messages topic. There can be up to getOption(&quot;pinned_saved_messages_topic_count_max&quot;) pinned topics. The limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSavedMessagesTopicIsPinned extends Function<Ok> {
        /**
         * Identifier of Saved Messages topic to pin or unpin.
         */
        public long savedMessagesTopicId;
        /**
         * Pass true to pin the topic; pass false to unpin it.
         */
        public boolean isPinned;

        /**
         * Default constructor for a function, which changes the pinned state of a Saved Messages topic. There can be up to getOption(&quot;pinned_saved_messages_topic_count_max&quot;) pinned topics. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSavedMessagesTopicIsPinned() {
        }

        /**
         * Creates a function, which changes the pinned state of a Saved Messages topic. There can be up to getOption(&quot;pinned_saved_messages_topic_count_max&quot;) pinned topics. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic to pin or unpin.
         * @param isPinned Pass true to pin the topic; pass false to unpin it.
         */
        public ToggleSavedMessagesTopicIsPinned(long savedMessagesTopicId, boolean isPinned) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1588378164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a session can accept incoming calls.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSessionCanAcceptCalls extends Function<Ok> {
        /**
         * Session identifier.
         */
        public long sessionId;
        /**
         * Pass true to allow accepting incoming calls by the session; pass false otherwise.
         */
        public boolean canAcceptCalls;

        /**
         * Default constructor for a function, which toggles whether a session can accept incoming calls.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSessionCanAcceptCalls() {
        }

        /**
         * Creates a function, which toggles whether a session can accept incoming calls.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sessionId Session identifier.
         * @param canAcceptCalls Pass true to allow accepting incoming calls by the session; pass false otherwise.
         */
        public ToggleSessionCanAcceptCalls(long sessionId, boolean canAcceptCalls) {
            this.sessionId = sessionId;
            this.canAcceptCalls = canAcceptCalls;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1819027208;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a session can accept incoming secret chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSessionCanAcceptSecretChats extends Function<Ok> {
        /**
         * Session identifier.
         */
        public long sessionId;
        /**
         * Pass true to allow accepting secret chats by the session; pass false otherwise.
         */
        public boolean canAcceptSecretChats;

        /**
         * Default constructor for a function, which toggles whether a session can accept incoming secret chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSessionCanAcceptSecretChats() {
        }

        /**
         * Creates a function, which toggles whether a session can accept incoming secret chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sessionId Session identifier.
         * @param canAcceptSecretChats Pass true to allow accepting secret chats by the session; pass false otherwise.
         */
        public ToggleSessionCanAcceptSecretChats(long sessionId, boolean canAcceptSecretChats) {
            this.sessionId = sessionId;
            this.canAcceptSecretChats = canAcceptSecretChats;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1000843390;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a story is accessible after expiration. Can be called only if story.canToggleIsPostedToChatPage == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleStoryIsPostedToChatPage extends Function<Ok> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storySenderChatId;
        /**
         * Identifier of the story.
         */
        public int storyId;
        /**
         * Pass true to make the story accessible after expiration; pass false to make it private.
         */
        public boolean isPostedToChatPage;

        /**
         * Default constructor for a function, which toggles whether a story is accessible after expiration. Can be called only if story.canToggleIsPostedToChatPage == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleStoryIsPostedToChatPage() {
        }

        /**
         * Creates a function, which toggles whether a story is accessible after expiration. Can be called only if story.canToggleIsPostedToChatPage == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storySenderChatId Identifier of the chat that posted the story.
         * @param storyId Identifier of the story.
         * @param isPostedToChatPage Pass true to make the story accessible after expiration; pass false to make it private.
         */
        public ToggleStoryIsPostedToChatPage(long storySenderChatId, int storyId, boolean isPostedToChatPage) {
            this.storySenderChatId = storySenderChatId;
            this.storyId = storyId;
            this.isPostedToChatPage = isPostedToChatPage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -300987649;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether sponsored messages are shown in the channel chat; requires owner privileges in the channel. The chat must have at least chatBoostFeatures.minSponsoredMessageDisableBoostLevel boost level to disable sponsored messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupCanHaveSponsoredMessages extends Function<Ok> {
        /**
         * The identifier of the channel.
         */
        public long supergroupId;
        /**
         * The new value of canHaveSponsoredMessages.
         */
        public boolean canHaveSponsoredMessages;

        /**
         * Default constructor for a function, which toggles whether sponsored messages are shown in the channel chat; requires owner privileges in the channel. The chat must have at least chatBoostFeatures.minSponsoredMessageDisableBoostLevel boost level to disable sponsored messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupCanHaveSponsoredMessages() {
        }

        /**
         * Creates a function, which toggles whether sponsored messages are shown in the channel chat; requires owner privileges in the channel. The chat must have at least chatBoostFeatures.minSponsoredMessageDisableBoostLevel boost level to disable sponsored messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId The identifier of the channel.
         * @param canHaveSponsoredMessages The new value of canHaveSponsoredMessages.
         */
        public ToggleSupergroupCanHaveSponsoredMessages(long supergroupId, boolean canHaveSponsoredMessages) {
            this.supergroupId = supergroupId;
            this.canHaveSponsoredMessages = canHaveSponsoredMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1098204302;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether aggressive anti-spam checks are enabled in the supergroup. Can be called only if supergroupFullInfo.canToggleAggressiveAntiSpam == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupHasAggressiveAntiSpamEnabled extends Function<Ok> {
        /**
         * The identifier of the supergroup, which isn't a broadcast group.
         */
        public long supergroupId;
        /**
         * The new value of hasAggressiveAntiSpamEnabled.
         */
        public boolean hasAggressiveAntiSpamEnabled;

        /**
         * Default constructor for a function, which toggles whether aggressive anti-spam checks are enabled in the supergroup. Can be called only if supergroupFullInfo.canToggleAggressiveAntiSpam == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupHasAggressiveAntiSpamEnabled() {
        }

        /**
         * Creates a function, which toggles whether aggressive anti-spam checks are enabled in the supergroup. Can be called only if supergroupFullInfo.canToggleAggressiveAntiSpam == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId The identifier of the supergroup, which isn't a broadcast group.
         * @param hasAggressiveAntiSpamEnabled The new value of hasAggressiveAntiSpamEnabled.
         */
        public ToggleSupergroupHasAggressiveAntiSpamEnabled(long supergroupId, boolean hasAggressiveAntiSpamEnabled) {
            this.supergroupId = supergroupId;
            this.hasAggressiveAntiSpamEnabled = hasAggressiveAntiSpamEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1748956943;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers. Can be called only if supergroupFullInfo.canHideMembers == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupHasHiddenMembers extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of hasHiddenMembers.
         */
        public boolean hasHiddenMembers;

        /**
         * Default constructor for a function, which toggles whether non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers. Can be called only if supergroupFullInfo.canHideMembers == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupHasHiddenMembers() {
        }

        /**
         * Creates a function, which toggles whether non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers. Can be called only if supergroupFullInfo.canHideMembers == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param hasHiddenMembers New value of hasHiddenMembers.
         */
        public ToggleSupergroupHasHiddenMembers(long supergroupId, boolean hasHiddenMembers) {
            this.supergroupId = supergroupId;
            this.hasHiddenMembers = hasHiddenMembers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1537892918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the message history of a supergroup is available to new members; requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupIsAllHistoryAvailable extends Function<Ok> {
        /**
         * The identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * The new value of isAllHistoryAvailable.
         */
        public boolean isAllHistoryAvailable;

        /**
         * Default constructor for a function, which toggles whether the message history of a supergroup is available to new members; requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupIsAllHistoryAvailable() {
        }

        /**
         * Creates a function, which toggles whether the message history of a supergroup is available to new members; requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId The identifier of the supergroup.
         * @param isAllHistoryAvailable The new value of isAllHistoryAvailable.
         */
        public ToggleSupergroupIsAllHistoryAvailable(long supergroupId, boolean isAllHistoryAvailable) {
            this.supergroupId = supergroupId;
            this.isAllHistoryAvailable = isAllHistoryAvailable;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1155110478;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Upgrades supergroup to a broadcast group; requires owner privileges in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupIsBroadcastGroup extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;

        /**
         * Default constructor for a function, which upgrades supergroup to a broadcast group; requires owner privileges in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupIsBroadcastGroup() {
        }

        /**
         * Creates a function, which upgrades supergroup to a broadcast group; requires owner privileges in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         */
        public ToggleSupergroupIsBroadcastGroup(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 884089365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the supergroup is a forum; requires owner privileges in the supergroup. Discussion supergroups can't be converted to forums.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupIsForum extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of isForum.
         */
        public boolean isForum;

        /**
         * Default constructor for a function, which toggles whether the supergroup is a forum; requires owner privileges in the supergroup. Discussion supergroups can't be converted to forums.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupIsForum() {
        }

        /**
         * Creates a function, which toggles whether the supergroup is a forum; requires owner privileges in the supergroup. Discussion supergroups can't be converted to forums.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param isForum New value of isForum.
         */
        public ToggleSupergroupIsForum(long supergroupId, boolean isForum) {
            this.supergroupId = supergroupId;
            this.isForum = isForum;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1771071990;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether all users directly joining the supergroup need to be approved by supergroup administrators; requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupJoinByRequest extends Function<Ok> {
        /**
         * Identifier of the supergroup that isn't a broadcast group.
         */
        public long supergroupId;
        /**
         * New value of joinByRequest.
         */
        public boolean joinByRequest;

        /**
         * Default constructor for a function, which toggles whether all users directly joining the supergroup need to be approved by supergroup administrators; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupJoinByRequest() {
        }

        /**
         * Creates a function, which toggles whether all users directly joining the supergroup need to be approved by supergroup administrators; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup that isn't a broadcast group.
         * @param joinByRequest New value of joinByRequest.
         */
        public ToggleSupergroupJoinByRequest(long supergroupId, boolean joinByRequest) {
            this.supergroupId = supergroupId;
            this.joinByRequest = joinByRequest;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2111807454;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether joining is mandatory to send messages to a discussion supergroup; requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupJoinToSendMessages extends Function<Ok> {
        /**
         * Identifier of the supergroup that isn't a broadcast group.
         */
        public long supergroupId;
        /**
         * New value of joinToSendMessages.
         */
        public boolean joinToSendMessages;

        /**
         * Default constructor for a function, which toggles whether joining is mandatory to send messages to a discussion supergroup; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupJoinToSendMessages() {
        }

        /**
         * Creates a function, which toggles whether joining is mandatory to send messages to a discussion supergroup; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup that isn't a broadcast group.
         * @param joinToSendMessages New value of joinToSendMessages.
         */
        public ToggleSupergroupJoinToSendMessages(long supergroupId, boolean joinToSendMessages) {
            this.supergroupId = supergroupId;
            this.joinToSendMessages = joinToSendMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -182022642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether sender signature is added to sent messages in a channel; requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupSignMessages extends Function<Ok> {
        /**
         * Identifier of the channel.
         */
        public long supergroupId;
        /**
         * New value of signMessages.
         */
        public boolean signMessages;

        /**
         * Default constructor for a function, which toggles whether sender signature is added to sent messages in a channel; requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupSignMessages() {
        }

        /**
         * Creates a function, which toggles whether sender signature is added to sent messages in a channel; requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the channel.
         * @param signMessages New value of signMessages.
         */
        public ToggleSupergroupSignMessages(long supergroupId, boolean signMessages) {
            this.supergroupId = supergroupId;
            this.signMessages = signMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1156568356;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes active state for a username of a supergroup or channel, requires owner privileges in the supergroup or channel. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupUsernameIsActive extends Function<Ok> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * The username to change.
         */
        public String username;
        /**
         * Pass true to activate the username; pass false to disable it.
         */
        public boolean isActive;

        /**
         * Default constructor for a function, which changes active state for a username of a supergroup or channel, requires owner privileges in the supergroup or channel. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupUsernameIsActive() {
        }

        /**
         * Creates a function, which changes active state for a username of a supergroup or channel, requires owner privileges in the supergroup or channel. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param username The username to change.
         * @param isActive Pass true to activate the username; pass false to disable it.
         */
        public ToggleSupergroupUsernameIsActive(long supergroupId, String username, boolean isActive) {
            this.supergroupId = supergroupId;
            this.username = username;
            this.isActive = isActive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1500811777;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes active state for a username of the current user. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleUsernameIsActive extends Function<Ok> {
        /**
         * The username to change.
         */
        public String username;
        /**
         * Pass true to activate the username; pass false to disable it.
         */
        public boolean isActive;

        /**
         * Default constructor for a function, which changes active state for a username of the current user. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleUsernameIsActive() {
        }

        /**
         * Creates a function, which changes active state for a username of the current user. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param username The username to change.
         * @param isActive Pass true to activate the username; pass false to disable it.
         */
        public ToggleUsernameIsActive(String username, boolean isActive) {
            this.username = username;
            this.isActive = isActive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1244098019;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the owner of a chat; requires owner privileges in the chat. Use the method canTransferOwnership to check whether the ownership can be transferred from the current session. Available only for supergroups and channel chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TransferChatOwnership extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user to which transfer the ownership. The ownership can't be transferred to a bot or to a deleted user.
         */
        public long userId;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which changes the owner of a chat; requires owner privileges in the chat. Use the method canTransferOwnership to check whether the ownership can be transferred from the current session. Available only for supergroups and channel chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TransferChatOwnership() {
        }

        /**
         * Creates a function, which changes the owner of a chat; requires owner privileges in the chat. Use the method canTransferOwnership to check whether the ownership can be transferred from the current session. Available only for supergroups and channel chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param userId Identifier of the user to which transfer the ownership. The ownership can't be transferred to a bot or to a deleted user.
         * @param password The 2-step verification password of the current user.
         */
        public TransferChatOwnership(long chatId, long userId, String password) {
            this.chatId = chatId;
            this.userId = userId;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2006977043;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Extracts text or caption of the given message and translates it to the given language. If the current user is a Telegram Premium user, then text formatting is preserved.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class TranslateMessageText extends Function<FormattedText> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Language code of the language to which the message is translated. Must be one of &quot;af&quot;, &quot;sq&quot;, &quot;am&quot;, &quot;ar&quot;, &quot;hy&quot;, &quot;az&quot;, &quot;eu&quot;, &quot;be&quot;, &quot;bn&quot;, &quot;bs&quot;, &quot;bg&quot;, &quot;ca&quot;, &quot;ceb&quot;, &quot;zh-CN&quot;, &quot;zh&quot;, &quot;zh-Hans&quot;, &quot;zh-TW&quot;, &quot;zh-Hant&quot;, &quot;co&quot;, &quot;hr&quot;, &quot;cs&quot;, &quot;da&quot;, &quot;nl&quot;, &quot;en&quot;, &quot;eo&quot;, &quot;et&quot;, &quot;fi&quot;, &quot;fr&quot;, &quot;fy&quot;, &quot;gl&quot;, &quot;ka&quot;, &quot;de&quot;, &quot;el&quot;, &quot;gu&quot;, &quot;ht&quot;, &quot;ha&quot;, &quot;haw&quot;, &quot;he&quot;, &quot;iw&quot;, &quot;hi&quot;, &quot;hmn&quot;, &quot;hu&quot;, &quot;is&quot;, &quot;ig&quot;, &quot;id&quot;, &quot;in&quot;, &quot;ga&quot;, &quot;it&quot;, &quot;ja&quot;, &quot;jv&quot;, &quot;kn&quot;, &quot;kk&quot;, &quot;km&quot;, &quot;rw&quot;, &quot;ko&quot;, &quot;ku&quot;, &quot;ky&quot;, &quot;lo&quot;, &quot;la&quot;, &quot;lv&quot;, &quot;lt&quot;, &quot;lb&quot;, &quot;mk&quot;, &quot;mg&quot;, &quot;ms&quot;, &quot;ml&quot;, &quot;mt&quot;, &quot;mi&quot;, &quot;mr&quot;, &quot;mn&quot;, &quot;my&quot;, &quot;ne&quot;, &quot;no&quot;, &quot;ny&quot;, &quot;or&quot;, &quot;ps&quot;, &quot;fa&quot;, &quot;pl&quot;, &quot;pt&quot;, &quot;pa&quot;, &quot;ro&quot;, &quot;ru&quot;, &quot;sm&quot;, &quot;gd&quot;, &quot;sr&quot;, &quot;st&quot;, &quot;sn&quot;, &quot;sd&quot;, &quot;si&quot;, &quot;sk&quot;, &quot;sl&quot;, &quot;so&quot;, &quot;es&quot;, &quot;su&quot;, &quot;sw&quot;, &quot;sv&quot;, &quot;tl&quot;, &quot;tg&quot;, &quot;ta&quot;, &quot;tt&quot;, &quot;te&quot;, &quot;th&quot;, &quot;tr&quot;, &quot;tk&quot;, &quot;uk&quot;, &quot;ur&quot;, &quot;ug&quot;, &quot;uz&quot;, &quot;vi&quot;, &quot;cy&quot;, &quot;xh&quot;, &quot;yi&quot;, &quot;ji&quot;, &quot;yo&quot;, &quot;zu&quot;.
         */
        public String toLanguageCode;

        /**
         * Default constructor for a function, which extracts text or caption of the given message and translates it to the given language. If the current user is a Telegram Premium user, then text formatting is preserved.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public TranslateMessageText() {
        }

        /**
         * Creates a function, which extracts text or caption of the given message and translates it to the given language. If the current user is a Telegram Premium user, then text formatting is preserved.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param toLanguageCode Language code of the language to which the message is translated. Must be one of &quot;af&quot;, &quot;sq&quot;, &quot;am&quot;, &quot;ar&quot;, &quot;hy&quot;, &quot;az&quot;, &quot;eu&quot;, &quot;be&quot;, &quot;bn&quot;, &quot;bs&quot;, &quot;bg&quot;, &quot;ca&quot;, &quot;ceb&quot;, &quot;zh-CN&quot;, &quot;zh&quot;, &quot;zh-Hans&quot;, &quot;zh-TW&quot;, &quot;zh-Hant&quot;, &quot;co&quot;, &quot;hr&quot;, &quot;cs&quot;, &quot;da&quot;, &quot;nl&quot;, &quot;en&quot;, &quot;eo&quot;, &quot;et&quot;, &quot;fi&quot;, &quot;fr&quot;, &quot;fy&quot;, &quot;gl&quot;, &quot;ka&quot;, &quot;de&quot;, &quot;el&quot;, &quot;gu&quot;, &quot;ht&quot;, &quot;ha&quot;, &quot;haw&quot;, &quot;he&quot;, &quot;iw&quot;, &quot;hi&quot;, &quot;hmn&quot;, &quot;hu&quot;, &quot;is&quot;, &quot;ig&quot;, &quot;id&quot;, &quot;in&quot;, &quot;ga&quot;, &quot;it&quot;, &quot;ja&quot;, &quot;jv&quot;, &quot;kn&quot;, &quot;kk&quot;, &quot;km&quot;, &quot;rw&quot;, &quot;ko&quot;, &quot;ku&quot;, &quot;ky&quot;, &quot;lo&quot;, &quot;la&quot;, &quot;lv&quot;, &quot;lt&quot;, &quot;lb&quot;, &quot;mk&quot;, &quot;mg&quot;, &quot;ms&quot;, &quot;ml&quot;, &quot;mt&quot;, &quot;mi&quot;, &quot;mr&quot;, &quot;mn&quot;, &quot;my&quot;, &quot;ne&quot;, &quot;no&quot;, &quot;ny&quot;, &quot;or&quot;, &quot;ps&quot;, &quot;fa&quot;, &quot;pl&quot;, &quot;pt&quot;, &quot;pa&quot;, &quot;ro&quot;, &quot;ru&quot;, &quot;sm&quot;, &quot;gd&quot;, &quot;sr&quot;, &quot;st&quot;, &quot;sn&quot;, &quot;sd&quot;, &quot;si&quot;, &quot;sk&quot;, &quot;sl&quot;, &quot;so&quot;, &quot;es&quot;, &quot;su&quot;, &quot;sw&quot;, &quot;sv&quot;, &quot;tl&quot;, &quot;tg&quot;, &quot;ta&quot;, &quot;tt&quot;, &quot;te&quot;, &quot;th&quot;, &quot;tr&quot;, &quot;tk&quot;, &quot;uk&quot;, &quot;ur&quot;, &quot;ug&quot;, &quot;uz&quot;, &quot;vi&quot;, &quot;cy&quot;, &quot;xh&quot;, &quot;yi&quot;, &quot;ji&quot;, &quot;yo&quot;, &quot;zu&quot;.
         */
        public TranslateMessageText(long chatId, long messageId, String toLanguageCode) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.toLanguageCode = toLanguageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1405427410;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Translates a text to the given language. If the current user is a Telegram Premium user, then text formatting is preserved.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class TranslateText extends Function<FormattedText> {
        /**
         * Text to translate.
         */
        public FormattedText text;
        /**
         * Language code of the language to which the message is translated. Must be one of &quot;af&quot;, &quot;sq&quot;, &quot;am&quot;, &quot;ar&quot;, &quot;hy&quot;, &quot;az&quot;, &quot;eu&quot;, &quot;be&quot;, &quot;bn&quot;, &quot;bs&quot;, &quot;bg&quot;, &quot;ca&quot;, &quot;ceb&quot;, &quot;zh-CN&quot;, &quot;zh&quot;, &quot;zh-Hans&quot;, &quot;zh-TW&quot;, &quot;zh-Hant&quot;, &quot;co&quot;, &quot;hr&quot;, &quot;cs&quot;, &quot;da&quot;, &quot;nl&quot;, &quot;en&quot;, &quot;eo&quot;, &quot;et&quot;, &quot;fi&quot;, &quot;fr&quot;, &quot;fy&quot;, &quot;gl&quot;, &quot;ka&quot;, &quot;de&quot;, &quot;el&quot;, &quot;gu&quot;, &quot;ht&quot;, &quot;ha&quot;, &quot;haw&quot;, &quot;he&quot;, &quot;iw&quot;, &quot;hi&quot;, &quot;hmn&quot;, &quot;hu&quot;, &quot;is&quot;, &quot;ig&quot;, &quot;id&quot;, &quot;in&quot;, &quot;ga&quot;, &quot;it&quot;, &quot;ja&quot;, &quot;jv&quot;, &quot;kn&quot;, &quot;kk&quot;, &quot;km&quot;, &quot;rw&quot;, &quot;ko&quot;, &quot;ku&quot;, &quot;ky&quot;, &quot;lo&quot;, &quot;la&quot;, &quot;lv&quot;, &quot;lt&quot;, &quot;lb&quot;, &quot;mk&quot;, &quot;mg&quot;, &quot;ms&quot;, &quot;ml&quot;, &quot;mt&quot;, &quot;mi&quot;, &quot;mr&quot;, &quot;mn&quot;, &quot;my&quot;, &quot;ne&quot;, &quot;no&quot;, &quot;ny&quot;, &quot;or&quot;, &quot;ps&quot;, &quot;fa&quot;, &quot;pl&quot;, &quot;pt&quot;, &quot;pa&quot;, &quot;ro&quot;, &quot;ru&quot;, &quot;sm&quot;, &quot;gd&quot;, &quot;sr&quot;, &quot;st&quot;, &quot;sn&quot;, &quot;sd&quot;, &quot;si&quot;, &quot;sk&quot;, &quot;sl&quot;, &quot;so&quot;, &quot;es&quot;, &quot;su&quot;, &quot;sw&quot;, &quot;sv&quot;, &quot;tl&quot;, &quot;tg&quot;, &quot;ta&quot;, &quot;tt&quot;, &quot;te&quot;, &quot;th&quot;, &quot;tr&quot;, &quot;tk&quot;, &quot;uk&quot;, &quot;ur&quot;, &quot;ug&quot;, &quot;uz&quot;, &quot;vi&quot;, &quot;cy&quot;, &quot;xh&quot;, &quot;yi&quot;, &quot;ji&quot;, &quot;yo&quot;, &quot;zu&quot;.
         */
        public String toLanguageCode;

        /**
         * Default constructor for a function, which translates a text to the given language. If the current user is a Telegram Premium user, then text formatting is preserved.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public TranslateText() {
        }

        /**
         * Creates a function, which translates a text to the given language. If the current user is a Telegram Premium user, then text formatting is preserved.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text Text to translate.
         * @param toLanguageCode Language code of the language to which the message is translated. Must be one of &quot;af&quot;, &quot;sq&quot;, &quot;am&quot;, &quot;ar&quot;, &quot;hy&quot;, &quot;az&quot;, &quot;eu&quot;, &quot;be&quot;, &quot;bn&quot;, &quot;bs&quot;, &quot;bg&quot;, &quot;ca&quot;, &quot;ceb&quot;, &quot;zh-CN&quot;, &quot;zh&quot;, &quot;zh-Hans&quot;, &quot;zh-TW&quot;, &quot;zh-Hant&quot;, &quot;co&quot;, &quot;hr&quot;, &quot;cs&quot;, &quot;da&quot;, &quot;nl&quot;, &quot;en&quot;, &quot;eo&quot;, &quot;et&quot;, &quot;fi&quot;, &quot;fr&quot;, &quot;fy&quot;, &quot;gl&quot;, &quot;ka&quot;, &quot;de&quot;, &quot;el&quot;, &quot;gu&quot;, &quot;ht&quot;, &quot;ha&quot;, &quot;haw&quot;, &quot;he&quot;, &quot;iw&quot;, &quot;hi&quot;, &quot;hmn&quot;, &quot;hu&quot;, &quot;is&quot;, &quot;ig&quot;, &quot;id&quot;, &quot;in&quot;, &quot;ga&quot;, &quot;it&quot;, &quot;ja&quot;, &quot;jv&quot;, &quot;kn&quot;, &quot;kk&quot;, &quot;km&quot;, &quot;rw&quot;, &quot;ko&quot;, &quot;ku&quot;, &quot;ky&quot;, &quot;lo&quot;, &quot;la&quot;, &quot;lv&quot;, &quot;lt&quot;, &quot;lb&quot;, &quot;mk&quot;, &quot;mg&quot;, &quot;ms&quot;, &quot;ml&quot;, &quot;mt&quot;, &quot;mi&quot;, &quot;mr&quot;, &quot;mn&quot;, &quot;my&quot;, &quot;ne&quot;, &quot;no&quot;, &quot;ny&quot;, &quot;or&quot;, &quot;ps&quot;, &quot;fa&quot;, &quot;pl&quot;, &quot;pt&quot;, &quot;pa&quot;, &quot;ro&quot;, &quot;ru&quot;, &quot;sm&quot;, &quot;gd&quot;, &quot;sr&quot;, &quot;st&quot;, &quot;sn&quot;, &quot;sd&quot;, &quot;si&quot;, &quot;sk&quot;, &quot;sl&quot;, &quot;so&quot;, &quot;es&quot;, &quot;su&quot;, &quot;sw&quot;, &quot;sv&quot;, &quot;tl&quot;, &quot;tg&quot;, &quot;ta&quot;, &quot;tt&quot;, &quot;te&quot;, &quot;th&quot;, &quot;tr&quot;, &quot;tk&quot;, &quot;uk&quot;, &quot;ur&quot;, &quot;ug&quot;, &quot;uz&quot;, &quot;vi&quot;, &quot;cy&quot;, &quot;xh&quot;, &quot;yi&quot;, &quot;ji&quot;, &quot;yo&quot;, &quot;zu&quot;.
         */
        public TranslateText(FormattedText text, String toLanguageCode) {
            this.text = text;
            this.toLanguageCode = toLanguageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 623011058;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all pinned messages from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class UnpinAllChatMessages extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes all pinned messages from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public UnpinAllChatMessages() {
        }

        /**
         * Creates a function, which removes all pinned messages from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         */
        public UnpinAllChatMessages(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1437805385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all pinned messages from a forum topic; requires canPinMessages member right in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class UnpinAllMessageThreadMessages extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Message thread identifier in which messages will be unpinned.
         */
        public long messageThreadId;

        /**
         * Default constructor for a function, which removes all pinned messages from a forum topic; requires canPinMessages member right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public UnpinAllMessageThreadMessages() {
        }

        /**
         * Creates a function, which removes all pinned messages from a forum topic; requires canPinMessages member right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageThreadId Message thread identifier in which messages will be unpinned.
         */
        public UnpinAllMessageThreadMessages(long chatId, long messageThreadId) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1211719936;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a pinned message from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class UnpinChatMessage extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifier of the removed pinned message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which removes a pinned message from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public UnpinChatMessage() {
        }

        /**
         * Creates a function, which removes a pinned message from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageId Identifier of the removed pinned message.
         */
        public UnpinChatMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2065448670;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom; requires owner privileges. Deactivates the original basic group.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class UpgradeBasicGroupChatToSupergroupChat extends Function<Chat> {
        /**
         * Identifier of the chat to upgrade.
         */
        public long chatId;

        /**
         * Default constructor for a function, which creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom; requires owner privileges. Deactivates the original basic group.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public UpgradeBasicGroupChatToSupergroupChat() {
        }

        /**
         * Creates a function, which creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom; requires owner privileges. Deactivates the original basic group.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param chatId Identifier of the chat to upgrade.
         */
        public UpgradeBasicGroupChatToSupergroupChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 300488122;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Uploads a file with a sticker; returns the uploaded file.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class UploadStickerFile extends Function<File> {
        /**
         * Sticker file owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker format.
         */
        public StickerFormat stickerFormat;
        /**
         * File file to upload; must fit in a 512x512 square. For WEBP stickers the file must be in WEBP or PNG format, which will be converted to WEBP server-side. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which uploads a file with a sticker; returns the uploaded file.
         *
         * <p> Returns {@link File File} </p>
         */
        public UploadStickerFile() {
        }

        /**
         * Creates a function, which uploads a file with a sticker; returns the uploaded file.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param userId Sticker file owner; ignored for regular users.
         * @param stickerFormat Sticker format.
         * @param sticker File file to upload; must fit in a 512x512 square. For WEBP stickers the file must be in WEBP or PNG format, which will be converted to WEBP server-side. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements.
         */
        public UploadStickerFile(long userId, StickerFormat stickerFormat, InputFile sticker) {
            this.userId = userId;
            this.stickerFormat = stickerFormat;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 647385283;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Validates the order information provided by a user and returns the available shipping options for a flexible invoice.
     *
     * <p> Returns {@link ValidatedOrderInfo ValidatedOrderInfo} </p>
     */
    public static class ValidateOrderInfo extends Function<ValidatedOrderInfo> {
        /**
         * The invoice.
         */
        public InputInvoice inputInvoice;
        /**
         * The order information, provided by the user; pass null if empty.
         */
        public OrderInfo orderInfo;
        /**
         * Pass true to save the order information.
         */
        public boolean allowSave;

        /**
         * Default constructor for a function, which validates the order information provided by a user and returns the available shipping options for a flexible invoice.
         *
         * <p> Returns {@link ValidatedOrderInfo ValidatedOrderInfo} </p>
         */
        public ValidateOrderInfo() {
        }

        /**
         * Creates a function, which validates the order information provided by a user and returns the available shipping options for a flexible invoice.
         *
         * <p> Returns {@link ValidatedOrderInfo ValidatedOrderInfo} </p>
         *
         * @param inputInvoice The invoice.
         * @param orderInfo The order information, provided by the user; pass null if empty.
         * @param allowSave Pass true to save the order information.
         */
        public ValidateOrderInfo(InputInvoice inputInvoice, OrderInfo orderInfo, boolean allowSave) {
            this.inputInvoice = inputInvoice;
            this.orderInfo = orderInfo;
            this.allowSave = allowSave;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1248305201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that messages are being viewed by the user. Sponsored messages must be marked as viewed only when the entire text of the message is shown on the screen (excluding the button). Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels).
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ViewMessages extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The identifiers of the messages being viewed.
         */
        public long[] messageIds;
        /**
         * Source of the message view; pass null to guess the source based on chat open state.
         */
        public MessageSource source;
        /**
         * Pass true to mark as read the specified messages even the chat is closed.
         */
        public boolean forceRead;

        /**
         * Default constructor for a function, which informs TDLib that messages are being viewed by the user. Sponsored messages must be marked as viewed only when the entire text of the message is shown on the screen (excluding the button). Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels).
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ViewMessages() {
        }

        /**
         * Creates a function, which informs TDLib that messages are being viewed by the user. Sponsored messages must be marked as viewed only when the entire text of the message is shown on the screen (excluding the button). Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels).
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageIds The identifiers of the messages being viewed.
         * @param source Source of the message view; pass null to guess the source based on chat open state.
         * @param forceRead Pass true to mark as read the specified messages even the chat is closed.
         */
        public ViewMessages(long chatId, long[] messageIds, MessageSource source, boolean forceRead) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.source = source;
            this.forceRead = forceRead;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 960236656;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user viewed detailed information about a Premium feature on the Premium features screen.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ViewPremiumFeature extends Function<Ok> {
        /**
         * The viewed premium feature.
         */
        public PremiumFeature feature;

        /**
         * Default constructor for a function, which informs TDLib that the user viewed detailed information about a Premium feature on the Premium features screen.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ViewPremiumFeature() {
        }

        /**
         * Creates a function, which informs TDLib that the user viewed detailed information about a Premium feature on the Premium features screen.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param feature The viewed premium feature.
         */
        public ViewPremiumFeature(PremiumFeature feature) {
            this.feature = feature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 192950706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs the server that some trending sticker sets have been viewed by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ViewTrendingStickerSets extends Function<Ok> {
        /**
         * Identifiers of viewed trending sticker sets.
         */
        public long[] stickerSetIds;

        /**
         * Default constructor for a function, which informs the server that some trending sticker sets have been viewed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ViewTrendingStickerSets() {
        }

        /**
         * Creates a function, which informs the server that some trending sticker sets have been viewed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param stickerSetIds Identifiers of viewed trending sticker sets.
         */
        public ViewTrendingStickerSets(long[] stickerSetIds) {
            this.stickerSetIds = stickerSetIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -952416520;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Writes a part of a generated file. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct write to the destination file.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class WriteGeneratedFilePart extends Function<Ok> {
        /**
         * The identifier of the generation process.
         */
        public long generationId;
        /**
         * The offset from which to write the data to the file.
         */
        public long offset;
        /**
         * The data to write.
         */
        public byte[] data;

        /**
         * Default constructor for a function, which writes a part of a generated file. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct write to the destination file.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public WriteGeneratedFilePart() {
        }

        /**
         * Creates a function, which writes a part of a generated file. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct write to the destination file.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param generationId The identifier of the generation process.
         * @param offset The offset from which to write the data to the file.
         * @param data The data to write.
         */
        public WriteGeneratedFilePart(long generationId, long offset, byte[] data) {
            this.generationId = generationId;
            this.offset = offset;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 214474389;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

}
