From 3b621f0075ff6774e94716765a8572c6f98a2b1a Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 10 Jun 2021 01:15:00 +0400 Subject: [PATCH] Combo update --- .../BroadcastUploadExtension.swift | 9 +- .../Telegram-iOS/AlternateIcons-iPad.plist | 40 + Telegram/Telegram-iOS/AlternateIcons.plist | 40 + Telegram/Telegram-iOS/New1_120x120.png | Bin 0 -> 8737 bytes Telegram/Telegram-iOS/New1_152x152.png | Bin 0 -> 12770 bytes Telegram/Telegram-iOS/New1_167x167.png | Bin 0 -> 14404 bytes Telegram/Telegram-iOS/New1_180x180.png | Bin 0 -> 16247 bytes Telegram/Telegram-iOS/New1_20x20.png | Bin 0 -> 889 bytes Telegram/Telegram-iOS/New1_29x29.png | Bin 0 -> 1411 bytes Telegram/Telegram-iOS/New1_40x40.png | Bin 0 -> 2081 bytes Telegram/Telegram-iOS/New1_58x58.png | Bin 0 -> 3246 bytes Telegram/Telegram-iOS/New1_60x60.png | Bin 0 -> 3422 bytes Telegram/Telegram-iOS/New1_76x76.png | Bin 0 -> 4665 bytes Telegram/Telegram-iOS/New1_80x80.png | Bin 0 -> 5048 bytes Telegram/Telegram-iOS/New1_87x87.png | Bin 0 -> 5670 bytes Telegram/Telegram-iOS/New2_120x120.png | Bin 0 -> 9143 bytes Telegram/Telegram-iOS/New2_152x152.png | Bin 0 -> 13454 bytes Telegram/Telegram-iOS/New2_167x167.png | Bin 0 -> 15384 bytes Telegram/Telegram-iOS/New2_180x180.png | Bin 0 -> 17358 bytes Telegram/Telegram-iOS/New2_20x20.png | Bin 0 -> 917 bytes Telegram/Telegram-iOS/New2_29x29.png | Bin 0 -> 1467 bytes Telegram/Telegram-iOS/New2_40x40.png | Bin 0 -> 2094 bytes Telegram/Telegram-iOS/New2_58x58.png | Bin 0 -> 3364 bytes Telegram/Telegram-iOS/New2_60x60.png | Bin 0 -> 3543 bytes Telegram/Telegram-iOS/New2_76x76.png | Bin 0 -> 4835 bytes Telegram/Telegram-iOS/New2_80x80.png | Bin 0 -> 5181 bytes Telegram/Telegram-iOS/New2_87x87.png | Bin 0 -> 5914 bytes .../Telegram-iOS/en.lproj/Localizable.strings | 14 + .../example-configuration/provisioning/BUILD | 1 + .../BroadcastUpload.mobileprovision | Bin 0 -> 4643 bytes ....Telegraph.BroadcastUpload.mobileprovision | Bin 0 -> 4643 bytes .../Sources/PresentationCallManager.swift | 48 +- submodules/AudioBlob/Sources/BlobView.swift | 12 +- .../AvatarNode/Sources/PeerAvatar.swift | 2 +- .../ChatPlayingActivityContentNode.swift | 2 +- ...hatRecordingVideoActivityContentNode.swift | 2 +- ...hatRecordingVoiceActivityContentNode.swift | 4 +- .../ChatTitleActivityContentNode.swift | 6 +- .../Sources/ChatTitleActivityNode.swift | 4 +- .../ChatTypingActivityContentNode.swift | 2 +- .../ChatUploadingActivityContentNode.swift | 2 +- .../ContextUI/Sources/ContextController.swift | 16 +- .../DeviceAccess/Sources/DeviceAccess.swift | 32 +- .../ContainedViewLayoutTransition.swift | 22 +- submodules/Display/Source/Font.swift | 18 +- .../Display/Source/LinkHighlightingNode.swift | 17 +- submodules/Display/Source/NavigationBar.swift | 24 +- submodules/Display/Source/UIKitUtils.swift | 23 +- .../GalleryUI/Sources/GalleryController.swift | 17 + .../Sources/GalleryControllerNode.swift | 8 + .../GalleryUI/Sources/GalleryItemNode.swift | 1 + .../GalleryUI/Sources/GalleryPagerNode.swift | 2 + .../Items/UniversalVideoGalleryItem.swift | 6 +- .../Sources/SoftwareGradientBackground.swift | 200 +- submodules/ListMessageItem/BUILD | 1 + .../Sources/ListMessageSnippetItemNode.swift | 19 +- submodules/MtProtoKit/Sources/MTProto.m | 20 +- .../Sources/PeerInfoAvatarListNode.swift | 6 + ...GroupInfoSearchNavigationContentNode.swift | 2 +- submodules/Postbox/Sources/Peer.swift | 2 +- .../SearchBarNode/Sources/SearchBarNode.swift | 4 +- .../Sources/SearchDisplayController.swift | 2 +- .../Themes/SettingsThemeWallpaperNode.swift | 3 +- .../Themes/ThemeAccentColorController.swift | 8 +- .../ThemeAccentColorControllerNode.swift | 190 +- .../Themes/ThemeSettingsAppIconItem.swift | 4 + .../Themes/WallpaperColorPanelNode.swift | 4 +- .../Themes/WallpaperGalleryController.swift | 22 +- .../Sources/Themes/WallpaperGalleryItem.swift | 22 +- .../Themes/WallpaperPatternPanelNode.swift | 55 +- .../StickerPackPreviewControllerNode.swift | 8 +- .../Sources/StickerPreviewPeekContent.swift | 2 +- .../Sources/CloudFileMediaResource.swift | 56 + .../SyncCore/Sources/SecretChatState.swift | 2 +- submodules/TelegramApi/Sources/Api0.swift | 12 +- submodules/TelegramApi/Sources/Api2.swift | 156 +- submodules/TelegramApi/Sources/Api4.swift | 10 +- submodules/TelegramCallsUI/BUILD | 1 + .../Sources/CallControllerButtonsNode.swift | 11 + .../Sources/CallControllerNode.swift | 46 +- .../Sources/GroupVideoNode.swift | 81 +- .../Sources/PresentationCall.swift | 2 +- .../Sources/PresentationGroupCall.swift | 284 +- .../Sources/VoiceChatActionButton.swift | 14 +- .../VoiceChatCameraPreviewController.swift | 91 +- .../Sources/VoiceChatController.swift | 1545 ++- .../VoiceChatFullscreenParticipantItem.swift | 245 +- ...tton.swift => VoiceChatHeaderButton.swift} | 47 +- .../Sources/VoiceChatMainStageNode.swift | 380 +- .../Sources/VoiceChatPeerProfileNode.swift | 12 +- .../Sources/VoiceChatTileGridNode.swift | 98 +- .../Sources/VoiceChatTileItemNode.swift | 289 +- .../Sources/VoiceChatTitleNode.swift | 24 +- submodules/TelegramCore/Sources/Account.swift | 4 +- .../TelegramCore/Sources/AccountManager.swift | 19 + .../Sources/ApiUtils/Wallpaper.swift | 6 +- .../TelegramCore/Sources/GroupCalls.swift | 201 +- .../SecretChats/UpdateSecretChat.swift | 2 +- .../TelegramCore/Sources/State/Fetch.swift | 15 + .../ManagedSecretChatOutgoingOperations.swift | 2 +- ...ecretChatIncomingDecryptedOperations.swift | 4 +- .../Sources/DefaultDayPresentationTheme.swift | 27 +- .../Sources/MakePresentationTheme.swift | 2 - .../Sources/PresentationStrings.swift | 8950 +++++++++-------- .../Sources/PresentationThemeCodable.swift | 8 +- .../Resources/PresentationResourceKey.swift | 5 +- .../Resources/PresentationResourcesChat.swift | 19 +- .../Context Menu/Noise.imageset/Contents.json | 12 + .../Noise.imageset/ic_noisecancellation.pdf | Bin 0 -> 4169 bytes .../Call/PanelIcon.imageset/Contents.json | 12 + .../Call/PanelIcon.imageset/ic_panel.pdf | Bin 0 -> 4146 bytes .../Call/Pause.imageset/Contents.json | 12 + .../Call/Pause.imageset/wait.pdf | Bin 0 -> 4289 bytes .../ScreenSharePhone.imageset/Contents.json | 12 + .../sharingscreen (1).pdf | Bin 0 -> 4212 bytes .../ScreenShareTablet.imageset/Contents.json | 12 + .../sharingscreenipad (1).pdf | Bin 0 -> 4686 bytes .../Resources/PresentationStrings.mapping | Bin 172470 -> 172843 bytes .../Resources/fqv01SQemVIBAAAApND8LDRUhRU.tgv | Bin 0 -> 183832 bytes .../TelegramUI/Sources/AppDelegate.swift | 5 +- .../TelegramUI/Sources/ChatController.swift | 29 +- .../Sources/ChatControllerInteraction.swift | 6 +- .../Sources/ChatControllerNode.swift | 10 +- .../TelegramUI/Sources/ChatEmptyNode.swift | 19 +- .../Sources/ChatHistoryListNode.swift | 4 +- .../ChatInstantVideoMessageDurationNode.swift | 54 +- .../TelegramUI/Sources/ChatLoadingNode.swift | 18 +- .../Sources/ChatMediaInputNode.swift | 49 +- .../ChatMediaInputStickerGridItem.swift | 2 +- .../Sources/ChatMediaInputTrendingPane.swift | 2 +- .../Sources/ChatMessageActionItemNode.swift | 94 +- .../ChatMessageAnimatedStickerItemNode.swift | 101 +- .../Sources/ChatMessageBubbleBackdrop.swift | 31 +- .../ChatMessageBubbleContentNode.swift | 9 + .../Sources/ChatMessageBubbleItemNode.swift | 17 +- .../ChatMessageDateAndStatusNode.swift | 78 +- .../Sources/ChatMessageDateHeader.swift | 22 +- ...atMessageInteractiveInstantVideoNode.swift | 41 +- .../ChatMessageInteractiveMediaNode.swift | 2 + .../Sources/ChatMessageStickerItemNode.swift | 39 +- .../ChatPanelInterfaceInteraction.swift | 4 +- .../Sources/ChatRecentActionsController.swift | 2 +- .../ChatRecentActionsControllerNode.swift | 2 +- ...ntActionsSearchNavigationContentNode.swift | 2 +- .../Sources/ChatReplyCountItem.swift | 69 +- .../Sources/DrawingStickersScreen.swift | 6 +- .../Sources/FeaturedStickersScreen.swift | 8 +- ...textResultsChatInputContextPanelNode.swift | 2 +- ...rizontalStickersChatContextPanelNode.swift | 6 +- .../Sources/InlineReactionSearchPanel.swift | 6 +- .../TelegramUI/Sources/LegacyCache.swift | 14 - .../Sources/NotificationContentContext.swift | 2 +- .../OverlayAudioPlayerControllerNode.swift | 2 +- .../Sources/PeerInfo/PeerInfoScreen.swift | 4 +- .../Sources/ShareExtensionContext.swift | 2 +- .../Sources/SharedAccountContext.swift | 4 +- .../StickerPaneSearchContentNode.swift | 4 +- .../StickersChatInputContextPanelItem.swift | 2 +- .../StickersChatInputContextPanelNode.swift | 4 +- .../TelegramAccountAuxiliaryMethods.swift | 22 + .../Sources/GroupCallContext.swift | 125 +- .../Sources/IpcGroupCallContext.swift | 18 +- .../Sources/OngoingCallContext.swift | 120 +- .../OngoingCallThreadLocalContext.h | 25 +- .../Sources/OngoingCallThreadLocalContext.mm | 202 +- submodules/TgVoipWebrtc/tgcalls | 2 +- .../Sources/UndoOverlayControllerNode.swift | 4 +- .../Sources/WallpaperBackgroundNode.swift | 100 +- .../Sources/WallpaperResources.swift | 107 +- third-party/libvpx/BUILD | 2 +- third-party/libvpx/build-libvpx-bazel.sh | 6 +- third-party/webrtc/BUILD | 86 +- third-party/webrtc/webrtc | 2 +- 173 files changed, 8865 insertions(+), 6411 deletions(-) create mode 100644 Telegram/Telegram-iOS/New1_120x120.png create mode 100644 Telegram/Telegram-iOS/New1_152x152.png create mode 100644 Telegram/Telegram-iOS/New1_167x167.png create mode 100644 Telegram/Telegram-iOS/New1_180x180.png create mode 100644 Telegram/Telegram-iOS/New1_20x20.png create mode 100644 Telegram/Telegram-iOS/New1_29x29.png create mode 100644 Telegram/Telegram-iOS/New1_40x40.png create mode 100644 Telegram/Telegram-iOS/New1_58x58.png create mode 100644 Telegram/Telegram-iOS/New1_60x60.png create mode 100644 Telegram/Telegram-iOS/New1_76x76.png create mode 100644 Telegram/Telegram-iOS/New1_80x80.png create mode 100644 Telegram/Telegram-iOS/New1_87x87.png create mode 100644 Telegram/Telegram-iOS/New2_120x120.png create mode 100644 Telegram/Telegram-iOS/New2_152x152.png create mode 100644 Telegram/Telegram-iOS/New2_167x167.png create mode 100644 Telegram/Telegram-iOS/New2_180x180.png create mode 100644 Telegram/Telegram-iOS/New2_20x20.png create mode 100644 Telegram/Telegram-iOS/New2_29x29.png create mode 100644 Telegram/Telegram-iOS/New2_40x40.png create mode 100644 Telegram/Telegram-iOS/New2_58x58.png create mode 100644 Telegram/Telegram-iOS/New2_60x60.png create mode 100644 Telegram/Telegram-iOS/New2_76x76.png create mode 100644 Telegram/Telegram-iOS/New2_80x80.png create mode 100644 Telegram/Telegram-iOS/New2_87x87.png create mode 100644 build-system/example-configuration/provisioning/BroadcastUpload.mobileprovision create mode 100644 build-system/fake-codesigning/profiles/appstore/AppStore_ph.telegra.Telegraph.BroadcastUpload.mobileprovision rename submodules/TelegramCallsUI/Sources/{VoiceChatOptionsButton.swift => VoiceChatHeaderButton.swift} (88%) create mode 100644 submodules/TelegramUI/Images.xcassets/Call/Context Menu/Noise.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Call/Context Menu/Noise.imageset/ic_noisecancellation.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Call/PanelIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Call/PanelIcon.imageset/ic_panel.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Call/Pause.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Call/Pause.imageset/wait.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Call/ScreenSharePhone.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Call/ScreenSharePhone.imageset/sharingscreen (1).pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Call/ScreenShareTablet.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Call/ScreenShareTablet.imageset/sharingscreenipad (1).pdf create mode 100644 submodules/TelegramUI/Resources/fqv01SQemVIBAAAApND8LDRUhRU.tgv delete mode 100644 submodules/TelegramUI/Sources/LegacyCache.swift diff --git a/Telegram/BroadcastUpload/BroadcastUploadExtension.swift b/Telegram/BroadcastUpload/BroadcastUploadExtension.swift index 9fcb952043..465763a5ba 100644 --- a/Telegram/BroadcastUpload/BroadcastUploadExtension.swift +++ b/Telegram/BroadcastUpload/BroadcastUploadExtension.swift @@ -164,9 +164,14 @@ private func rootPathForBasePath(_ appGroupPath: String) -> String { guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return } - + var orientation = CGImagePropertyOrientation.up + if #available(iOS 11.0, *) { + if let orientationAttachment = CMGetAttachment(sampleBuffer, key: RPVideoSampleOrientationKey as CFString, attachmentModeOut: nil) as? NSNumber { + orientation = CGImagePropertyOrientation(rawValue: orientationAttachment.uint32Value) ?? .up + } + } if let data = serializePixelBuffer(buffer: pixelBuffer) { - self.screencastBufferClientContext?.setCurrentFrame(data: data) + self.screencastBufferClientContext?.setCurrentFrame(data: data, orientation: orientation) } //self.videoCapturer?.injectSampleBuffer(sampleBuffer) diff --git a/Telegram/Telegram-iOS/AlternateIcons-iPad.plist b/Telegram/Telegram-iOS/AlternateIcons-iPad.plist index 2d3b5e8409..a9ebd9173d 100644 --- a/Telegram/Telegram-iOS/AlternateIcons-iPad.plist +++ b/Telegram/Telegram-iOS/AlternateIcons-iPad.plist @@ -72,4 +72,44 @@ UIPrerenderedIcon + New1 + + CFBundleIconFiles + + New1_20x20 + New1_29x29 + New1_40x40 + New1_58x58 + New1_60x60 + New1_76x76 + New1_80x80 + New1_87x87 + New1_120x120 + New1_152x152 + New1_167x167 + New1_180x180 + + UIPrerenderedIcon + + + New2 + + CFBundleIconFiles + + New2_20x20 + New2_29x29 + New2_40x40 + New2_58x58 + New2_60x60 + New2_76x76 + New2_80x80 + New2_87x87 + New2_120x120 + New2_152x152 + New2_167x167 + New2_180x180 + + UIPrerenderedIcon + + \ No newline at end of file diff --git a/Telegram/Telegram-iOS/AlternateIcons.plist b/Telegram/Telegram-iOS/AlternateIcons.plist index 99a0e7039a..d97e8c714a 100644 --- a/Telegram/Telegram-iOS/AlternateIcons.plist +++ b/Telegram/Telegram-iOS/AlternateIcons.plist @@ -66,4 +66,44 @@ UIPrerenderedIcon + New1 + + CFBundleIconFiles + + New1_20x20 + New1_29x29 + New1_40x40 + New1_58x58 + New1_60x60 + New1_76x76 + New1_80x80 + New1_87x87 + New1_120x120 + New1_152x152 + New1_167x167 + New1_180x180 + + UIPrerenderedIcon + + + New2 + + CFBundleIconFiles + + New2_20x20 + New2_29x29 + New2_40x40 + New2_58x58 + New2_60x60 + New2_76x76 + New2_80x80 + New2_87x87 + New2_120x120 + New2_152x152 + New2_167x167 + New2_180x180 + + UIPrerenderedIcon + + \ No newline at end of file diff --git a/Telegram/Telegram-iOS/New1_120x120.png b/Telegram/Telegram-iOS/New1_120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..70ddc32cbec486af27c088f6baa924ea176926a0 GIT binary patch literal 8737 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 LNkvXXu0mjf*q#*V literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New1_152x152.png b/Telegram/Telegram-iOS/New1_152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..32adc011d1af6e010d6b12671e9007df3cf7e168 GIT binary patch literal 12770 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New1_167x167.png b/Telegram/Telegram-iOS/New1_167x167.png new file mode 100644 index 0000000000000000000000000000000000000000..93238e0c7f41ecc223140d53cb71c1c45f33f6c6 GIT binary patch literal 14404 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 Iq)EvC0PX36JOBUy literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New1_180x180.png b/Telegram/Telegram-iOS/New1_180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..ced492fd40246ff51938a88ae129dff5cdbce511 GIT binary patch literal 16247 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 P00000NkvXXu0mjfBI}vS literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New1_29x29.png b/Telegram/Telegram-iOS/New1_29x29.png new file mode 100644 index 0000000000000000000000000000000000000000..6387cb01bdebd558ef1d6f2abaf015fa961bec9e GIT binary patch literal 1411 zcmV-}1$_F6P)5GzE4C4K>H`4{Y2utLBJi9m$d zL`Z<-5Q9M>JVJ1Y^RS)R!84xmyn4EeQ&l~W_6&~Y1vR>=>h9_K>fC$lRtv?3|FgV2 zjv_#to>1}?-c!QfgK!|tJ^hTPG*C|~fJ@&11N&%k#WAIRCdA4I4}nbCfIJPP>s)0` zk3~(bSwO=J=Dw_{)gCJGIjuJdyfwpwOSMuR^j1fR>1 zKFAjbAx3+lzGCvt-Jr?{s^LFeWkw&XtF1#dkMF2MK^7h~sI&x-0w1-|f1EJbLyjUd#-SG$TgRzYf&%y7}{Ufm830rLxVuT~2SPm)ut zFdVCNJzq&mfuMcTT5n{PQCfqt+;O``N(Z{)G1cu5-FWF{1Vj@&8keH+>^$(0i+Jf} zCfb(MYm>VoG)k>HNvH^;gqj+z|F7<+Gn01Kb#@u5%tZaVh?rYbKR~Oya z&G>Z&p&4u2qbf*-W#&W~9qACgZ$HsoD&rq!U8KBsj>jK+9?xbQWt-F$YGXbtXk%g( zSvm_s_tr|ZvQ|j<1|3Os&kV+EbF+JE?Ma@w@4mnV=!Yr-!CD@z@S+9^NtiXW09rNW zA$?{q+yjZNi1uHDuS{C_I~SQWtX7o>rvL0J+v~Nvyyxk$Ie*#fJ;`xrT43b$4(xfn z{eIr|YcR(czkeC{@MrEpUh6fdn`2uW^L{tu+wX-q#?txJaS^N4TbdF(`NChO+PS;H z=RBVm)?hYm4LH^fOz;zEV#t1jB~y=@ZHLfy?LHT>zX!W%1{z{_O<;FT{R_W=fCsS9 RV_^UQ002ovPDHLkV1hA=j&%S4 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New1_40x40.png b/Telegram/Telegram-iOS/New1_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..e29005ac4e2440c840ed9e6cfb90acd24843a1b1 GIT binary patch literal 2081 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New1_60x60.png b/Telegram/Telegram-iOS/New1_60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..54a04f2c27fb087d9f7d6435d53c065a276e2458 GIT binary patch literal 3422 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New1_80x80.png b/Telegram/Telegram-iOS/New1_80x80.png new file mode 100644 index 0000000000000000000000000000000000000000..fb4f4a6122062dff0dfc70800667bc9773ba0591 GIT binary patch literal 5048 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_120x120.png b/Telegram/Telegram-iOS/New2_120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..85de9e3fab6fe7958dca7bc874ecb12bfd6b3ddd GIT binary patch literal 9143 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 Bz&QW_ literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_152x152.png b/Telegram/Telegram-iOS/New2_152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..d94dc86c61f2df544cd653e2809b81ac93d819ae GIT binary patch literal 13454 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_167x167.png b/Telegram/Telegram-iOS/New2_167x167.png new file mode 100644 index 0000000000000000000000000000000000000000..813a39a5bdbcce1254b1f7906952a727bfffa282 GIT binary patch literal 15384 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_180x180.png b/Telegram/Telegram-iOS/New2_180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..a083c562d442fa7043865f4b2ce9afd04e51326b GIT binary patch literal 17358 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 VmL}|>YF_{V002ovPDHLkV1iqK$nXFF literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_40x40.png b/Telegram/Telegram-iOS/New2_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2d70eada0cde9ae3a18bf3e350d4fac7eb0f5d GIT binary patch literal 2094 zcmV+}2+{Y6P)+W6 zg8%o^RuIMdRHWIp*P3RC#X;0YX|exJV^+ihw)Ik*_D;-}S%1otvQ#PC%t zeL%hM`UJ2YG*Ap{@YTWNc%<~;wm`QGSibQRe!hGOHFFDL2B^(X#t{*`ws370Dy!;a z!>94+@Pk{Kc5}c=a~VS(J&2eL2V@mJr%!upy37%!$P zn*y2usuVQwn*!>oD3h0dJ7il?% zVllx+a%^~fBQ+TqZj5{nwx|;2LK@Gbj=XA!6+}smJzj`kPJE{;AG@}?a)o|XR3N52 z)dE>uAOT%Z;}CxUO0x|DsoAmQoN>OU{>%A$@Ppl-$1lcCVnFRegEUO6PCC~K-^2lu2Ce*L}Y z@a)=Ur(UC_q~xQaxMOEmXgLBsn=Q>T|S<^I&r%8=K!mG3^7##^bWIU4mgoB^n zmB*RkB4$SSV8rWA@#`^Vs0m3kBc{N4$oXg_oPS^aAHFg4#omCwd5b zPXQOGaHaYMjzC#OWql)R+G9g%PVez>W<0>mgz5sTMh4}j8vasU#f3wAGw0^lSLp@> ztPN$HM#HnYuF!(zV&TWPJA;ud;LV23e{hYkdS0TY4L2W8j{&ov2Bt@|P^oHFjmIyq zp%fT`+lR@VpH+{xPUxHzp&^S6K_+l67dhWPEE zNZ6B$RHNnTiow%YHI5DC@Z9}jm$FvDI^}XsqM!;*PNYX zIBeP$Y8;xJ++4{7EsF`X;g+6~m+t{M1dN6@)TRy6xSo}*-lCAcYkfGCc^^7=d~>+@ z4m0u>;9?bK{NE7$^Z$HqRhrdEDw zbHK$q=UXUMthkbO-dRoxC-J{jxGVF$4B$ie+Es-i18qUQHdwSlqHV1FBJJUSqjdP7 zKj8eT1vIfW@i`w8U|t{Tc&7NN{(#@4YSqd{uN^Wm)dp#tubjWQVj;^f_W`WYR1QqB zk}-kB7R(r{9^1)*@&15Z1do2kLZSmwdSgu`Dkh4$bmClnlEOXp4^nfj18_xIwOB#z z6m+H>+|2L+OooG*?{z(}E>gvQ;SWIVmIKmuPv(mloPF(lIp&|prRKYzOTOWCjcoRQ z;9+{X@cd1K@4rr~pCmZ_HSp`w8|szEJ}uz>I<6c#On~`~0lEG7zra)faRuWbxg~JM z!NqKzgY+#J1IkwEe2;FReHRV}r{4IqsuP&vKB$X7duIu=6XTsI{r@zb{wwgWrB+ol zC>M}!hiiv)s-eS-sB7W)W^xVZizwF+J2s^8!r|WUar(a9`qe35|8N$BmFvt$iL7Z` zHQxwua9^Bgxqdy=o+~*$x?itFerrkFZKrdO2ObbjUpb4b5 zU?xtg-pW1|=5YRS36pt$`+(dIFyz;OBjYUtGIp4TPNC%tlUU5rR3#Qz$6905b z;r!7YCJP(y-&=lp^plI$l*`5Bc~-%#*l--$V>D-ZAX6i YhmqYu=_h~Kvj6}907*qoM6N<$g4W&o&;S4c literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_58x58.png b/Telegram/Telegram-iOS/New2_58x58.png new file mode 100644 index 0000000000000000000000000000000000000000..37e2e15d18ad2797f2aeb5d9ed127324fc05bf65 GIT binary patch literal 3364 zcmV+<4cqdGP)&J~%oyEsnmZ)bWwQQt(wW`~yH$W_&=zC&vew z!Et=>L1|@hoPm#3YoD|4kKB8chB_m=vuE$~ zDtP75x7f8{tz@J~f~P+`#hh%A{+J9&ai1;zpHE1avx`!`llV;P~8W zf}6m*l}ot1IDr_JOvs{O;M$nN!`9*kY>j)dvv>=>y!I{(b`Ic^C}uT-(ck7S;MwWd z@%Onht`cl)5&}x8O&z2Ml|Jgv8H*mX247iwC%)eOMSNlPpzW%F{_g5K_|?=Kczf{! zdg0W;MFbfuq=VJ-3?s*o>p%``MCI7Xxm!r-`+M#s=)Jhka($p9bC>bt$7A>_DJiOX zNbS2eRF$tM0lX-itL&Afb5_CWm`(eq{Xf9w_$I8dtQ_>w56AG#mD3bhDj7(ooL5s} z<-7ojqDjqXYRy_ro9_*PALuzi^4y}`tHY;cv%s9d7$NmIUG253TG=b4$ebLOVCD+O$f9U zY28+K07%hSJj0{SPk(wtdj@!aNR?-zLae2f|Q5;#BpDHUw^{TJ?E>t1;)m z=feo?RHnMUumL}7AGSTv^1=f4zjwx&EgV4VS_fwYPM|B)ros6nJFZfz0ld5Jj|0EX z@3)yL7j23TYPZKdc#48l8?fzx-t*6KjLpr`-8rC#u>RPqob{`f_R5<&-%Wzl6Q-eh zg}LpZ≪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 RZxa9j002ovPDHLkV1i>C))D{! literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_76x76.png b/Telegram/Telegram-iOS/New2_76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..ca043ed33970119c89cdfb24d2be9a3e550c6504 GIT binary patch literal 4835 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 JPDHLkV1hZlfN=l- literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_80x80.png b/Telegram/Telegram-iOS/New2_80x80.png new file mode 100644 index 0000000000000000000000000000000000000000..6750299df3f9bc868b37cb1b4b625fa3cab0cee2 GIT binary patch literal 5181 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/New2_87x87.png b/Telegram/Telegram-iOS/New2_87x87.png new file mode 100644 index 0000000000000000000000000000000000000000..181568104736e31203c164d53aad4b389439691c GIT binary patch literal 5914 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 literal 0 HcmV?d00001 diff --git a/build-system/fake-codesigning/profiles/appstore/AppStore_ph.telegra.Telegraph.BroadcastUpload.mobileprovision b/build-system/fake-codesigning/profiles/appstore/AppStore_ph.telegra.Telegraph.BroadcastUpload.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..1d29a80307ca0db531b0eaa23b98f223773bba4b GIT binary patch literal 4643 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 literal 0 HcmV?d00001 diff --git a/submodules/AccountContext/Sources/PresentationCallManager.swift b/submodules/AccountContext/Sources/PresentationCallManager.swift index f1c1d910c2..d954c7b175 100644 --- a/submodules/AccountContext/Sources/PresentationCallManager.swift +++ b/submodules/AccountContext/Sources/PresentationCallManager.swift @@ -321,57 +321,51 @@ public struct PresentationGroupCallRequestedVideo { case full } + public struct SsrcGroup { + public var semantics: String + public var ssrcs: [UInt32] + } + public var audioSsrc: UInt32 public var endpointId: String - public var videoInformation: String - public var quality: Quality + public var ssrcGroups: [SsrcGroup] + public var minQuality: Quality + public var maxQuality: Quality } public extension GroupCallParticipantsContext.Participant { var videoEndpointId: String? { - if let jsonParams = self.videoJsonDescription, let jsonData = jsonParams.data(using: .utf8), let json = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { - if let endpoint = json["endpoint"] as? String { - return endpoint - } - } - return nil + return self.videoDescription?.endpointId } var presentationEndpointId: String? { - if let jsonParams = self.presentationJsonDescription, let jsonData = jsonParams.data(using: .utf8), let json = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { - if let endpoint = json["endpoint"] as? String { - return endpoint - } - } - return nil + return self.presentationDescription?.endpointId } } public extension GroupCallParticipantsContext.Participant { - func requestedVideoChannel(quality: PresentationGroupCallRequestedVideo.Quality) -> PresentationGroupCallRequestedVideo? { + func requestedVideoChannel(minQuality: PresentationGroupCallRequestedVideo.Quality, maxQuality: PresentationGroupCallRequestedVideo.Quality) -> PresentationGroupCallRequestedVideo? { guard let audioSsrc = self.ssrc else { return nil } - guard let videoInformation = self.videoJsonDescription else { + guard let videoDescription = self.videoDescription else { return nil } - guard let videoEndpointId = self.videoEndpointId else { - return nil - } - return PresentationGroupCallRequestedVideo(audioSsrc: audioSsrc, endpointId: videoEndpointId, videoInformation: videoInformation, quality: quality) + return PresentationGroupCallRequestedVideo(audioSsrc: audioSsrc, endpointId: videoDescription.endpointId, ssrcGroups: videoDescription.ssrcGroups.map { group in + PresentationGroupCallRequestedVideo.SsrcGroup(semantics: group.semantics, ssrcs: group.ssrcs) + }, minQuality: minQuality, maxQuality: maxQuality) } - func requestedPresentationVideoChannel(quality: PresentationGroupCallRequestedVideo.Quality) -> PresentationGroupCallRequestedVideo? { + func requestedPresentationVideoChannel(minQuality: PresentationGroupCallRequestedVideo.Quality, maxQuality: PresentationGroupCallRequestedVideo.Quality) -> PresentationGroupCallRequestedVideo? { guard let audioSsrc = self.ssrc else { return nil } - guard let videoInformation = self.presentationJsonDescription else { + guard let presentationDescription = self.presentationDescription else { return nil } - guard let presentationEndpointId = self.presentationEndpointId else { - return nil - } - return PresentationGroupCallRequestedVideo(audioSsrc: audioSsrc, endpointId: presentationEndpointId, videoInformation: videoInformation, quality: quality) + return PresentationGroupCallRequestedVideo(audioSsrc: audioSsrc, endpointId: presentationDescription.endpointId, ssrcGroups: presentationDescription.ssrcGroups.map { group in + PresentationGroupCallRequestedVideo.SsrcGroup(semantics: group.semantics, ssrcs: group.ssrcs) + }, minQuality: minQuality, maxQuality: maxQuality) } } @@ -438,7 +432,7 @@ public protocol PresentationGroupCall: class { var inviteLinks: Signal { get } func makeIncomingVideoView(endpointId: String, requestClone: Bool, completion: @escaping (PresentationCallVideoView?, PresentationCallVideoView?) -> Void) - func makeOutgoingVideoView(completion: @escaping (PresentationCallVideoView?) -> Void) + func makeOutgoingVideoView(requestClone: Bool, completion: @escaping (PresentationCallVideoView?, PresentationCallVideoView?) -> Void) func loadMoreMembers(token: String) } diff --git a/submodules/AudioBlob/Sources/BlobView.swift b/submodules/AudioBlob/Sources/BlobView.swift index 7eaaa19b9e..af208c1254 100644 --- a/submodules/AudioBlob/Sources/BlobView.swift +++ b/submodules/AudioBlob/Sources/BlobView.swift @@ -192,11 +192,13 @@ final class BlobView: UIView { var level: CGFloat = 0 { didSet { - CATransaction.begin() - CATransaction.setDisableActions(true) - let lv = self.minScale + (self.maxScale - self.minScale) * self.level - self.shapeLayer.transform = CATransform3DMakeScale(lv, lv, 1) - CATransaction.commit() + if abs(self.level - oldValue) > 0.01 { + CATransaction.begin() + CATransaction.setDisableActions(true) + let lv = self.minScale + (self.maxScale - self.minScale) * self.level + self.shapeLayer.transform = CATransform3DMakeScale(lv, lv, 1) + CATransaction.commit() + } } } diff --git a/submodules/AvatarNode/Sources/PeerAvatar.swift b/submodules/AvatarNode/Sources/PeerAvatar.swift index b32eaeee81..2df704b1fb 100644 --- a/submodules/AvatarNode/Sources/PeerAvatar.swift +++ b/submodules/AvatarNode/Sources/PeerAvatar.swift @@ -121,7 +121,7 @@ public func peerAvatarCompleteImage(account: Account, peer: Peer, size: CGSize, context.clear(CGRect(origin: CGPoint(), size: size)) drawPeerAvatarLetters(context: context, size: CGSize(width: size.width, height: size.height), round: round, font: font, letters: displayLetters, peerId: peerId) if blurred { - context.setFillColor(UIColor(rgb: 0x000000, alpha: 0.45).cgColor) + context.setFillColor(UIColor(rgb: 0x000000, alpha: 0.5).cgColor) context.fill(CGRect(origin: CGPoint(), size: size)) } })?.withRenderingMode(.alwaysOriginal) diff --git a/submodules/ChatTitleActivityNode/Sources/ChatPlayingActivityContentNode.swift b/submodules/ChatTitleActivityNode/Sources/ChatPlayingActivityContentNode.swift index d2d707ed8e..4dea30d2bf 100644 --- a/submodules/ChatTitleActivityNode/Sources/ChatPlayingActivityContentNode.swift +++ b/submodules/ChatTitleActivityNode/Sources/ChatPlayingActivityContentNode.swift @@ -100,7 +100,7 @@ class ChatPlayingActivityContentNode: ChatTitleActivityContentNode { self.addSubnode(self.indicatorNode) } - override func updateLayout(_ constrainedSize: CGSize, alignment: NSTextAlignment) -> CGSize { + override func updateLayout(_ constrainedSize: CGSize, offset: CGFloat, alignment: NSTextAlignment) -> CGSize { let size = self.textNode.updateLayout(constrainedSize) let indicatorSize = CGSize(width: 24.0, height: 16.0) let originX: CGFloat diff --git a/submodules/ChatTitleActivityNode/Sources/ChatRecordingVideoActivityContentNode.swift b/submodules/ChatTitleActivityNode/Sources/ChatRecordingVideoActivityContentNode.swift index 6fc499972a..1ff4e9a4c9 100644 --- a/submodules/ChatTitleActivityNode/Sources/ChatRecordingVideoActivityContentNode.swift +++ b/submodules/ChatTitleActivityNode/Sources/ChatRecordingVideoActivityContentNode.swift @@ -72,7 +72,7 @@ class ChatRecordingVideoActivityContentNode: ChatTitleActivityContentNode { self.addSubnode(self.indicatorNode) } - override func updateLayout(_ constrainedSize: CGSize, alignment: NSTextAlignment) -> CGSize { + override func updateLayout(_ constrainedSize: CGSize, offset: CGFloat, alignment: NSTextAlignment) -> CGSize { let size = self.textNode.updateLayout(constrainedSize) let indicatorSize = CGSize(width: 24.0, height: 16.0) let originX: CGFloat diff --git a/submodules/ChatTitleActivityNode/Sources/ChatRecordingVoiceActivityContentNode.swift b/submodules/ChatTitleActivityNode/Sources/ChatRecordingVoiceActivityContentNode.swift index 768d827f63..a5d1d03a12 100644 --- a/submodules/ChatTitleActivityNode/Sources/ChatRecordingVoiceActivityContentNode.swift +++ b/submodules/ChatTitleActivityNode/Sources/ChatRecordingVoiceActivityContentNode.swift @@ -90,7 +90,7 @@ class ChatRecordingVoiceActivityContentNode: ChatTitleActivityContentNode { self.addSubnode(self.indicatorNode) } - override func updateLayout(_ constrainedSize: CGSize, alignment: NSTextAlignment) -> CGSize { + override func updateLayout(_ constrainedSize: CGSize, offset: CGFloat, alignment: NSTextAlignment) -> CGSize { let size = self.textNode.updateLayout(constrainedSize) let indicatorSize = CGSize(width: 24.0, height: 16.0) let originX: CGFloat @@ -99,7 +99,7 @@ class ChatRecordingVoiceActivityContentNode: ChatTitleActivityContentNode { } else { originX = indicatorSize.width } - self.textNode.frame = CGRect(origin: CGPoint(x: originX, y: 0.0), size: size) + self.textNode.frame = CGRect(origin: CGPoint(x: originX, y: offset), size: size) self.indicatorNode.frame = CGRect(origin: CGPoint(x: self.textNode.frame.minX - indicatorSize.width, y: 0.0), size: indicatorSize) return CGSize(width: size.width + indicatorSize.width, height: size.height) } diff --git a/submodules/ChatTitleActivityNode/Sources/ChatTitleActivityContentNode.swift b/submodules/ChatTitleActivityNode/Sources/ChatTitleActivityContentNode.swift index 3578b12212..7bef4a850c 100644 --- a/submodules/ChatTitleActivityNode/Sources/ChatTitleActivityContentNode.swift +++ b/submodules/ChatTitleActivityNode/Sources/ChatTitleActivityContentNode.swift @@ -122,13 +122,13 @@ public class ChatTitleActivityContentNode: ASDisplayNode { } } - public func updateLayout(_ constrainedSize: CGSize, alignment: NSTextAlignment) -> CGSize { + public func updateLayout(_ constrainedSize: CGSize, offset: CGFloat, alignment: NSTextAlignment) -> CGSize { let size = self.textNode.updateLayout(constrainedSize) self.textNode.bounds = CGRect(origin: CGPoint(), size: size) if case .center = alignment { - self.textNode.position = CGPoint(x: 0.0, y: size.height / 2.0) + self.textNode.position = CGPoint(x: 0.0, y: size.height / 2.0 + offset) } else { - self.textNode.position = CGPoint(x: size.width / 2.0, y: size.height / 2.0) + self.textNode.position = CGPoint(x: size.width / 2.0, y: size.height / 2.0 + offset) } return size } diff --git a/submodules/ChatTitleActivityNode/Sources/ChatTitleActivityNode.swift b/submodules/ChatTitleActivityNode/Sources/ChatTitleActivityNode.swift index 2ccf9a29f5..d07bd226a4 100644 --- a/submodules/ChatTitleActivityNode/Sources/ChatTitleActivityNode.swift +++ b/submodules/ChatTitleActivityNode/Sources/ChatTitleActivityNode.swift @@ -123,7 +123,7 @@ public class ChatTitleActivityNode: ASDisplayNode { } } - public func updateLayout(_ constrainedSize: CGSize, alignment: NSTextAlignment) -> CGSize { - return CGSize(width: 0.0, height: self.contentNode?.updateLayout(constrainedSize, alignment: alignment).height ?? 0.0) + public func updateLayout(_ constrainedSize: CGSize, offset: CGFloat = 0.0, alignment: NSTextAlignment) -> CGSize { + return CGSize(width: 0.0, height: self.contentNode?.updateLayout(constrainedSize, offset: offset, alignment: alignment).height ?? 0.0) } } diff --git a/submodules/ChatTitleActivityNode/Sources/ChatTypingActivityContentNode.swift b/submodules/ChatTitleActivityNode/Sources/ChatTypingActivityContentNode.swift index 40ce563d6e..0581cf999c 100644 --- a/submodules/ChatTitleActivityNode/Sources/ChatTypingActivityContentNode.swift +++ b/submodules/ChatTitleActivityNode/Sources/ChatTypingActivityContentNode.swift @@ -108,7 +108,7 @@ class ChatTypingActivityContentNode: ChatTitleActivityContentNode { self.addSubnode(self.indicatorNode) } - override func updateLayout(_ constrainedSize: CGSize, alignment: NSTextAlignment) -> CGSize { + override func updateLayout(_ constrainedSize: CGSize, offset: CGFloat, alignment: NSTextAlignment) -> CGSize { let indicatorSize = CGSize(width: 24.0, height: 16.0) let size = self.textNode.updateLayout(CGSize(width: constrainedSize.width - indicatorSize.width, height: constrainedSize.height)) var originX: CGFloat diff --git a/submodules/ChatTitleActivityNode/Sources/ChatUploadingActivityContentNode.swift b/submodules/ChatTitleActivityNode/Sources/ChatUploadingActivityContentNode.swift index a5cebb8109..829ff60db5 100644 --- a/submodules/ChatTitleActivityNode/Sources/ChatUploadingActivityContentNode.swift +++ b/submodules/ChatTitleActivityNode/Sources/ChatUploadingActivityContentNode.swift @@ -80,7 +80,7 @@ class ChatUploadingActivityContentNode: ChatTitleActivityContentNode { self.addSubnode(self.indicatorNode) } - override func updateLayout(_ constrainedSize: CGSize, alignment: NSTextAlignment) -> CGSize { + override func updateLayout(_ constrainedSize: CGSize, offset: CGFloat, alignment: NSTextAlignment) -> CGSize { let size = self.textNode.updateLayout(constrainedSize) let indicatorSize = CGSize(width: 24.0, height: 16.0) let originX: CGFloat diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 155426877a..4e9ff5f4b4 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -497,7 +497,8 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if let takenViewInfo = takenViewInfo, let parentSupernode = takenViewInfo.contentContainingNode.supernode { self.contentContainerNode.contentNode = .extracted(node: takenViewInfo.contentContainingNode, keepInPlace: source.keepInPlace) - if source.keepInPlace { + if source.keepInPlace || takenViewInfo.maskView != nil { + self.clippingNode.view.mask = takenViewInfo.maskView self.clippingNode.addSubnode(self.contentContainerNode) } else { self.scrollNode.addSubnode(self.contentContainerNode) @@ -687,7 +688,9 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi self.actionsContainerNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: localSourceFrame.center.x - self.actionsContainerNode.position.x, y: localSourceFrame.center.y - self.actionsContainerNode.position.y + actionsOffset)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: actionsDuration, initialVelocity: 0.0, damping: springDamping, additive: true) let contentContainerOffset = CGPoint(x: localContentSourceFrame.center.x - self.contentContainerNode.frame.center.x - contentParentNode.contentRect.minX, y: localContentSourceFrame.center.y - self.contentContainerNode.frame.center.y - contentParentNode.contentRect.minY) - self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: contentContainerOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: contentDuration, initialVelocity: 0.0, damping: springDamping, additive: true) + self.contentContainerNode.layer.animateSpring(from: NSValue(cgPoint: contentContainerOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: contentDuration, initialVelocity: 0.0, damping: springDamping, additive: true, completion: { [weak self] _ in + self?.clippingNode.view.mask = nil + }) contentParentNode.applyAbsoluteOffsetSpring?(-contentContainerOffset.y, springDuration, springDamping) } @@ -849,6 +852,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi updatedContentAreaInScreenSpace.origin.x = 0.0 updatedContentAreaInScreenSpace.size.width = self.bounds.width + self.clippingNode.view.mask = putBackInfo.maskView self.clippingNode.layer.animateFrame(from: self.clippingNode.frame, to: updatedContentAreaInScreenSpace, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) self.clippingNode.layer.animateBoundsOriginYAdditive(from: 0.0, to: updatedContentAreaInScreenSpace.minY, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) } @@ -1726,18 +1730,22 @@ public protocol ContextReferenceContentSource: class { public final class ContextControllerTakeViewInfo { public let contentContainingNode: ContextExtractedContentContainingNode public let contentAreaInScreenSpace: CGRect + public let maskView: UIView? - public init(contentContainingNode: ContextExtractedContentContainingNode, contentAreaInScreenSpace: CGRect) { + public init(contentContainingNode: ContextExtractedContentContainingNode, contentAreaInScreenSpace: CGRect, maskView: UIView? = nil) { self.contentContainingNode = contentContainingNode self.contentAreaInScreenSpace = contentAreaInScreenSpace + self.maskView = maskView } } public final class ContextControllerPutBackViewInfo { public let contentAreaInScreenSpace: CGRect + public let maskView: UIView? - public init(contentAreaInScreenSpace: CGRect) { + public init(contentAreaInScreenSpace: CGRect, maskView: UIView? = nil) { self.contentAreaInScreenSpace = contentAreaInScreenSpace + self.maskView = maskView } } diff --git a/submodules/DeviceAccess/Sources/DeviceAccess.swift b/submodules/DeviceAccess/Sources/DeviceAccess.swift index d598849965..631b0e8712 100644 --- a/submodules/DeviceAccess/Sources/DeviceAccess.swift +++ b/submodules/DeviceAccess/Sources/DeviceAccess.swift @@ -250,27 +250,31 @@ public final class DeviceAccess { } } - public static func authorizeAccess(to subject: DeviceAccessSubject, registerForNotifications: ((@escaping (Bool) -> Void) -> Void)? = nil, requestSiriAuthorization: ((@escaping (Bool) -> Void) -> Void)? = nil, locationManager: LocationManager? = nil, presentationData: PresentationData? = nil, present: @escaping (ViewController, Any?) -> Void = { _, _ in }, openSettings: @escaping () -> Void = { }, displayNotificationFromBackground: @escaping (String) -> Void = { _ in }, _ completion: @escaping (Bool) -> Void = { _ in }) { + public static func authorizeAccess(to subject: DeviceAccessSubject, onlyCheck: Bool = false, registerForNotifications: ((@escaping (Bool) -> Void) -> Void)? = nil, requestSiriAuthorization: ((@escaping (Bool) -> Void) -> Void)? = nil, locationManager: LocationManager? = nil, presentationData: PresentationData? = nil, present: @escaping (ViewController, Any?) -> Void = { _, _ in }, openSettings: @escaping () -> Void = { }, displayNotificationFromBackground: @escaping (String) -> Void = { _ in }, _ completion: @escaping (Bool) -> Void = { _ in }) { switch subject { case let .camera(cameraSubject): let status = PGCamera.cameraAuthorizationStatus() if status == PGCameraAuthorizationStatusNotDetermined { - AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in - Queue.mainQueue().async { - completion(response) - if !response, let presentationData = presentationData { - let text: String - switch cameraSubject { - case .video: - text = presentationData.strings.AccessDenied_Camera - case .videoCall: - text = presentationData.strings.AccessDenied_VideoCallCamera + if !onlyCheck { + AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in + Queue.mainQueue().async { + completion(response) + if !response, let presentationData = presentationData { + let text: String + switch cameraSubject { + case .video: + text = presentationData.strings.AccessDenied_Camera + case .videoCall: + text = presentationData.strings.AccessDenied_VideoCallCamera + } + present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: presentationData.strings.AccessDenied_Title, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_NotNow, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.AccessDenied_Settings, action: { + openSettings() + })]), nil) } - present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: presentationData.strings.AccessDenied_Title, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_NotNow, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.AccessDenied_Settings, action: { - openSettings() - })]), nil) } } + } else { + completion(true) } } else if status == PGCameraAuthorizationStatusRestricted || status == PGCameraAuthorizationStatusDenied, let presentationData = presentationData { let text: String diff --git a/submodules/Display/Source/ContainedViewLayoutTransition.swift b/submodules/Display/Source/ContainedViewLayoutTransition.swift index 83886fffc5..019a41615b 100644 --- a/submodules/Display/Source/ContainedViewLayoutTransition.swift +++ b/submodules/Display/Source/ContainedViewLayoutTransition.swift @@ -333,8 +333,8 @@ public extension ContainedViewLayoutTransition { } } - func updatePosition(layer: CALayer, position: CGPoint, completion: ((Bool) -> Void)? = nil) { - if layer.position.equalTo(position) { + func updatePosition(layer: CALayer, position: CGPoint, force: Bool = false, completion: ((Bool) -> Void)? = nil) { + if layer.position.equalTo(position) && !force { completion?(true) } else { switch self { @@ -545,6 +545,15 @@ public extension ContainedViewLayoutTransition { }) } } + + func animateContentsRectPositionAdditive(layer: CALayer, offset: CGPoint, removeOnCompletion: Bool = true, completion: ((Bool) -> Void)? = nil) { + switch self { + case .immediate: + completion?(true) + case let .animated(duration, curve): + layer.animate(from: NSValue(cgPoint: offset), to: NSValue(cgPoint: CGPoint()), keyPath: "contentsRect.origin", timingFunction: curve.timingFunction, duration: duration, delay: 0.0, mediaTimingFunction: curve.mediaTimingFunction, removeOnCompletion: removeOnCompletion, additive: true, completion: completion) + } + } func updateFrame(view: UIView, frame: CGRect, force: Bool = false, beginWithCurrentState: Bool = false, delay: Double = 0.0, completion: ((Bool) -> Void)? = nil) { if frame.origin.x.isNaN { @@ -1284,9 +1293,6 @@ public struct CombinedTransition { completeKey(.positionY, result) }) - //self.horizontal.animateHorizontalOffsetAdditive(layer: layer, offset: (fromFrame.width - toFrame.width) / 4.0) - //self.vertical.animateOffsetAdditive(layer: layer, offset: (fromFrame.height - toFrame.height) / 2.0) - self.horizontal.animateWidthAdditive(layer: layer, value: fromFrame.width - toFrame.width, completion: { result in completeKey(.sizeWidth, result) }) @@ -1301,6 +1307,12 @@ public struct CombinedTransition { self.animateFrame(layer: layer, from: fromFrame, completion: completion) } + public func updateFrame(node: ASDisplayNode, frame: CGRect, completion: ((Bool) -> Void)? = nil) { + let fromFrame = node.frame + node.frame = frame + self.animateFrame(layer: node.layer, from: fromFrame, completion: completion) + } + public func updatePosition(layer: CALayer, position: CGPoint, completion: ((Bool) -> Void)? = nil) { let fromPosition = layer.position layer.position = position diff --git a/submodules/Display/Source/Font.swift b/submodules/Display/Source/Font.swift index a8d231c6da..873a367e5d 100644 --- a/submodules/Display/Source/Font.swift +++ b/submodules/Display/Source/Font.swift @@ -58,7 +58,13 @@ public struct Font { public static func with(size: CGFloat, design: Design = .regular, weight: Weight = .regular, traits: Traits = []) -> UIFont { if #available(iOS 13.0, *) { - let descriptor = UIFont.systemFont(ofSize: size).fontDescriptor + let descriptor: UIFontDescriptor + if #available(iOS 14.0, *) { + descriptor = UIFont.systemFont(ofSize: size).fontDescriptor + } else { + descriptor = UIFont.systemFont(ofSize: size, weight: weight.weight).fontDescriptor + } + var symbolicTraits = descriptor.symbolicTraits if traits.contains(.italic) { symbolicTraits.insert(.traitItalic) @@ -83,10 +89,12 @@ public struct Font { default: updatedDescriptor = updatedDescriptor?.withDesign(.default) } - if weight != .regular { - updatedDescriptor = updatedDescriptor?.addingAttributes([ - UIFontDescriptor.AttributeName.traits: [UIFontDescriptor.TraitKey.weight: weight.weight] - ]) + if #available(iOS 14.0, *) { + if weight != .regular { + updatedDescriptor = updatedDescriptor?.addingAttributes([ + UIFontDescriptor.AttributeName.traits: [UIFontDescriptor.TraitKey.weight: weight.weight] + ]) + } } if let updatedDescriptor = updatedDescriptor { diff --git a/submodules/Display/Source/LinkHighlightingNode.swift b/submodules/Display/Source/LinkHighlightingNode.swift index 26efc7afff..ac51ca4afe 100644 --- a/submodules/Display/Source/LinkHighlightingNode.swift +++ b/submodules/Display/Source/LinkHighlightingNode.swift @@ -157,7 +157,7 @@ private func generateRectsImage(color: UIColor, rects: [CGRect], inset: CGFloat, public final class LinkHighlightingNode: ASDisplayNode { private var rects: [CGRect] = [] - private let imageNode: ASImageNode + public let imageNode: ASImageNode public var innerRadius: CGFloat = 4.0 public var outerRadius: CGFloat = 4.0 @@ -196,7 +196,7 @@ public final class LinkHighlightingNode: ASDisplayNode { } private func updateImage() { - if rects.isEmpty { + if self.rects.isEmpty { self.imageNode.image = nil } let (offset, image) = generateRectsImage(color: self.color, rects: self.rects, inset: self.inset, outerRadius: self.outerRadius, innerRadius: self.innerRadius) @@ -206,6 +206,19 @@ public final class LinkHighlightingNode: ASDisplayNode { self.imageNode.frame = CGRect(origin: offset, size: image.size) } } + + public static func generateImage(color: UIColor, inset: CGFloat, innerRadius: CGFloat, outerRadius: CGFloat, rects: [CGRect]) -> (CGPoint, UIImage)? { + if rects.isEmpty { + return nil + } + let (offset, image) = generateRectsImage(color: color, rects: rects, inset: inset, outerRadius: outerRadius, innerRadius: innerRadius) + + if let image = image { + return (offset, image) + } else { + return nil + } + } public func asyncLayout() -> (UIColor, [CGRect], CGFloat, CGFloat, CGFloat) -> () -> Void { let currentRects = self.rects diff --git a/submodules/Display/Source/NavigationBar.swift b/submodules/Display/Source/NavigationBar.swift index d6a788760c..b93aa61ea9 100644 --- a/submodules/Display/Source/NavigationBar.swift +++ b/submodules/Display/Source/NavigationBar.swift @@ -117,6 +117,8 @@ enum NavigationPreviousAction: Equatable { } } +private var sharedIsReduceTransparencyEnabled = UIAccessibility.isReduceTransparencyEnabled + public final class NavigationBackgroundNode: ASDisplayNode { private var _color: UIColor public var color: UIColor { @@ -148,14 +150,9 @@ public final class NavigationBackgroundNode: ASDisplayNode { } private func updateBackgroundBlur(forceKeepBlur: Bool) { - if self.enableBlur && ((self.color.alpha > 0.1 && self.color.alpha < 0.95) || forceKeepBlur) { + if self.enableBlur && !sharedIsReduceTransparencyEnabled && ((self.color.alpha > .ulpOfOne && self.color.alpha < 0.95) || forceKeepBlur) { if self.effectView == nil { - let effectView: UIVisualEffectView - if self.color.lightness > 0.6 { - effectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) - } else { - effectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark)) - } + let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) for subview in effectView.subviews { if subview.description.contains("VisualEffectSubview") { @@ -164,6 +161,8 @@ public final class NavigationBackgroundNode: ASDisplayNode { } if let sublayer = effectView.layer.sublayers?[0], let filters = sublayer.filters { + sublayer.backgroundColor = nil + sublayer.isOpaque = false let allowedKeys: [String] = [ "colorSaturate", "gaussianBlur" @@ -176,11 +175,6 @@ public final class NavigationBackgroundNode: ASDisplayNode { if !allowedKeys.contains(filterName) { return false } - /*if filterName == "colorSaturate" { - filter.setValue(2.8 as NSNumber, forKey: "inputAmount") - } else if filterName == "gaussianBlur" { - filter.setValue(5.0 as NSNumber, forKey: "inputRadius") - }*/ return true } } @@ -205,7 +199,11 @@ public final class NavigationBackgroundNode: ASDisplayNode { } self._color = color - transition.updateBackgroundColor(node: self.backgroundNode, color: self.color) + if sharedIsReduceTransparencyEnabled { + transition.updateBackgroundColor(node: self.backgroundNode, color: self.color.withAlphaComponent(1.0)) + } else { + transition.updateBackgroundColor(node: self.backgroundNode, color: self.color) + } self.updateBackgroundBlur(forceKeepBlur: forceKeepBlur) } diff --git a/submodules/Display/Source/UIKitUtils.swift b/submodules/Display/Source/UIKitUtils.swift index bc40ac4391..96116d8503 100644 --- a/submodules/Display/Source/UIKitUtils.swift +++ b/submodules/Display/Source/UIKitUtils.swift @@ -133,7 +133,7 @@ public extension UIColor { } } - var hsb: (CGFloat, CGFloat, CGFloat) { + var hsb: (h: CGFloat, s: CGFloat, b: CGFloat) { var hue: CGFloat = 0.0 var saturation: CGFloat = 0.0 var brightness: CGFloat = 0.0 @@ -284,6 +284,27 @@ public extension UIColor { let b = e1.b - e2.b return ((512 + rMean) * r * r) >> 8 + 4 * g * g + ((767 - rMean) * b * b) >> 8 } + + static func average(of colors: [UIColor]) -> UIColor { + var sr: CGFloat = 0.0 + var sg: CGFloat = 0.0 + var sb: CGFloat = 0.0 + var sa: CGFloat = 0.0 + + for color in colors { + var r: CGFloat = 0.0 + var g: CGFloat = 0.0 + var b: CGFloat = 0.0 + var a: CGFloat = 0.0 + color.getRed(&r, green: &g, blue: &b, alpha: &a) + sr += r + sg += g + sb += b + sa += a + } + + return UIColor(red: sr / CGFloat(colors.count), green: sg / CGFloat(colors.count), blue: sb / CGFloat(colors.count), alpha: sa / CGFloat(colors.count)) + } } public extension CGSize { diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index 91075c1e42..4645ed80cb 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -386,6 +386,8 @@ public class GalleryController: ViewController, StandalonePresentableController public var centralItemUpdated: ((MessageId) -> Void)? + private var initialOrientation: UIInterfaceOrientation? + public init(context: AccountContext, source: GalleryControllerItemSource, invertItemOrder: Bool = false, streamSingleVideo: Bool = false, fromPlayingVideo: Bool = false, landscape: Bool = false, timecode: Double? = nil, synchronousLoad: Bool = false, replaceRootController: @escaping (ViewController, Promise?) -> Void, baseNavigationController: NavigationController?, actionInteraction: GalleryControllerActionInteraction? = nil) { self.context = context self.source = source @@ -897,6 +899,10 @@ public class GalleryController: ViewController, StandalonePresentableController } deinit { + if let initialOrientation = self.initialOrientation { + self.context.sharedContext.applicationBindings.forceOrientation(initialOrientation) + } + self.accountInUseDisposable.dispose() self.disposable.dispose() self.centralItemAttributesDisposable.dispose() @@ -1019,6 +1025,17 @@ public class GalleryController: ViewController, StandalonePresentableController self?.galleryNode.pager.centralItemNode()?.controlsVisibilityUpdated(isVisible: visible) } + self.galleryNode.updateOrientation = { [weak self] orientation in + if let strongSelf = self { + if strongSelf.initialOrientation == nil { + strongSelf.initialOrientation = orientation == .portrait ? .landscapeRight : .portrait + } else if strongSelf.initialOrientation == orientation { + strongSelf.initialOrientation = nil + } + strongSelf.context.sharedContext.applicationBindings.forceOrientation(orientation) + } + } + let baseNavigationController = self.baseNavigationController self.galleryNode.baseNavigationController = { [weak baseNavigationController] in return baseNavigationController diff --git a/submodules/GalleryUI/Sources/GalleryControllerNode.swift b/submodules/GalleryUI/Sources/GalleryControllerNode.swift index b38bd35f73..06780433d2 100644 --- a/submodules/GalleryUI/Sources/GalleryControllerNode.swift +++ b/submodules/GalleryUI/Sources/GalleryControllerNode.swift @@ -30,6 +30,8 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture public var areControlsHidden = false public var controlsVisibilityChanged: ((Bool) -> Void)? + public var updateOrientation: ((UIInterfaceOrientation) -> Void)? + public var isBackgroundExtendedOverNavigationBar = true { didSet { if let (navigationBarHeight, layout) = self.containerLayout { @@ -69,6 +71,12 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture } } + self.pager.updateOrientation = { [weak self] orientation in + if let strongSelf = self { + strongSelf.updateOrientation?(orientation) + } + } + self.pager.dismiss = { [weak self] in if let strongSelf = self { var interfaceAnimationCompleted = false diff --git a/submodules/GalleryUI/Sources/GalleryItemNode.swift b/submodules/GalleryUI/Sources/GalleryItemNode.swift index 7f90361440..6903789863 100644 --- a/submodules/GalleryUI/Sources/GalleryItemNode.swift +++ b/submodules/GalleryUI/Sources/GalleryItemNode.swift @@ -22,6 +22,7 @@ open class GalleryItemNode: ASDisplayNode { public var toggleControlsVisibility: () -> Void = { } public var updateControlsVisibility: (Bool) -> Void = { _ in } + public var updateOrientation: (UIInterfaceOrientation) -> Void = { _ in } public var dismiss: () -> Void = { } public var beginCustomDismiss: () -> Void = { } public var completeCustomDismiss: () -> Void = { } diff --git a/submodules/GalleryUI/Sources/GalleryPagerNode.swift b/submodules/GalleryUI/Sources/GalleryPagerNode.swift index d45d1feba6..b6d9e6b6fa 100644 --- a/submodules/GalleryUI/Sources/GalleryPagerNode.swift +++ b/submodules/GalleryUI/Sources/GalleryPagerNode.swift @@ -107,6 +107,7 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate, UIGest public var centralItemIndexOffsetUpdated: (([GalleryItem]?, Int, CGFloat)?) -> Void = { _ in } public var toggleControlsVisibility: () -> Void = { } public var updateControlsVisibility: (Bool) -> Void = { _ in } + public var updateOrientation: (UIInterfaceOrientation) -> Void = { _ in } public var dismiss: () -> Void = { } public var beginCustomDismiss: () -> Void = { } public var completeCustomDismiss: () -> Void = { } @@ -474,6 +475,7 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate, UIGest let node = self.items[index].node(synchronous: synchronous) node.toggleControlsVisibility = self.toggleControlsVisibility node.updateControlsVisibility = self.updateControlsVisibility + node.updateOrientation = self.updateOrientation node.dismiss = self.dismiss node.beginCustomDismiss = self.beginCustomDismiss node.completeCustomDismiss = self.completeCustomDismiss diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 9423124dc1..24c653e88a 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -188,7 +188,7 @@ private final class UniversalVideoGalleryItemOverlayNode: GalleryOverlayContentN self.addSubnode(self.wrapperNode) self.wrapperNode.addSubnode(self.fullscreenNode) - self.fullscreenNode.addTarget(self, action: #selector(self.soundButtonPressed), forControlEvents: .touchUpInside) + self.fullscreenNode.addTarget(self, action: #selector(self.toggleFullscreenPressed), forControlEvents: .touchUpInside) } override func updateLayout(size: CGSize, metrics: LayoutMetrics, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, transition: ContainedViewLayoutTransition) { @@ -227,7 +227,7 @@ private final class UniversalVideoGalleryItemOverlayNode: GalleryOverlayContentN } } - @objc func soundButtonPressed() { + @objc func toggleFullscreenPressed() { var toLandscape = false if let (size, _, _, _ ,_) = self.validLayout, size.width < size.height { toLandscape = true @@ -337,7 +337,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.overlayContentNode.action = { [weak self] toLandscape in self?.updateControlsVisibility(!toLandscape) - context.sharedContext.applicationBindings.forceOrientation(toLandscape ? .landscapeRight : .portrait) + self?.updateOrientation(toLandscape ? .landscapeRight : .portrait) } self.scrubberView.seek = { [weak self] timecode in diff --git a/submodules/GradientBackground/Sources/SoftwareGradientBackground.swift b/submodules/GradientBackground/Sources/SoftwareGradientBackground.swift index 3dbbe47175..e927c5842f 100644 --- a/submodules/GradientBackground/Sources/SoftwareGradientBackground.swift +++ b/submodules/GradientBackground/Sources/SoftwareGradientBackground.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import Accelerate private func shiftArray(array: [CGPoint], offset: Int) -> [CGPoint] { var newArray = array @@ -31,7 +32,7 @@ private func interpolatePoints(_ point1: CGPoint, _ point2: CGPoint, at factor: return CGPoint(x: interpolateFloat(point1.x, point2.x, at: factor), y: interpolateFloat(point1.y, point2.y, at: factor)) } -private func generateGradient(size: CGSize, colors: [UIColor], positions: [CGPoint]) -> UIImage { +private func generateGradient(size: CGSize, colors: [UIColor], positions: [CGPoint], adjustSaturation: CGFloat = 1.0) -> UIImage { let width = Int(size.width) let height = Int(size.height) @@ -114,6 +115,43 @@ private func generateGradient(size: CGSize, colors: [UIColor], positions: [CGPoi } } + if abs(adjustSaturation - 1.0) > .ulpOfOne { + var buffer = vImage_Buffer() + buffer.data = context.bytes + buffer.width = UInt(width) + buffer.height = UInt(height) + buffer.rowBytes = context.bytesPerRow + + let divisor: Int32 = 0x1000 + + let rwgt: CGFloat = 0.3086 + let gwgt: CGFloat = 0.6094 + let bwgt: CGFloat = 0.0820 + + let a = (1.0 - adjustSaturation) * rwgt + adjustSaturation + let b = (1.0 - adjustSaturation) * rwgt + let c = (1.0 - adjustSaturation) * rwgt + let d = (1.0 - adjustSaturation) * gwgt + let e = (1.0 - adjustSaturation) * gwgt + adjustSaturation + let f = (1.0 - adjustSaturation) * gwgt + let g = (1.0 - adjustSaturation) * bwgt + let h = (1.0 - adjustSaturation) * bwgt + let i = (1.0 - adjustSaturation) * bwgt + adjustSaturation + + let satMatrix: [CGFloat] = [ + a, b, c, 0, + d, e, f, 0, + g, h, i, 0, + 0, 0, 0, 1 + ] + + var matrix: [Int16] = satMatrix.map { value in + return Int16(value * CGFloat(divisor)) + } + + vImageMatrixMultiply_ARGB8888(&buffer, &buffer, &matrix, divisor, nil, nil, vImage_Flags(kvImageDoNotTile)) + } + return context.generateImage()! } @@ -128,7 +166,7 @@ public final class GradientBackgroundNode: ASDisplayNode { super.init() self.index = parentNode.cloneNodes.add(Weak(self)) - self.image = parentNode.contentView.image + self.image = parentNode.dimmedImage } deinit { @@ -160,6 +198,19 @@ public final class GradientBackgroundNode: ASDisplayNode { private var validPhase: Int? private var invalidated: Bool = false + private var dimmedImageParams: (size: CGSize, colors: [UIColor], positions: [CGPoint])? + private var _dimmedImage: UIImage? + private var dimmedImage: UIImage? { + if let current = self._dimmedImage { + return current + } else if let (size, colors, positions) = self.dimmedImageParams { + self._dimmedImage = generateGradient(size: size, colors: colors, positions: positions, adjustSaturation: 1.7) + return self._dimmedImage + } else { + return nil + } + } + private var validLayout: CGSize? private var colors: [UIColor] = [ @@ -201,7 +252,7 @@ public final class GradientBackgroundNode: ASDisplayNode { deinit { } - public func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) { + public func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition, extendAnimation: Bool = false) { let sizeUpdated = self.validLayout != size self.validLayout = size @@ -214,54 +265,127 @@ public final class GradientBackgroundNode: ASDisplayNode { self.validPhase = self.phase self.invalidated = false - let previousPositions = gatherPositions(shiftArray(array: GradientBackgroundNode.basePositions, offset: validPhase % 8)) + var steps: [[CGPoint]] = [] + if extendAnimation { + let phaseCount = 4 + var stepPhase = (self.phase + phaseCount) % 8 + for _ in 0 ... phaseCount { + steps.append(gatherPositions(shiftArray(array: GradientBackgroundNode.basePositions, offset: stepPhase))) + stepPhase = stepPhase - 1 + if stepPhase < 0 { + stepPhase = 7 + } + } + } else { + steps.append(gatherPositions(shiftArray(array: GradientBackgroundNode.basePositions, offset: validPhase % 8))) + steps.append(positions) + } if case let .animated(duration, curve) = transition, duration > 0.001 { var images: [UIImage] = [] - let maxFrame = Int(duration * 30) - for i in 0 ..< maxFrame { - let t = curve.solve(at: CGFloat(i) / CGFloat(maxFrame - 1)) + var dimmedImages: [UIImage] = [] + let needDimmedImages = !self.cloneNodes.isEmpty - let morphedPositions = Array(zip(previousPositions, positions).map { previous, current -> CGPoint in - return interpolatePoints(previous, current, at: t) - }) + let stepCount = steps.count - 1 + + let fps: Double = extendAnimation ? 60 : 30 + let maxFrame = Int(duration * fps) + let framesPerAnyStep = maxFrame / stepCount + + for frameIndex in 0 ..< maxFrame { + let t = curve.solve(at: CGFloat(frameIndex) / CGFloat(maxFrame - 1)) + let globalStep = Int(t * CGFloat(maxFrame)) + let stepIndex = min(stepCount - 1, globalStep / framesPerAnyStep) + + let stepFrameIndex = globalStep - stepIndex * framesPerAnyStep + let stepFrames: Int + if stepIndex == stepCount - 1 { + stepFrames = maxFrame - framesPerAnyStep * (stepCount - 1) + } else { + stepFrames = framesPerAnyStep + } + let stepT = CGFloat(stepFrameIndex) / CGFloat(stepFrames - 1) + + var morphedPositions: [CGPoint] = [] + for i in 0 ..< steps[0].count { + morphedPositions.append(interpolatePoints(steps[stepIndex][i], steps[stepIndex + 1][i], at: stepT)) + } images.append(generateGradient(size: imageSize, colors: self.colors, positions: morphedPositions)) - } - - self.contentView.image = images.last - let animation = CAKeyframeAnimation(keyPath: "contents") - animation.values = images.map { $0.cgImage! } - animation.duration = duration * UIView.animationDurationFactor() - animation.calculationMode = .linear - animation.isRemovedOnCompletion = true - self.contentView.layer.removeAnimation(forKey: "contents") - self.contentView.layer.add(animation, forKey: "contents") - - for cloneNode in self.cloneNodes { - if let value = cloneNode.value { - value.image = images.last - value.layer.removeAnimation(forKey: "contents") - value.layer.add(animation.copy() as! CAAnimation, forKey: "contents") + if needDimmedImages { + dimmedImages.append(generateGradient(size: imageSize, colors: self.colors, positions: morphedPositions, adjustSaturation: 1.7)) } } + self.dimmedImageParams = (imageSize, self.colors, gatherPositions(shiftArray(array: GradientBackgroundNode.basePositions, offset: self.phase % 8))) + + self.contentView.image = images.last + + let animation = CAKeyframeAnimation(keyPath: "contents") + animation.values = images.map { $0.cgImage! } + animation.duration = duration * UIView.animationDurationFactor() + if extendAnimation { + animation.calculationMode = .discrete + } else { + animation.calculationMode = .linear + } + animation.isRemovedOnCompletion = true + if extendAnimation { + animation.fillMode = .backwards + animation.beginTime = self.contentView.layer.convertTime(CACurrentMediaTime(), from: nil) + 0.25 + } + + self.contentView.layer.removeAnimation(forKey: "contents") + self.contentView.layer.add(animation, forKey: "contents") + + if !self.cloneNodes.isEmpty { + let animation = CAKeyframeAnimation(keyPath: "contents") + animation.values = dimmedImages.map { $0.cgImage! } + animation.duration = duration * UIView.animationDurationFactor() + if extendAnimation { + animation.calculationMode = .discrete + } else { + animation.calculationMode = .linear + } + animation.isRemovedOnCompletion = true + if extendAnimation { + animation.fillMode = .backwards + animation.beginTime = self.contentView.layer.convertTime(CACurrentMediaTime(), from: nil) + 0.25 + } + + self._dimmedImage = dimmedImages.last + + for cloneNode in self.cloneNodes { + if let value = cloneNode.value { + value.image = dimmedImages.last + value.layer.removeAnimation(forKey: "contents") + value.layer.add(animation, forKey: "contents") + } + } + } } else { - let image = generateGradient(size: imageSize, colors: colors, positions: positions) + let image = generateGradient(size: imageSize, colors: self.colors, positions: positions) self.contentView.image = image + let dimmedImage = generateGradient(size: imageSize, colors: self.colors, positions: positions, adjustSaturation: 1.7) + self._dimmedImage = dimmedImage + self.dimmedImageParams = (imageSize, self.colors, positions) + for cloneNode in self.cloneNodes { - cloneNode.value?.image = image + cloneNode.value?.image = dimmedImage } } } } else if sizeUpdated { - let image = generateGradient(size: imageSize, colors: colors, positions: positions) + let image = generateGradient(size: imageSize, colors: self.colors, positions: positions) self.contentView.image = image + let dimmedImage = generateGradient(size: imageSize, colors: self.colors, positions: positions, adjustSaturation: 1.7) + self.dimmedImageParams = (imageSize, self.colors, positions) + for cloneNode in self.cloneNodes { - cloneNode.value?.image = image + cloneNode.value?.image = dimmedImage } self.validPhase = self.phase @@ -278,21 +402,25 @@ public final class GradientBackgroundNode: ASDisplayNode { } } - public func animateEvent(transition: ContainedViewLayoutTransition) { + public func animateEvent(transition: ContainedViewLayoutTransition, extendAnimation: Bool = false) { guard case let .animated(duration, _) = transition, duration > 0.001 else { return } - - if self.phase == 0 { - self.phase = 7 + + if extendAnimation { + self.invalidated = true } else { - self.phase = self.phase - 1 + if self.phase == 0 { + self.phase = 7 + } else { + self.phase = self.phase - 1 + } } if self.useSharedAnimationPhase { GradientBackgroundNode.sharedPhase = self.phase } if let size = self.validLayout { - self.updateLayout(size: size, transition: transition) + self.updateLayout(size: size, transition: transition, extendAnimation: extendAnimation) } } } diff --git a/submodules/ListMessageItem/BUILD b/submodules/ListMessageItem/BUILD index 7d09560729..46c2804980 100644 --- a/submodules/ListMessageItem/BUILD +++ b/submodules/ListMessageItem/BUILD @@ -32,6 +32,7 @@ swift_library( "//submodules/ContextUI:ContextUI", "//submodules/FileMediaResourceStatus:FileMediaResourceStatus", "//submodules/ManagedAnimationNode:ManagedAnimationNode", + "//submodules/WallpaperResources:WallpaperResources", ], visibility = [ "//visibility:public", diff --git a/submodules/ListMessageItem/Sources/ListMessageSnippetItemNode.swift b/submodules/ListMessageItem/Sources/ListMessageSnippetItemNode.swift index 9abcc35f2e..5f16078450 100644 --- a/submodules/ListMessageItem/Sources/ListMessageSnippetItemNode.swift +++ b/submodules/ListMessageItem/Sources/ListMessageSnippetItemNode.swift @@ -16,6 +16,7 @@ import UrlHandling import UrlWhitelist import AccountContext import TelegramStringFormatting +import WallpaperResources private let iconFont = Font.with(size: 30.0, design: .round, weight: .bold) @@ -253,6 +254,9 @@ public final class ListMessageSnippetItemNode: ListMessageNode { var primaryUrl: String? var isInstantView = false + + var previewWallpaper: TelegramWallpaper? + var previewWallpaperFileReference: FileMediaReference? var selectedMedia: TelegramMediaWebpage? var processed = false @@ -283,6 +287,17 @@ public final class ListMessageSnippetItemNode: ListMessageNode { iconImageReferenceAndRepresentation = (.message(message: MessageReference(item.message), media: image), representation) } } else if let file = content.file { + if content.type == "telegram_background" { + if let wallpaper = parseWallpaperUrl(content.url) { + switch wallpaper { + case let .slug(slug, _, colors, intensity, angle): + previewWallpaperFileReference = .message(message: MessageReference(item.message), media: file) + previewWallpaper = .file(id: file.fileId.id, accessHash: 0, isCreator: false, isDefault: false, isPattern: true, isDark: false, slug: slug, file: file, settings: WallpaperSettings(blur: false, motion: false, colors: colors, intensity: intensity, rotation: angle)) + default: + break + } + } + } if let representation = smallestImageRepresentation(file.previewRepresentations) { iconImageReferenceAndRepresentation = (.message(message: MessageReference(item.message), media: file), representation) } @@ -508,7 +523,9 @@ public final class ListMessageSnippetItemNode: ListMessageNode { } if currentIconImageRepresentation != iconImageReferenceAndRepresentation?.1 { - if let iconImageReferenceAndRepresentation = iconImageReferenceAndRepresentation { + if let previewWallpaper = previewWallpaper, let fileReference = previewWallpaperFileReference { + updateIconImageSignal = wallpaperThumbnail(account: item.context.account, accountManager: item.context.sharedContext.accountManager, fileReference: fileReference, wallpaper: previewWallpaper, synchronousLoad: false) + } else if let iconImageReferenceAndRepresentation = iconImageReferenceAndRepresentation { if let imageReference = iconImageReferenceAndRepresentation.0.concrete(TelegramMediaImage.self) { updateIconImageSignal = chatWebpageSnippetPhoto(account: item.context.account, photoReference: imageReference) } else if let fileReference = iconImageReferenceAndRepresentation.0.concrete(TelegramMediaFile.self) { diff --git a/submodules/MtProtoKit/Sources/MTProto.m b/submodules/MtProtoKit/Sources/MTProto.m index 4011446fca..8bd36b4857 100644 --- a/submodules/MtProtoKit/Sources/MTProto.m +++ b/submodules/MtProtoKit/Sources/MTProto.m @@ -2112,6 +2112,24 @@ static NSString *dumpHexString(NSData *data, int maxLength) { } } +static bool isDataEqualToDataConstTime(NSData *data1, NSData *data2) { + if (data1.length != data2.length) { + return false; + } + + uint8_t const *bytes1 = data1.bytes; + uint8_t const *bytes2 = data2.bytes; + + int result = 0; + for (int i = 0; i < data1.length; i++) { + if (bytes1[i] != bytes2[i]) { + result |= i + 1; + } + } + + return result == 0; +} + - (NSData *)_decryptIncomingTransportData:(NSData *)transportData address:(MTDatacenterAddress *)address authKey:(MTDatacenterAuthKey *)authKey { MTDatacenterAuthKey *effectiveAuthKey = authKey; @@ -2146,7 +2164,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { NSData *msgKeyLarge = MTSha256(msgKeyLargeData); NSData *messageKey = [msgKeyLarge subdataWithRange:NSMakeRange(8, 16)]; - if (![messageKey isEqualToData:embeddedMessageKey]) { + if (!isDataEqualToDataConstTime(messageKey, embeddedMessageKey)) { return nil; } diff --git a/submodules/PeerInfoAvatarListNode/Sources/PeerInfoAvatarListNode.swift b/submodules/PeerInfoAvatarListNode/Sources/PeerInfoAvatarListNode.swift index ffde241af1..bfd6117b7d 100644 --- a/submodules/PeerInfoAvatarListNode/Sources/PeerInfoAvatarListNode.swift +++ b/submodules/PeerInfoAvatarListNode/Sources/PeerInfoAvatarListNode.swift @@ -1107,6 +1107,8 @@ public final class PeerInfoAvatarListContainerNode: ASDisplayNode { } } + public var updateCustomItemsOnlySynchronously = false + private func updateItems(size: CGSize, update: Bool = false, transition: ContainedViewLayoutTransition, stripTransition: ContainedViewLayoutTransition, synchronous: Bool = false) { var validIds: [WrappedMediaResourceId] = [] var addedItemNodesForAdditiveTransition: [PeerInfoAvatarListItemNode] = [] @@ -1121,6 +1123,10 @@ public final class PeerInfoAvatarListContainerNode: ASDisplayNode { if let current = self.itemNodes[self.items[i].id] { itemNode = current if update { + var synchronous = synchronous && i == self.currentIndex + if case .custom = self.items[i], self.updateCustomItemsOnlySynchronously { + synchronous = true + } current.setup(item: self.items[i], synchronous: synchronous && i == self.currentIndex, fullSizeOnly: self.firstFullSizeOnly && i == 0) } } else if let peer = self.peer { diff --git a/submodules/PeerInfoUI/Sources/GroupInfoSearchNavigationContentNode.swift b/submodules/PeerInfoUI/Sources/GroupInfoSearchNavigationContentNode.swift index 5a1a9ede36..42168c45cc 100644 --- a/submodules/PeerInfoUI/Sources/GroupInfoSearchNavigationContentNode.swift +++ b/submodules/PeerInfoUI/Sources/GroupInfoSearchNavigationContentNode.swift @@ -34,7 +34,7 @@ final class GroupInfoSearchNavigationContentNode: NavigationBarContentNode, Item self.cancel = cancel - self.searchBar = SearchBarNode(theme: SearchBarNodeTheme(theme: theme, hasSeparator: false), strings: strings, fieldStyle: .modern) + self.searchBar = SearchBarNode(theme: SearchBarNodeTheme(theme: theme, hasSeparator: false), strings: strings, fieldStyle: .modern, displayBackground: false) super.init() diff --git a/submodules/Postbox/Sources/Peer.swift b/submodules/Postbox/Sources/Peer.swift index 623889d4a4..48943109a3 100644 --- a/submodules/Postbox/Sources/Peer.swift +++ b/submodules/Postbox/Sources/Peer.swift @@ -151,7 +151,7 @@ public struct PeerId: Hashable, CustomStringConvertible, Comparable, Codable { self.namespace = Namespace(rawValue: UInt32(namespaceBits)) let idHighBits = (data >> (32 + 3)) & 0xffffffff - assert(idHighBits == 0) + //assert(idHighBits == 0) self.id = Id(rawValue: Int32(bitPattern: UInt32(clamping: idLowBits))) } diff --git a/submodules/SearchBarNode/Sources/SearchBarNode.swift b/submodules/SearchBarNode/Sources/SearchBarNode.swift index c5e2208fdd..b54e9be64c 100644 --- a/submodules/SearchBarNode/Sources/SearchBarNode.swift +++ b/submodules/SearchBarNode/Sources/SearchBarNode.swift @@ -807,14 +807,14 @@ public class SearchBarNode: ASDisplayNode, UITextFieldDelegate { private var strings: PresentationStrings? private let cancelText: String? - public init(theme: SearchBarNodeTheme, strings: PresentationStrings, fieldStyle: SearchBarStyle = .legacy, forceSeparator: Bool = false, cancelText: String? = nil) { + public init(theme: SearchBarNodeTheme, strings: PresentationStrings, fieldStyle: SearchBarStyle = .legacy, forceSeparator: Bool = false, displayBackground: Bool = true, cancelText: String? = nil) { self.fieldStyle = fieldStyle self.forceSeparator = forceSeparator self.cancelText = cancelText self.backgroundNode = NavigationBackgroundNode(color: theme.background) self.backgroundNode.isUserInteractionEnabled = false - //self.backgroundNode.isHidden = true + self.backgroundNode.isHidden = !displayBackground self.separatorNode = ASDisplayNode() self.separatorNode.isLayerBacked = true diff --git a/submodules/SearchUI/Sources/SearchDisplayController.swift b/submodules/SearchUI/Sources/SearchDisplayController.swift index 7e65520a4a..341bebff44 100644 --- a/submodules/SearchUI/Sources/SearchDisplayController.swift +++ b/submodules/SearchUI/Sources/SearchDisplayController.swift @@ -38,7 +38,7 @@ public final class SearchDisplayController { private var isSearchingDisposable: Disposable? public init(presentationData: PresentationData, mode: SearchDisplayControllerMode = .navigation, placeholder: String? = nil, hasBackground: Bool = false, hasSeparator: Bool = false, contentNode: SearchDisplayControllerContentNode, cancel: @escaping () -> Void) { - self.searchBar = SearchBarNode(theme: SearchBarNodeTheme(theme: presentationData.theme, hasBackground: hasBackground, hasSeparator: hasSeparator), strings: presentationData.strings, fieldStyle: .modern, forceSeparator: hasSeparator) + self.searchBar = SearchBarNode(theme: SearchBarNodeTheme(theme: presentationData.theme, hasBackground: hasBackground, hasSeparator: hasSeparator), strings: presentationData.strings, fieldStyle: .modern, forceSeparator: hasSeparator, displayBackground: hasBackground) self.backgroundNode = BackgroundNode() self.backgroundNode.backgroundColor = presentationData.theme.chatList.backgroundColor self.backgroundNode.allowsGroupOpacity = true diff --git a/submodules/SettingsUI/Sources/Themes/SettingsThemeWallpaperNode.swift b/submodules/SettingsUI/Sources/Themes/SettingsThemeWallpaperNode.swift index 7ae258e5f8..05f37192fc 100644 --- a/submodules/SettingsUI/Sources/Themes/SettingsThemeWallpaperNode.swift +++ b/submodules/SettingsUI/Sources/Themes/SettingsThemeWallpaperNode.swift @@ -169,7 +169,8 @@ final class SettingsThemeWallpaperNode: ASDisplayNode { self.arguments = PatternWallpaperArguments(colors: [.clear], rotation: nil, customPatternColor: UIColor(white: 0.0, alpha: 1.0 + patternIntensity)) } else { self.imageNode.alpha = CGFloat(file.settings.intensity ?? 50) / 100.0 - self.arguments = PatternWallpaperArguments(colors: [.clear], rotation: nil, customPatternColor: UIColor(white: 0.0, alpha: 1.0)) + let isLight = UIColor.average(of: file.settings.colors.map(UIColor.init(rgb:))).hsb.b > 0.3 + self.arguments = PatternWallpaperArguments(colors: [.clear], rotation: nil, customPatternColor: isLight ? .black : .white) } imageSignal = patternWallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: convertedRepresentations, mode: .thumbnail, autoFetchFullSize: true) } else { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift index 454a270073..363c161817 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorController.swift @@ -130,6 +130,12 @@ final class ThemeAccentColorController: ViewController { deinit { self.applyDisposable.dispose() } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + self.controllerNode.animateWallpaperAppeared() + } override func loadDisplayNode() { super.loadDisplayNode() @@ -213,7 +219,7 @@ final class ThemeAccentColorController: ViewController { } if let themeReference = generalThemeReference { - updatedTheme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: themeReference, accentColor: state.accentColor, backgroundColors: state.backgroundColors, bubbleColors: state.messagesColors, wallpaper: state.initialWallpaper ?? coloredWallpaper, serviceBackgroundColor: serviceBackgroundColor) ?? defaultPresentationTheme + updatedTheme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: themeReference, accentColor: state.accentColor, backgroundColors: state.backgroundColors, bubbleColors: state.messagesColors, wallpaper: coloredWallpaper ?? state.initialWallpaper, serviceBackgroundColor: serviceBackgroundColor) ?? defaultPresentationTheme } else { updatedTheme = customizePresentationTheme(theme, editing: false, accentColor: state.accentColor, backgroundColors: state.backgroundColors, bubbleColors: state.messagesColors, wallpaper: state.initialWallpaper ?? coloredWallpaper) } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index 8749863868..56edc12897 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -156,7 +156,15 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate private let scrollNode: ASScrollNode private let pageControlBackgroundNode: ASDisplayNode private let pageControlNode: PageControlNode + private var patternButtonNode: WallpaperOptionButtonNode + private var colorsButtonNode: WallpaperOptionButtonNode + + private var playButtonNode: HighlightableButtonNode + private let playButtonBackgroundNode: NavigationBackgroundNode + private let playButtonPlayImage: UIImage? + private let playButtonRotateImage: UIImage? + private let chatListBackgroundNode: ASDisplayNode private var chatNodes: [ListViewItemNode]? private let maskNode: ASImageNode @@ -231,6 +239,40 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.pageControlNode = PageControlNode(dotSpacing: 7.0, dotColor: .white, inactiveDotColor: UIColor.white.withAlphaComponent(0.4)) self.patternButtonNode = WallpaperOptionButtonNode(title: self.presentationData.strings.WallpaperPreview_Pattern, value: .check(false)) + self.colorsButtonNode = WallpaperOptionButtonNode(title: self.presentationData.strings.WallpaperPreview_WallpaperColors, value: .colors(false, [])) + + self.playButtonBackgroundNode = NavigationBackgroundNode(color: UIColor(white: 0.0, alpha: 0.3)) + self.playButtonNode = HighlightableButtonNode() + self.playButtonNode.insertSubnode(self.playButtonBackgroundNode, at: 0) + + self.playButtonPlayImage = generateImage(CGSize(width: 48.0, height: 48.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(UIColor.white.cgColor) + + let diameter = size.width + + let factor = diameter / 50.0 + + let size = CGSize(width: 15.0, height: 18.0) + context.translateBy(x: (diameter - size.width) / 2.0 + 1.5, y: (diameter - size.height) / 2.0) + if (diameter < 40.0) { + context.translateBy(x: size.width / 2.0, y: size.height / 2.0) + context.scaleBy(x: factor, y: factor) + context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) + } + let _ = try? drawSvgPath(context, path: "M1.71891969,0.209353049 C0.769586558,-0.350676705 0,0.0908839327 0,1.18800046 L0,16.8564753 C0,17.9569971 0.750549162,18.357187 1.67393713,17.7519379 L14.1073836,9.60224049 C15.0318735,8.99626906 15.0094718,8.04970371 14.062401,7.49100858 L1.71891969,0.209353049 ") + context.fillPath() + if (diameter < 40.0) { + context.translateBy(x: size.width / 2.0, y: size.height / 2.0) + context.scaleBy(x: 1.0 / 0.8, y: 1.0 / 0.8) + context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) + } + context.translateBy(x: -(diameter - size.width) / 2.0 - 1.5, y: -(diameter - size.height) / 2.0) + }) + + self.playButtonRotateImage = generateTintedImage(image: UIImage(bundleImageName: "Settings/ThemeColorRotateIcon"), color: .white) + + self.playButtonNode.setImage(self.playButtonPlayImage, for: []) self.chatListBackgroundNode = ASDisplayNode() @@ -276,6 +318,8 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.addSubnode(self.pageControlBackgroundNode) self.addSubnode(self.pageControlNode) self.addSubnode(self.patternButtonNode) + self.addSubnode(self.colorsButtonNode) + self.addSubnode(self.playButtonNode) self.addSubnode(self.colorPanelNode) self.addSubnode(self.patternPanelNode) self.addSubnode(self.toolbarNode) @@ -288,6 +332,8 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.backgroundWrapperNode.addSubnode(self.backgroundNode) self.patternButtonNode.addTarget(self, action: #selector(self.togglePattern), forControlEvents: .touchUpInside) + self.colorsButtonNode.addTarget(self, action: #selector(self.toggleColors), forControlEvents: .touchUpInside) + self.playButtonNode.addTarget(self, action: #selector(self.playPressed), forControlEvents: .touchUpInside) self.colorPanelNode.colorsChanged = { [weak self] colors, ended in if let strongSelf = self, let section = strongSelf.state.section { @@ -389,7 +435,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate |> mapToThrottled { next -> Signal in return .single(next) |> then(.complete() |> delay(0.0166667, queue: self.queue)) } - |> map { state -> (PresentationTheme?, TelegramWallpaper, UIColor, [UInt32], PatternWallpaperArguments, Bool) in + |> map { state -> (PresentationTheme?, TelegramWallpaper, UIColor, [UInt32], Int32, PatternWallpaperArguments, Bool) in let accentColor = state.accentColor var backgroundColors = state.backgroundColors let messagesColors = state.messagesColors @@ -455,9 +501,9 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate let patternArguments = PatternWallpaperArguments(colors: calcPatternColors(for: state), rotation: wallpaper.settings?.rotation ?? 0, preview: state.preview) - return (updatedTheme, wallpaper, serviceBackgroundColor, backgroundColors, patternArguments, state.preview) + return (updatedTheme, wallpaper, serviceBackgroundColor, backgroundColors, state.rotation, patternArguments, state.preview) } - |> deliverOnMainQueue).start(next: { [weak self] theme, wallpaper, serviceBackgroundColor, backgroundColors, patternArguments, preview in + |> deliverOnMainQueue).start(next: { [weak self] theme, wallpaper, serviceBackgroundColor, backgroundColors, rotation, patternArguments, preview in guard let strongSelf = self else { return } @@ -485,6 +531,8 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate strongSelf.wallpaper = wallpaper strongSelf.patternArguments = patternArguments + strongSelf.colorsButtonNode.colors = backgroundColors.map(UIColor.init(rgb:)) + if !preview { if !backgroundColors.isEmpty { strongSelf.currentBackgroundColors = (backgroundColors, strongSelf.state.rotation, strongSelf.state.patternIntensity) @@ -524,6 +572,8 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate strongSelf.patternPanelNode.serviceBackgroundColor = color strongSelf.pageControlBackgroundNode.backgroundColor = color strongSelf.patternButtonNode.buttonColor = color + strongSelf.colorsButtonNode.buttonColor = color + strongSelf.playButtonBackgroundNode.color = color } }) } @@ -687,6 +737,20 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate if (previousState.patternWallpaper == nil) != (self.state.patternWallpaper == nil) { needsLayout = true } + + if (previousState.backgroundColors.count >= 2) != (self.state.backgroundColors.count >= 2) { + needsLayout = true + } + + if previousState.backgroundColors.count != self.state.backgroundColors.count { + if self.state.backgroundColors.count <= 2 { + self.playButtonNode.setImage(self.playButtonRotateImage, for: []) + } else { + self.playButtonNode.setImage(self.playButtonPlayImage, for: []) + } + } + + self.colorsButtonNode.isSelected = !self.state.colorPanelCollapsed if needsLayout, let (layout, navigationBarHeight, _) = self.validLayout { self.containerLayoutUpdated(layout, navigationBarHeight: navigationBarHeight, transition: animated ? .animated(duration: animationDuration, curve: animationCurve) : .immediate) @@ -701,6 +765,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate } updated.section = section updated.displayPatternPanel = false + updated.colorPanelCollapsed = false return updated }, animated: true) } @@ -825,13 +890,24 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate items = sampleMessages.reversed().map { message in let item = self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message], theme: self.theme, strings: self.presentationData.strings, wallpaper: self.wallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: !message.media.isEmpty ? FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local) : nil, tapMessage: { [weak self] message in - if message.flags.contains(.Incoming) { + guard let strongSelf = self else { + return + } + strongSelf.updateState({ state in + var state = state + if state.section == .background { + state.colorPanelCollapsed = true + state.displayPatternPanel = false + } + return state + }, animated: true) + /*if message.flags.contains(.Incoming) { self?.updateSection(.accent) self?.requestSectionUpdate?(.accent) } else { self?.updateSection(.messages) self?.requestSectionUpdate?(.messages) - } + }*/ }, clickThroughMessage: { [weak self] in self?.updateSection(.background) self?.requestSectionUpdate?(.background) @@ -929,7 +1005,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate var colorPanelOffset: CGFloat = 0.0 if self.state.colorPanelCollapsed { - colorPanelOffset = colorPanelHeight - inputFieldPanelHeight + colorPanelOffset = colorPanelHeight } let colorPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - bottomInset - colorPanelHeight + colorPanelOffset), size: CGSize(width: layout.size.width, height: colorPanelHeight)) bottomInset += (colorPanelHeight - colorPanelOffset) @@ -967,7 +1043,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate var messagesBottomInset: CGFloat = bottomInset if displayOptionButtons { - messagesBottomInset += 46.0 + messagesBottomInset += 56.0 } else if chatListPreviewAvailable { messagesBottomInset += 37.0 } @@ -987,19 +1063,42 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate transition.updateFrame(node: self.maskNode, frame: CGRect(x: 0.0, y: layout.size.height - bottomInset - 80.0, width: bounds.width, height: 80.0)) let patternButtonSize = self.patternButtonNode.measure(layout.size) - let maxButtonWidth = patternButtonSize.width + let colorsButtonSize = self.colorsButtonNode.measure(layout.size) + let maxButtonWidth = max(patternButtonSize.width, colorsButtonSize.width) let buttonSize = CGSize(width: maxButtonWidth, height: 30.0) + + let patternAlpha: CGFloat = displayOptionButtons ? 1.0 : 0.0 + let colorsAlpha: CGFloat = displayOptionButtons ? 1.0 : 0.0 - let leftButtonFrame = CGRect(origin: CGPoint(x: floor(layout.size.width / 2.0 - buttonSize.width - 10.0), y: layout.size.height - bottomInset - 44.0), size: buttonSize) - let centerButtonFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - buttonSize.width) / 2.0), y: layout.size.height - bottomInset - 44.0), size: buttonSize) - let rightButtonFrame = CGRect(origin: CGPoint(x: ceil(layout.size.width / 2.0 + 10.0), y: layout.size.height - bottomInset - 44.0), size: buttonSize) - - var patternAlpha: CGFloat = displayOptionButtons ? 1.0 : 0.0 - - var patternFrame = centerButtonFrame + let patternFrame: CGRect + let colorsFrame: CGRect + + let playButtonSize = CGSize(width: 48.0, height: 48.0) + var centerDistance: CGFloat = 40.0 + let buttonsVerticalOffset: CGFloat = 5.0 + + let playFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - playButtonSize.width) / 2.0), y: layout.size.height - bottomInset - 44.0 - buttonsVerticalOffset + floor((buttonSize.height - playButtonSize.height) / 2.0)), size: playButtonSize) + + let playAlpha: CGFloat + if self.state.backgroundColors.count >= 2 { + playAlpha = displayOptionButtons ? 1.0 : 0.0 + centerDistance += playButtonSize.width + } else { + playAlpha = 0.0 + } + + patternFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - buttonSize.width * 2.0 - centerDistance) / 2.0), y: layout.size.height - bottomInset - 44.0 - buttonsVerticalOffset), size: buttonSize) + colorsFrame = CGRect(origin: CGPoint(x: patternFrame.maxX + centerDistance, y: layout.size.height - bottomInset - 44.0 - buttonsVerticalOffset), size: buttonSize) transition.updateFrame(node: self.patternButtonNode, frame: patternFrame) transition.updateAlpha(node: self.patternButtonNode, alpha: patternAlpha) + transition.updateFrame(node: self.colorsButtonNode, frame: colorsFrame) + transition.updateAlpha(node: self.colorsButtonNode, alpha: colorsAlpha) + + transition.updateFrame(node: self.playButtonNode, frame: playFrame) + transition.updateFrame(node: self.playButtonBackgroundNode, frame: CGRect(origin: CGPoint(), size: playFrame.size)) + self.playButtonBackgroundNode.update(size: playFrame.size, cornerRadius: playFrame.size.height / 2.0, transition: transition) + transition.updateAlpha(node: self.playButtonNode, alpha: playAlpha) } @objc private func togglePattern() { @@ -1011,11 +1110,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate var appeared = false self.updateState({ current in var updated = current - if updated.patternWallpaper != nil { - updated.previousPatternWallpaper = updated.patternWallpaper - updated.patternWallpaper = nil - updated.displayPatternPanel = false - } else { + if !updated.displayPatternPanel { updated.colorPanelCollapsed = false updated.displayPatternPanel = true if current.patternWallpaper == nil, let wallpaper = wallpaper { @@ -1029,6 +1124,27 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate } appeared = true } + } else { + updated.colorPanelCollapsed = true + if updated.patternWallpaper != nil { + updated.previousPatternWallpaper = updated.patternWallpaper + updated.patternWallpaper = nil + updated.displayPatternPanel = false + } else { + updated.colorPanelCollapsed = false + updated.displayPatternPanel = true + if current.patternWallpaper == nil, let wallpaper = wallpaper { + updated.patternWallpaper = wallpaper + if updated.backgroundColors.isEmpty { + if let backgroundColors = backgroundColors { + updated.backgroundColors = backgroundColors.0 + } else { + updated.backgroundColors = [] + } + } + appeared = true + } + } } return updated }, animated: true) @@ -1037,4 +1153,38 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate self.patternPanelNode.didAppear(initialWallpaper: wallpaper, intensity: self.state.patternIntensity) } } + + @objc private func toggleColors() { + self.updateState({ current in + var updated = current + if updated.displayPatternPanel { + updated.displayPatternPanel = false + updated.colorPanelCollapsed = false + } else { + if updated.colorPanelCollapsed { + updated.colorPanelCollapsed = false + } else { + updated.colorPanelCollapsed = true + } + } + updated.displayPatternPanel = false + return updated + }, animated: true) + } + + @objc private func playPressed() { + if self.state.backgroundColors.count >= 3 { + self.backgroundNode.animateEvent(transition: .animated(duration: 0.5, curve: .spring)) + } else { + self.updateState({ state in + var state = state + state.rotation = (state.rotation + 90) % 360 + return state + }, animated: true) + } + } + + func animateWallpaperAppeared() { + self.backgroundNode.animateEvent(transition: .animated(duration: 2.0, curve: .spring), extendAnimation: true) + } } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift index 1f5fd063ac..d88914ce70 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift @@ -319,6 +319,10 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { bordered = false case "WhiteFilled": name = "⍺ White" + case "New1": + name = item.strings.Appearance_AppIconNew1 + case "New2": + name = item.strings.Appearance_AppIconNew2 default: break } diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift index 4ffe09b9b0..2a0858fb80 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperColorPanelNode.swift @@ -528,7 +528,9 @@ final class WallpaperColorPanelNode: ASDisplayNode { if updateLayout, let size = self.validLayout { if let index = self.state.selection { - self.colorPickerNode.color = UIColor(rgb: self.state.colors[index]) + if self.state.colors.count > index { + self.colorPickerNode.color = UIColor(rgb: self.state.colors[index]) + } } self.updateLayout(size: size, transition: animated ? .animated(duration: 0.3, curve: .easeInOut) : .immediate) diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift index a570cc3b46..a64e77dce1 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift @@ -199,6 +199,9 @@ public class WallpaperGalleryController: ViewController { private var patternInitialWallpaper: TelegramWallpaper? private var patternPanelEnabled = false private var colorsPanelEnabled = false + + private var savedPatternWallpaper: TelegramWallpaper? + private var savedPatternIntensity: Int32? public init(context: AccountContext, source: WallpaperListSource) { self.context = context @@ -600,6 +603,10 @@ public class WallpaperGalleryController: ViewController { self.galleryNode.modalAnimateIn() self.bindCentralItemNode(animated: false, updated: false) + + if let centralItemNode = self.galleryNode.pager.centralItemNode() as? WallpaperGalleryItemNode { + centralItemNode.animateWallpaperAppeared() + } } private func bindCentralItemNode(animated: Bool, updated: Bool) { @@ -615,6 +622,11 @@ public class WallpaperGalleryController: ViewController { strongSelf.colorsPanelEnabled = false strongSelf.colorsPanelNode?.view.endEditing(true) + if !enabled { + strongSelf.savedPatternWallpaper = initialWallpaper + strongSelf.savedPatternIntensity = initialWallpaper.settings?.intensity + } + strongSelf.patternInitialWallpaper = enabled ? initialWallpaper : nil switch initialWallpaper { case let .color(color): @@ -631,7 +643,7 @@ public class WallpaperGalleryController: ViewController { strongSelf.galleryNode.scrollView.isScrollEnabled = !enabled if enabled { strongSelf.patternPanelNode?.updateWallpapers() - strongSelf.patternPanelNode?.didAppear() + strongSelf.patternPanelNode?.didAppear(initialWallpaper: strongSelf.savedPatternWallpaper, intensity: strongSelf.savedPatternIntensity) } else { switch initialWallpaper { case .color, .gradient: @@ -657,6 +669,9 @@ public class WallpaperGalleryController: ViewController { strongSelf.patternPanelEnabled = false strongSelf.colorsPanelEnabled = !strongSelf.colorsPanelEnabled strongSelf.galleryNode.scrollView.isScrollEnabled = !strongSelf.colorsPanelEnabled + if !strongSelf.colorsPanelEnabled { + strongSelf.colorsPanelNode?.view.endEditing(true) + } if strongSelf.colorsPanelEnabled { strongSelf.colorsPanelNode?.updateState({ _ in @@ -700,6 +715,7 @@ public class WallpaperGalleryController: ViewController { if updated { if self.colorsPanelEnabled || self.patternPanelEnabled { self.colorsPanelEnabled = false + self.colorsPanelNode?.view.endEditing(true) self.patternPanelEnabled = false if let (layout, _) = self.validLayout { @@ -838,6 +854,10 @@ public class WallpaperGalleryController: ViewController { if let pattern = pattern, case let .file(file) = pattern { let newSettings = WallpaperSettings(blur: file.settings.blur, motion: file.settings.motion, colors: colors, intensity: intensity) let newWallpaper = TelegramWallpaper.file(id: file.id, accessHash: file.accessHash, isCreator: file.isCreator, isDefault: file.isDefault, isPattern: pattern.isPattern, isDark: file.isDark, slug: file.slug, file: file.file, settings: newSettings) + + strongSelf.savedPatternWallpaper = newWallpaper + strongSelf.savedPatternIntensity = intensity + strongSelf.updateEntries(wallpaper: newWallpaper, preview: preview) } default: diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift index bdd4bd03ff..164e6f2558 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift @@ -126,6 +126,8 @@ final class WallpaperGalleryItemNode: GalleryItemNode { private let playButtonPlayImage: UIImage? private let playButtonRotateImage: UIImage? + + private var isReadyDisposable: Disposable? init(context: AccountContext) { self.context = context @@ -154,6 +156,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { self.patternButtonNode.setEnabled(false) self.colorsButtonNode = WallpaperOptionButtonNode(title: self.presentationData.strings.WallpaperPreview_WallpaperColors, value: .colors(false, [.clear])) + self.playButtonBackgroundNode = NavigationBackgroundNode(color: UIColor(white: 0.0, alpha: 0.3)) self.playButtonNode = HighlightableButtonNode() self.playButtonNode.insertSubnode(self.playButtonBackgroundNode, at: 0) @@ -192,15 +195,23 @@ final class WallpaperGalleryItemNode: GalleryItemNode { self.clipsToBounds = true self.backgroundColor = .black - self.imageNode.imageUpdated = { [weak self] _ in - self?._ready.set(.single(Void())) + self.imageNode.imageUpdated = { [weak self] image in + if image != nil { + self?._ready.set(.single(Void())) + } } + self.isReadyDisposable = (self.nativeNode.isReady + |> filter { $0 } + |> take(1) + |> deliverOnMainQueue).start(next: { [weak self] _ in + self?._ready.set(.single(Void())) + }) self.imageNode.view.contentMode = .scaleAspectFill self.imageNode.clipsToBounds = true self.addSubnode(self.wrapperNode) - self.addSubnode(self.statusNode) + //self.addSubnode(self.statusNode) self.addSubnode(self.messagesContainerNode) self.addSubnode(self.blurButtonNode) @@ -220,6 +231,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { self.fetchDisposable.dispose() self.statusDisposable.dispose() self.colorDisposable.dispose() + self.isReadyDisposable?.dispose() } var cropRect: CGRect? { @@ -1159,4 +1171,8 @@ final class WallpaperGalleryItemNode: GalleryItemNode { override func visibilityUpdated(isVisible: Bool) { super.visibilityUpdated(isVisible: isVisible) } + + func animateWallpaperAppeared() { + self.nativeNode.animateEvent(transition: .animated(duration: 2.0, curve: .spring), extendAnimation: true) + } } diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift index 368468de21..c90534837c 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift @@ -13,6 +13,29 @@ import MergeLists private let itemSize = CGSize(width: 88.0, height: 88.0) private let inset: CGFloat = 12.0 +private func intensityToSliderValue(_ value: Int32, allowDark: Bool) -> CGFloat { + if allowDark { + if value < 0 { + return max(0.0, min(100.0, CGFloat(abs(value)))) + } else { + return 100.0 + max(0.0, min(100.0, CGFloat(value))) + } + } else { + return CGFloat(max(value, 0)) * 2.0 + } +} + +private func sliderValueToIntensity(_ value: CGFloat, allowDark: Bool) -> Int32 { + if allowDark { + if value < 100.0 { + return -Int32(value) + } else { + return Int32(value - 100.0) + } + } else { + return Int32(value / 2.0) + } +} private struct WallpaperPatternEntry: Comparable, Identifiable { let index: Int @@ -214,9 +237,12 @@ final class WallpaperPatternPanelNode: ASDisplayNode { var patternChanged: ((TelegramWallpaper?, Int32?, Bool) -> Void)? + private let allowDark: Bool + init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings) { self.context = context self.theme = theme + self.allowDark = theme.overallDarkAppearance self.backgroundNode = NavigationBackgroundNode(color: theme.chat.inputPanel.panelBackgroundColor) @@ -275,16 +301,18 @@ final class WallpaperPatternPanelNode: ASDisplayNode { sliderView.disableSnapToPositions = true sliderView.trackCornerRadius = 1.0 sliderView.lineSize = 2.0 - sliderView.minimumValue = 0.0 sliderView.startValue = 0.0 + sliderView.minimumValue = 0.0 sliderView.maximumValue = 200.0 - sliderView.positionsCount = 3 + if self.allowDark { + sliderView.positionsCount = 3 + } sliderView.useLinesForPositions = true - sliderView.value = 150.0 + sliderView.value = intensityToSliderValue(50, allowDark: self.allowDark) sliderView.disablesInteractiveTransitionGestureRecognizer = true sliderView.backgroundColor = .clear sliderView.backColor = self.theme.list.disclosureArrowColor - sliderView.trackColor = self.theme.list.itemAccentColor + sliderView.trackColor = sliderView.backColor//self.theme.list.itemAccentColor self.view.addSubview(sliderView) sliderView.addTarget(self, action: #selector(self.sliderValueChanged), for: .valueChanged) @@ -335,7 +363,7 @@ final class WallpaperPatternPanelNode: ASDisplayNode { if let strongSelf = self { strongSelf.currentWallpaper = updatedWallpaper if let sliderView = strongSelf.sliderView { - strongSelf.patternChanged?(updatedWallpaper, Int32(sliderView.value - 100.0), false) + strongSelf.patternChanged?(updatedWallpaper, sliderValueToIntensity(sliderView.value, allowDark: strongSelf.allowDark), false) } if let subnodes = strongSelf.scrollNode.subnodes { for case let subnode as SettingsThemeWallpaperNode in subnodes { @@ -377,12 +405,19 @@ final class WallpaperPatternPanelNode: ASDisplayNode { } if let wallpaper = self.currentWallpaper { - self.patternChanged?(wallpaper, Int32(sliderView.value - 100.0), sliderView.isTracking) + self.patternChanged?(wallpaper, sliderValueToIntensity(sliderView.value, allowDark: self.allowDark), sliderView.isTracking) } } func didAppear(initialWallpaper: TelegramWallpaper? = nil, intensity: Int32? = nil) { - var wallpaper = initialWallpaper ?? self.wallpapers.first + let wallpaper: TelegramWallpaper? + + switch initialWallpaper { + case let .file(id, accessHash, isCreator, isDefault, isPattern, isDark, slug, file, _): + wallpaper = .file(id: id, accessHash: accessHash, isCreator: isCreator, isDefault: isDefault, isPattern: isPattern, isDark: isDark, slug: slug, file: file, settings: self.wallpapers[0].settings ?? WallpaperSettings()) + default: + wallpaper = self.wallpapers.first + } if let wallpaper = wallpaper { var selectedFileId: Int64? @@ -391,7 +426,7 @@ final class WallpaperPatternPanelNode: ASDisplayNode { } self.currentWallpaper = wallpaper - self.sliderView?.value = CGFloat(intensity.flatMap { $0 + 100 } ?? 150) + self.sliderView?.value = intensity.flatMap { intensityToSliderValue($0, allowDark: self.allowDark) } ?? intensityToSliderValue(50, allowDark: self.allowDark) self.scrollNode.view.contentOffset = CGPoint() @@ -407,8 +442,8 @@ final class WallpaperPatternPanelNode: ASDisplayNode { } } - if initialWallpaper == nil, let wallpaper = self.currentWallpaper, let sliderView = self.sliderView { - self.patternChanged?(wallpaper, Int32(sliderView.value - 100.0), false) + if let wallpaper = self.currentWallpaper, let sliderView = self.sliderView { + self.patternChanged?(wallpaper, sliderValueToIntensity(sliderView.value, allowDark: self.allowDark), false) } if let selectedNode = selectedNode { diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewControllerNode.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewControllerNode.swift index dc2c3257e5..68ddba3a16 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewControllerNode.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewControllerNode.swift @@ -211,8 +211,12 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol if let stickerPack = strongSelf.stickerPack, case let .result(info, _, _) = stickerPack, info.id.namespace == Namespaces.ItemCollection.CloudStickerPacks { if strongSelf.sendSticker != nil { menuItems.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.StickerPack_Send, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in - if let strongSelf = self, let peekController = strongSelf.peekController, let animationNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.animationNode { - let _ = strongSelf.sendSticker?(.standalone(media: item.file), animationNode, animationNode.bounds) + if let strongSelf = self, let peekController = strongSelf.peekController { + if let animationNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.animationNode { + let _ = strongSelf.sendSticker?(.standalone(media: item.file), animationNode, animationNode.bounds) + } else if let imageNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.imageNode { + let _ = strongSelf.sendSticker?(.standalone(media: item.file), imageNode, imageNode.bounds) + } } f(.default) }))) diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift index 6d5d122f2f..38ee9a8531 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift @@ -70,7 +70,7 @@ public final class StickerPreviewPeekContentNode: ASDisplayNode, PeekControllerC private let item: StickerPreviewPeekItem private var textNode: ASTextNode - private var imageNode: TransformImageNode + public var imageNode: TransformImageNode public var animationNode: AnimatedStickerNode? private var containerLayout: (ContainerViewLayout, CGFloat)? diff --git a/submodules/SyncCore/Sources/CloudFileMediaResource.swift b/submodules/SyncCore/Sources/CloudFileMediaResource.swift index ef238fc3ed..fa65be62e9 100644 --- a/submodules/SyncCore/Sources/CloudFileMediaResource.swift +++ b/submodules/SyncCore/Sources/CloudFileMediaResource.swift @@ -859,3 +859,59 @@ public final class EmptyMediaResource: TelegramMediaResource { return to is EmptyMediaResource } } + +public struct WallpaperDataResourceId: MediaResourceId { + public var uniqueId: String { + return "wallpaper-\(self.slug)" + } + + public var hashValue: Int { + return self.slug.hashValue + } + + public var slug: String + + public init(slug: String) { + self.slug = slug + } + + public func isEqual(to: MediaResourceId) -> Bool { + guard let to = to as? WallpaperDataResourceId else { + return false + } + if self.slug != to.slug { + return false + } + return true + } +} + +public final class WallpaperDataResource: TelegramMediaResource { + public let slug: String + + public init(slug: String) { + self.slug = slug + } + + public init(decoder: PostboxDecoder) { + self.slug = decoder.decodeStringForKey("s", orElse: "") + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeString(self.slug, forKey: "s") + } + + public var id: MediaResourceId { + return WallpaperDataResourceId(slug: self.slug) + } + + public func isEqual(to: MediaResource) -> Bool { + guard let to = to as? WallpaperDataResource else { + return false + } + if self.slug != to.slug { + return false + } + return true + } +} diff --git a/submodules/SyncCore/Sources/SecretChatState.swift b/submodules/SyncCore/Sources/SecretChatState.swift index 26164481a5..48be226cf4 100644 --- a/submodules/SyncCore/Sources/SecretChatState.swift +++ b/submodules/SyncCore/Sources/SecretChatState.swift @@ -249,7 +249,7 @@ public struct SecretChatLayerNegotiationState: PostboxCoding, Equatable { } public init(decoder: PostboxDecoder) { - self.activeLayer = SecretChatSequenceBasedLayer(rawValue: decoder.decodeInt32ForKey("a", orElse: 0)) ?? .layer46 + self.activeLayer = SecretChatSequenceBasedLayer(rawValue: decoder.decodeInt32ForKey("a", orElse: 0)) ?? .layer73 self.locallyRequestedLayer = decoder.decodeOptionalInt32ForKey("lr") self.remotelyRequestedLayer = decoder.decodeOptionalInt32ForKey("rr") } diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 157cda2a0e..a4977bd093 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -142,7 +142,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[767652808] = { return Api.InputEncryptedFile.parse_inputEncryptedFileBigUploaded($0) } dict[1304052993] = { return Api.account.Takeout.parse_takeout($0) } dict[-1456996667] = { return Api.messages.InactiveChats.parse_inactiveChats($0) } - dict[-1464184409] = { return Api.GroupCallParticipant.parse_groupCallParticipant($0) } + dict[-341428482] = { return Api.GroupCallParticipant.parse_groupCallParticipant($0) } dict[1443858741] = { return Api.messages.SentEncryptedMessage.parse_sentEncryptedMessage($0) } dict[-1802240206] = { return Api.messages.SentEncryptedMessage.parse_sentEncryptedFile($0) } dict[289586518] = { return Api.SavedContact.parse_savedPhoneContact($0) } @@ -283,6 +283,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[192428418] = { return Api.Update.parse_updateGroupCallConnection($0) } dict[136574537] = { return Api.messages.VotesList.parse_votesList($0) } dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) } + dict[-592373577] = { return Api.GroupCallParticipantVideoSourceGroup.parse_groupCallParticipantVideoSourceGroup($0) } dict[-373643672] = { return Api.FolderPeer.parse_folderPeer($0) } dict[367766557] = { return Api.ChannelParticipant.parse_channelParticipant($0) } dict[-1557620115] = { return Api.ChannelParticipant.parse_channelParticipantSelf($0) } @@ -579,11 +580,12 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1160215659] = { return Api.InputMessage.parse_inputMessageReplyTo($0) } dict[-2037963464] = { return Api.InputMessage.parse_inputMessagePinned($0) } dict[-1392895362] = { return Api.InputMessage.parse_inputMessageCallbackQuery($0) } + dict[2028213859] = { return Api.GroupCallParticipantVideo.parse_groupCallParticipantVideo($0) } dict[-58224696] = { return Api.PhoneCallProtocol.parse_phoneCallProtocol($0) } dict[-1237848657] = { return Api.StatsDateRangeDays.parse_statsDateRangeDays($0) } dict[-275956116] = { return Api.messages.AffectedFoundMessages.parse_affectedFoundMessages($0) } dict[-1539849235] = { return Api.WallPaper.parse_wallPaper($0) } - dict[-1963717851] = { return Api.WallPaper.parse_wallPaperNoFile($0) } + dict[-528465642] = { return Api.WallPaper.parse_wallPaperNoFile($0) } dict[-1938715001] = { return Api.messages.Messages.parse_messages($0) } dict[978610270] = { return Api.messages.Messages.parse_messagesSlice($0) } dict[1682413576] = { return Api.messages.Messages.parse_channelMessages($0) } @@ -690,7 +692,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[2104790276] = { return Api.DataJSON.parse_dataJSON($0) } dict[-433014407] = { return Api.InputWallPaper.parse_inputWallPaper($0) } dict[1913199744] = { return Api.InputWallPaper.parse_inputWallPaperSlug($0) } - dict[-2077770836] = { return Api.InputWallPaper.parse_inputWallPaperNoFile($0) } + dict[-1770371538] = { return Api.InputWallPaper.parse_inputWallPaperNoFile($0) } dict[-1118798639] = { return Api.InputThemeSettings.parse_inputThemeSettings($0) } dict[1251549527] = { return Api.InputStickeredMedia.parse_inputStickeredMediaPhoto($0) } dict[70813275] = { return Api.InputStickeredMedia.parse_inputStickeredMediaDocument($0) } @@ -1085,6 +1087,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.PopularContact: _1.serialize(buffer, boxed) + case let _1 as Api.GroupCallParticipantVideoSourceGroup: + _1.serialize(buffer, boxed) case let _1 as Api.FolderPeer: _1.serialize(buffer, boxed) case let _1 as Api.ChannelParticipant: @@ -1333,6 +1337,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.InputMessage: _1.serialize(buffer, boxed) + case let _1 as Api.GroupCallParticipantVideo: + _1.serialize(buffer, boxed) case let _1 as Api.PhoneCallProtocol: _1.serialize(buffer, boxed) case let _1 as Api.StatsDateRangeDays: diff --git a/submodules/TelegramApi/Sources/Api2.swift b/submodules/TelegramApi/Sources/Api2.swift index 4b8997261f..e614bcab02 100644 --- a/submodules/TelegramApi/Sources/Api2.swift +++ b/submodules/TelegramApi/Sources/Api2.swift @@ -3604,13 +3604,13 @@ public extension Api { } public enum GroupCallParticipant: TypeConstructorDescription { - case groupCallParticipant(flags: Int32, peer: Api.Peer, date: Int32, activeDate: Int32?, source: Int32, volume: Int32?, about: String?, raiseHandRating: Int64?, video: Api.DataJSON?, presentation: Api.DataJSON?) + case groupCallParticipant(flags: Int32, peer: Api.Peer, date: Int32, activeDate: Int32?, source: Int32, volume: Int32?, about: String?, raiseHandRating: Int64?, video: Api.GroupCallParticipantVideo?, presentation: Api.GroupCallParticipantVideo?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .groupCallParticipant(let flags, let peer, let date, let activeDate, let source, let volume, let about, let raiseHandRating, let video, let presentation): if boxed { - buffer.appendInt32(-1464184409) + buffer.appendInt32(-341428482) } serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) @@ -3652,13 +3652,13 @@ public extension Api { if Int(_1!) & Int(1 << 11) != 0 {_7 = parseString(reader) } var _8: Int64? if Int(_1!) & Int(1 << 13) != 0 {_8 = reader.readInt64() } - var _9: Api.DataJSON? + var _9: Api.GroupCallParticipantVideo? if Int(_1!) & Int(1 << 6) != 0 {if let signature = reader.readInt32() { - _9 = Api.parse(reader, signature: signature) as? Api.DataJSON + _9 = Api.parse(reader, signature: signature) as? Api.GroupCallParticipantVideo } } - var _10: Api.DataJSON? + var _10: Api.GroupCallParticipantVideo? if Int(_1!) & Int(1 << 14) != 0 {if let signature = reader.readInt32() { - _10 = Api.parse(reader, signature: signature) as? Api.DataJSON + _10 = Api.parse(reader, signature: signature) as? Api.GroupCallParticipantVideo } } let _c1 = _1 != nil let _c2 = _2 != nil @@ -7358,6 +7358,50 @@ public extension Api { } } + } + public enum GroupCallParticipantVideoSourceGroup: TypeConstructorDescription { + case groupCallParticipantVideoSourceGroup(semantics: String, sources: [Int32]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .groupCallParticipantVideoSourceGroup(let semantics, let sources): + if boxed { + buffer.appendInt32(-592373577) + } + serializeString(semantics, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(sources.count)) + for item in sources { + serializeInt32(item, buffer: buffer, boxed: false) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .groupCallParticipantVideoSourceGroup(let semantics, let sources): + return ("groupCallParticipantVideoSourceGroup", [("semantics", semantics), ("sources", sources)]) + } + } + + public static func parse_groupCallParticipantVideoSourceGroup(_ reader: BufferReader) -> GroupCallParticipantVideoSourceGroup? { + var _1: String? + _1 = parseString(reader) + var _2: [Int32]? + if let _ = reader.readInt32() { + _2 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup(semantics: _1!, sources: _2!) + } + else { + return nil + } + } + } public enum FolderPeer: TypeConstructorDescription { case folderPeer(peer: Api.Peer, folderId: Int32) @@ -14888,6 +14932,54 @@ public extension Api { } } + } + public enum GroupCallParticipantVideo: TypeConstructorDescription { + case groupCallParticipantVideo(flags: Int32, endpoint: String, sourceGroups: [Api.GroupCallParticipantVideoSourceGroup]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .groupCallParticipantVideo(let flags, let endpoint, let sourceGroups): + if boxed { + buffer.appendInt32(2028213859) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeString(endpoint, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(sourceGroups.count)) + for item in sourceGroups { + item.serialize(buffer, true) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .groupCallParticipantVideo(let flags, let endpoint, let sourceGroups): + return ("groupCallParticipantVideo", [("flags", flags), ("endpoint", endpoint), ("sourceGroups", sourceGroups)]) + } + } + + public static func parse_groupCallParticipantVideo(_ reader: BufferReader) -> GroupCallParticipantVideo? { + var _1: Int32? + _1 = reader.readInt32() + var _2: String? + _2 = parseString(reader) + var _3: [Api.GroupCallParticipantVideoSourceGroup]? + if let _ = reader.readInt32() { + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.GroupCallParticipantVideoSourceGroup.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.GroupCallParticipantVideo.groupCallParticipantVideo(flags: _1!, endpoint: _2!, sourceGroups: _3!) + } + else { + return nil + } + } + } public enum PhoneCallProtocol: TypeConstructorDescription { case phoneCallProtocol(flags: Int32, minLayer: Int32, maxLayer: Int32, libraryVersions: [String]) @@ -14981,7 +15073,7 @@ public extension Api { } public enum WallPaper: TypeConstructorDescription { case wallPaper(id: Int64, flags: Int32, accessHash: Int64, slug: String, document: Api.Document, settings: Api.WallPaperSettings?) - case wallPaperNoFile(flags: Int32, settings: Api.WallPaperSettings?) + case wallPaperNoFile(id: Int64, flags: Int32, settings: Api.WallPaperSettings?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -14996,10 +15088,11 @@ public extension Api { document.serialize(buffer, true) if Int(flags) & Int(1 << 2) != 0 {settings!.serialize(buffer, true)} break - case .wallPaperNoFile(let flags, let settings): + case .wallPaperNoFile(let id, let flags, let settings): if boxed { - buffer.appendInt32(-1963717851) + buffer.appendInt32(-528465642) } + serializeInt64(id, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 2) != 0 {settings!.serialize(buffer, true)} break @@ -15010,8 +15103,8 @@ public extension Api { switch self { case .wallPaper(let id, let flags, let accessHash, let slug, let document, let settings): return ("wallPaper", [("id", id), ("flags", flags), ("accessHash", accessHash), ("slug", slug), ("document", document), ("settings", settings)]) - case .wallPaperNoFile(let flags, let settings): - return ("wallPaperNoFile", [("flags", flags), ("settings", settings)]) + case .wallPaperNoFile(let id, let flags, let settings): + return ("wallPaperNoFile", [("id", id), ("flags", flags), ("settings", settings)]) } } @@ -15046,16 +15139,19 @@ public extension Api { } } public static func parse_wallPaperNoFile(_ reader: BufferReader) -> WallPaper? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Api.WallPaperSettings? - if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() { - _2 = Api.parse(reader, signature: signature) as? Api.WallPaperSettings + var _1: Int64? + _1 = reader.readInt64() + var _2: Int32? + _2 = reader.readInt32() + var _3: Api.WallPaperSettings? + if Int(_2!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() { + _3 = Api.parse(reader, signature: signature) as? Api.WallPaperSettings } } let _c1 = _1 != nil - let _c2 = (Int(_1!) & Int(1 << 2) == 0) || _2 != nil - if _c1 && _c2 { - return Api.WallPaper.wallPaperNoFile(flags: _1!, settings: _2) + let _c2 = _2 != nil + let _c3 = (Int(_2!) & Int(1 << 2) == 0) || _3 != nil + if _c1 && _c2 && _c3 { + return Api.WallPaper.wallPaperNoFile(id: _1!, flags: _2!, settings: _3) } else { return nil @@ -18028,7 +18124,7 @@ public extension Api { public enum InputWallPaper: TypeConstructorDescription { case inputWallPaper(id: Int64, accessHash: Int64) case inputWallPaperSlug(slug: String) - case inputWallPaperNoFile + case inputWallPaperNoFile(id: Int64) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -18045,11 +18141,11 @@ public extension Api { } serializeString(slug, buffer: buffer, boxed: false) break - case .inputWallPaperNoFile: + case .inputWallPaperNoFile(let id): if boxed { - buffer.appendInt32(-2077770836) + buffer.appendInt32(-1770371538) } - + serializeInt64(id, buffer: buffer, boxed: false) break } } @@ -18060,8 +18156,8 @@ public extension Api { return ("inputWallPaper", [("id", id), ("accessHash", accessHash)]) case .inputWallPaperSlug(let slug): return ("inputWallPaperSlug", [("slug", slug)]) - case .inputWallPaperNoFile: - return ("inputWallPaperNoFile", []) + case .inputWallPaperNoFile(let id): + return ("inputWallPaperNoFile", [("id", id)]) } } @@ -18091,7 +18187,15 @@ public extension Api { } } public static func parse_inputWallPaperNoFile(_ reader: BufferReader) -> InputWallPaper? { - return Api.InputWallPaper.inputWallPaperNoFile + var _1: Int64? + _1 = reader.readInt64() + let _c1 = _1 != nil + if _c1 { + return Api.InputWallPaper.inputWallPaperNoFile(id: _1!) + } + else { + return nil + } } } diff --git a/submodules/TelegramApi/Sources/Api4.swift b/submodules/TelegramApi/Sources/Api4.swift index 933026c529..93b5834dd2 100644 --- a/submodules/TelegramApi/Sources/Api4.swift +++ b/submodules/TelegramApi/Sources/Api4.swift @@ -7872,17 +7872,19 @@ public extension Api { }) } - public static func editGroupCallParticipant(flags: Int32, call: Api.InputGroupCall, participant: Api.InputPeer, muted: Api.Bool?, volume: Int32?, raiseHand: Api.Bool?, videoMuted: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func editGroupCallParticipant(flags: Int32, call: Api.InputGroupCall, participant: Api.InputPeer, muted: Api.Bool?, volume: Int32?, raiseHand: Api.Bool?, videoStopped: Api.Bool?, videoPaused: Api.Bool?, presentationPaused: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-1362751260) + buffer.appendInt32(-1524155713) serializeInt32(flags, buffer: buffer, boxed: false) call.serialize(buffer, true) participant.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {muted!.serialize(buffer, true)} if Int(flags) & Int(1 << 1) != 0 {serializeInt32(volume!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 2) != 0 {raiseHand!.serialize(buffer, true)} - if Int(flags) & Int(1 << 3) != 0 {videoMuted!.serialize(buffer, true)} - return (FunctionDescription(name: "phone.editGroupCallParticipant", parameters: [("flags", flags), ("call", call), ("participant", participant), ("muted", muted), ("volume", volume), ("raiseHand", raiseHand), ("videoMuted", videoMuted)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + if Int(flags) & Int(1 << 3) != 0 {videoStopped!.serialize(buffer, true)} + if Int(flags) & Int(1 << 4) != 0 {videoPaused!.serialize(buffer, true)} + if Int(flags) & Int(1 << 5) != 0 {presentationPaused!.serialize(buffer, true)} + return (FunctionDescription(name: "phone.editGroupCallParticipant", parameters: [("flags", flags), ("call", call), ("participant", participant), ("muted", muted), ("volume", volume), ("raiseHand", raiseHand), ("videoStopped", videoStopped), ("videoPaused", videoPaused), ("presentationPaused", presentationPaused)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) var result: Api.Updates? if let signature = reader.readInt32() { diff --git a/submodules/TelegramCallsUI/BUILD b/submodules/TelegramCallsUI/BUILD index b35916515f..42e6e65611 100644 --- a/submodules/TelegramCallsUI/BUILD +++ b/submodules/TelegramCallsUI/BUILD @@ -47,6 +47,7 @@ swift_library( "//submodules/MapResourceToAvatarSizes:MapResourceToAvatarSizes", "//submodules/TextFormat:TextFormat", "//submodules/Markdown:Markdown", + "//submodules/ChatTitleActivityNode:ChatTitleActivityNode", ], visibility = [ "//visibility:public", diff --git a/submodules/TelegramCallsUI/Sources/CallControllerButtonsNode.swift b/submodules/TelegramCallsUI/Sources/CallControllerButtonsNode.swift index bafe04e8c3..12ad79611d 100644 --- a/submodules/TelegramCallsUI/Sources/CallControllerButtonsNode.swift +++ b/submodules/TelegramCallsUI/Sources/CallControllerButtonsNode.swift @@ -11,6 +11,7 @@ enum CallControllerButtonsSpeakerMode: Equatable { case generic case airpods case airpodsPro + case airpodsMax } case none @@ -51,6 +52,7 @@ private enum ButtonDescription: Equatable { case bluetooth case airpods case airpodsPro + case airpodsMax case headphones } @@ -215,6 +217,8 @@ final class CallControllerButtonsNode: ASDisplayNode { soundOutput = .airpods case .airpodsPro: soundOutput = .airpodsPro + case .airpodsMax: + soundOutput = .airpodsMax } } @@ -306,6 +310,8 @@ final class CallControllerButtonsNode: ASDisplayNode { soundOutput = .airpods case .airpodsPro: soundOutput = .airpodsPro + case .airpodsMax: + soundOutput = .airpodsMax } } @@ -362,6 +368,8 @@ final class CallControllerButtonsNode: ASDisplayNode { soundOutput = .airpods case .airpodsPro: soundOutput = .airpodsPro + case .airpodsMax: + soundOutput = .airpodsMax } } @@ -468,6 +476,9 @@ final class CallControllerButtonsNode: ASDisplayNode { case .airpodsPro: image = .airpodsPro title = strings.Call_Audio + case .airpodsMax: + image = .airpodsMax + title = strings.Call_Audio case .headphones: image = .headphones title = strings.Call_Audio diff --git a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift index ddf2440048..ded0d56666 100644 --- a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift +++ b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift @@ -16,6 +16,7 @@ import CallsEmoji import TooltipUI import AlertUI import PresentationDataUtils +import DeviceAccess private func interpolateFrame(from fromValue: CGRect, to toValue: CGRect, t: CGFloat) -> CGRect { return CGRect(x: floorToScreenPixels(toValue.origin.x * t + fromValue.origin.x * (1.0 - t)), y: floorToScreenPixels(toValue.origin.y * t + fromValue.origin.y * (1.0 - t)), width: floorToScreenPixels(toValue.size.width * t + fromValue.size.width * (1.0 - t)), height: floorToScreenPixels(toValue.size.height * t + fromValue.size.height * (1.0 - t))) @@ -559,25 +560,36 @@ final class CallControllerNode: ViewControllerTracingNode, CallControllerNodePro switch callState.state { case .active: if strongSelf.outgoingVideoNodeValue == nil { - let proceed = { - strongSelf.displayedCameraConfirmation = true - switch callState.videoState { - case .inactive: - strongSelf.isRequestingVideo = true - strongSelf.updateButtonsMode() - default: - break + DeviceAccess.authorizeAccess(to: .camera(.videoCall), onlyCheck: true, presentationData: strongSelf.presentationData, present: { [weak self] c, a in + if let strongSelf = self { + strongSelf.present?(c) } - strongSelf.call.requestVideo() - } - - if strongSelf.displayedCameraConfirmation { - proceed() - } else { - strongSelf.present?(textAlertController(sharedContext: strongSelf.sharedContext, title: nil, text: strongSelf.presentationData.strings.Call_CameraConfirmationText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Call_CameraConfirmationConfirm, action: { + }, openSettings: { [weak self] in + self?.sharedContext.applicationBindings.openSettings() + }, _: { [weak self] ready in + guard let strongSelf = self, ready else { + return + } + let proceed = { + strongSelf.displayedCameraConfirmation = true + switch callState.videoState { + case .inactive: + strongSelf.isRequestingVideo = true + strongSelf.updateButtonsMode() + default: + break + } + strongSelf.call.requestVideo() + } + + if strongSelf.displayedCameraConfirmation { proceed() - })])) - } + } else { + strongSelf.present?(textAlertController(sharedContext: strongSelf.sharedContext, title: nil, text: strongSelf.presentationData.strings.Call_CameraConfirmationText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Call_CameraConfirmationConfirm, action: { + proceed() + })])) + } + }) } else { strongSelf.call.disableVideo() strongSelf.cancelScheduledUIHiding() diff --git a/submodules/TelegramCallsUI/Sources/GroupVideoNode.swift b/submodules/TelegramCallsUI/Sources/GroupVideoNode.swift index 11220ccc2a..ead7b595e2 100644 --- a/submodules/TelegramCallsUI/Sources/GroupVideoNode.swift +++ b/submodules/TelegramCallsUI/Sources/GroupVideoNode.swift @@ -30,7 +30,7 @@ final class GroupVideoNode: ASDisplayNode { private var effectView: UIVisualEffectView? private var isBlurred: Bool = false - + private var validLayout: (CGSize, LayoutMode)? var tapped: (() -> Void)? @@ -40,7 +40,7 @@ final class GroupVideoNode: ASDisplayNode { return self.readyPromise.get() } - init(videoView: PresentationCallVideoView, backdropVideoView: PresentationCallVideoView?) { + init(videoView: PresentationCallVideoView, backdropVideoView: PresentationCallVideoView?, disabledText: String? = nil) { self.sourceContainerNode = PinchSourceContainerNode() self.containerNode = ASDisplayNode() self.videoViewContainer = UIView() @@ -50,7 +50,7 @@ final class GroupVideoNode: ASDisplayNode { self.backdropVideoViewContainer = UIView() self.backdropVideoViewContainer.isUserInteractionEnabled = false self.backdropVideoView = backdropVideoView - + super.init() if let backdropVideoView = backdropVideoView { @@ -72,7 +72,7 @@ final class GroupVideoNode: ASDisplayNode { self.addSubnode(self.sourceContainerNode) self.containerNode.view.addSubview(self.videoViewContainer) self.sourceContainerNode.contentNode.addSubnode(self.containerNode) - + self.clipsToBounds = true videoView.setOnFirstFrameReceived({ [weak self] _ in @@ -139,14 +139,30 @@ final class GroupVideoNode: ASDisplayNode { if withBackground { self.backgroundColor = .black } + var snapshotView: UIView? + if let snapshot = self.videoView.view.snapshotView(afterScreenUpdates: false) { + snapshotView = snapshot + snapshot.transform = self.videoView.view.transform + snapshot.frame = self.videoView.view.frame + self.videoView.view.superview?.insertSubview(snapshot, aboveSubview: self.videoView.view) + } UIView.transition(with: withBackground ? self.videoViewContainer : self.view, duration: 0.4, options: [.transitionFlipFromLeft, .curveEaseOut], animations: { UIView.performWithoutAnimation { self.updateIsBlurred(isBlurred: true, light: false, animated: false) } }) { finished in self.backgroundColor = nil - Queue.mainQueue().after(0.4) { - self.updateIsBlurred(isBlurred: false) + if let snapshotView = snapshotView { + Queue.mainQueue().after(0.3) { + snapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak snapshotView] _ in + snapshotView?.removeFromSuperview() + }) + self.updateIsBlurred(isBlurred: false) + } + } else { + Queue.mainQueue().after(0.4) { + self.updateIsBlurred(isBlurred: false) + } } } } @@ -260,9 +276,10 @@ final class GroupVideoNode: ASDisplayNode { let transformScale: CGFloat = rotatedVideoFrame.width / normalizedVideoSize.width transition.updateTransformScale(layer: self.videoViewContainer.layer, scale: transformScale) - if let backdropVideoView = self.backdropVideoView { backdropVideoView.view.alpha = 0.995 + + let topFrame = rotatedVideoFrame rotatedVideoSize = filledSize var rotatedVideoFrame = CGRect(origin: CGPoint(x: floor((size.width - rotatedVideoSize.width) / 2.0), y: floor((size.height - rotatedVideoSize.height) / 2.0)), size: rotatedVideoSize) @@ -270,12 +287,29 @@ final class GroupVideoNode: ASDisplayNode { rotatedVideoFrame.origin.y = floor(rotatedVideoFrame.origin.y) rotatedVideoFrame.size.width = ceil(rotatedVideoFrame.size.width) rotatedVideoFrame.size.height = ceil(rotatedVideoFrame.size.height) + + let isEnabled = !topFrame.contains(rotatedVideoFrame) let normalizedVideoSize = rotatedVideoFrame.size.aspectFilled(CGSize(width: 1080.0, height: 1080.0)) - transition.updatePosition(layer: backdropVideoView.view.layer, position: rotatedVideoFrame.center) + if isEnabled { + self.backdropVideoView?.updateIsEnabled(true) + self.backdropVideoView?.view.isHidden = false + self.backdropEffectView?.isHidden = false + } + transition.updatePosition(layer: backdropVideoView.view.layer, position: rotatedVideoFrame.center, force: true, completion: { [weak self] value in + guard let strongSelf = self, value else { + return + } + if !isEnabled { + strongSelf.backdropVideoView?.updateIsEnabled(false) + strongSelf.backdropVideoView?.view.isHidden = true + strongSelf.backdropEffectView?.isHidden = false + } + }) transition.updateBounds(layer: backdropVideoView.view.layer, bounds: CGRect(origin: CGPoint(), size: normalizedVideoSize)) let transformScale: CGFloat = rotatedVideoFrame.width / normalizedVideoSize.width + transition.updateTransformScale(layer: self.backdropVideoViewContainer.layer, scale: transformScale) let transition: ContainedViewLayoutTransition = .immediate @@ -287,18 +321,9 @@ final class GroupVideoNode: ASDisplayNode { let squareBounds = CGRect(x: (bounds.width - maxSide) / 2.0, y: (bounds.height - maxSide) / 2.0, width: maxSide, height: maxSide) if case let .animated(duration, .spring) = transition { - if false, #available(iOS 10.0, *) { - let timing = UISpringTimingParameters(mass: 3.0, stiffness: 1000.0, damping: 500.0, initialVelocity: CGVector(dx: 0.0, dy: 0.0)) - let animator = UIViewPropertyAnimator(duration: 0.34, timingParameters: timing) - animator.addAnimations { - backdropEffectView.frame = squareBounds - } - animator.startAnimation() - } else { - UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 500.0, initialSpringVelocity: 0.0, options: .layoutSubviews, animations: { - backdropEffectView.frame = squareBounds - }) - } + UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 500.0, initialSpringVelocity: 0.0, options: .layoutSubviews, animations: { + backdropEffectView.frame = squareBounds + }) } else { transition.animateView { backdropEffectView.frame = squareBounds @@ -306,11 +331,19 @@ final class GroupVideoNode: ASDisplayNode { } } + if let effectView = self.effectView { + if case let .animated(duration, .spring) = transition { + UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 500.0, initialSpringVelocity: 0.0, options: .layoutSubviews, animations: { + effectView.frame = bounds + }) + } else { + transition.animateView { + effectView.frame = bounds + } + } + } + let transition: ContainedViewLayoutTransition = .immediate transition.updateTransformRotation(view: self.videoView.view, angle: angle) - - if let effectView = self.effectView { - transition.updateFrame(view: effectView, frame: bounds) - } } } diff --git a/submodules/TelegramCallsUI/Sources/PresentationCall.swift b/submodules/TelegramCallsUI/Sources/PresentationCall.swift index 3932ea9ca3..6d1867ab59 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCall.swift @@ -1017,7 +1017,7 @@ public final class PresentationCallImpl: PresentationCall { self.videoCapturer = videoCapturer } - self.videoCapturer?.makeOutgoingVideoView(completion: { view in + self.videoCapturer?.makeOutgoingVideoView(requestClone: false, completion: { view, _ in if let view = view { let setOnFirstFrameReceived = view.setOnFirstFrameReceived let setOnOrientationUpdated = view.setOnOrientationUpdated diff --git a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift index 51d89788bd..149966e709 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift @@ -24,29 +24,17 @@ private extension GroupCallParticipantsContext.Participant { if let ssrc = self.ssrc { participantSsrcs.insert(ssrc) } - if let jsonParams = self.videoJsonDescription, let jsonData = jsonParams.data(using: .utf8), let json = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { - if let groups = json["ssrc-groups"] as? [Any] { - for group in groups { - if let group = group as? [String: Any] { - if let groupSources = group["sources"] as? [UInt32] { - for source in groupSources { - participantSsrcs.insert(source) - } - } - } + if let videoDescription = self.videoDescription { + for group in videoDescription.ssrcGroups { + for ssrc in group.ssrcs { + participantSsrcs.insert(ssrc) } } } - if let jsonParams = self.presentationJsonDescription, let jsonData = jsonParams.data(using: .utf8), let json = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { - if let groups = json["ssrc-groups"] as? [Any] { - for group in groups { - if let group = group as? [String: Any] { - if let groupSources = group["sources"] as? [UInt32] { - for source in groupSources { - participantSsrcs.insert(source) - } - } - } + if let presentationDescription = self.presentationDescription { + for group in presentationDescription.ssrcGroups { + for ssrc in group.ssrcs { + participantSsrcs.insert(ssrc) } } } @@ -55,16 +43,10 @@ private extension GroupCallParticipantsContext.Participant { var videoSsrcs: Set { var participantSsrcs = Set() - if let jsonParams = self.videoJsonDescription, let jsonData = jsonParams.data(using: .utf8), let json = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { - if let groups = json["ssrc-groups"] as? [Any] { - for group in groups { - if let group = group as? [String: Any] { - if let groupSources = group["sources"] as? [UInt32] { - for source in groupSources { - participantSsrcs.insert(source) - } - } - } + if let videoDescription = self.videoDescription { + for group in videoDescription.ssrcGroups { + for ssrc in group.ssrcs { + participantSsrcs.insert(ssrc) } } } @@ -73,16 +55,10 @@ private extension GroupCallParticipantsContext.Participant { var presentationSsrcs: Set { var participantSsrcs = Set() - if let jsonParams = self.presentationJsonDescription, let jsonData = jsonParams.data(using: .utf8), let json = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { - if let groups = json["ssrc-groups"] as? [Any] { - for group in groups { - if let group = group as? [String: Any] { - if let groupSources = group["sources"] as? [UInt32] { - for source in groupSources { - participantSsrcs.insert(source) - } - } - } + if let presentationDescription = self.presentationDescription { + for group in presentationDescription.ssrcGroups { + for ssrc in group.ssrcs { + participantSsrcs.insert(ssrc) } } } @@ -428,6 +404,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { private var internalState: InternalState = .requesting private let internalStatePromise = Promise(.requesting) private var currentLocalSsrc: UInt32? + private var currentLocalEndpointId: String? private var genericCallContext: OngoingGroupCallContext? private var currentConnectionMode: OngoingGroupCallContext.ConnectionMode = .none @@ -477,6 +454,9 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { return self.isNoiseSuppressionEnabledPromise.get() } private let isNoiseSuppressionEnabledDisposable = MetaDisposable() + + private var isVideoMuted: Bool = false + private let isVideoMutedDisposable = MetaDisposable() private let audioOutputStatePromise = Promise<([AudioSessionOutput], AudioSessionOutput?)>(([], nil)) private var audioOutputStateDisposable: Disposable? @@ -771,7 +751,6 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { return } if case let .established(callInfo, _, _, _, _) = strongSelf.internalState { - var addedParticipants: [(UInt32, String?, String?)] = [] var removedSsrc: [UInt32] = [] for (callId, update) in updates { if callId == callInfo.id { @@ -806,11 +785,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { } } } else if case .joined = participantUpdate.participationStatusChange { - if let ssrc = participantUpdate.ssrc { - addedParticipants.append((ssrc, participantUpdate.videoJsonDescription, participantUpdate.presentationJsonDescription)) - } } else if let ssrc = participantUpdate.ssrc, strongSelf.ssrcMapping[ssrc] == nil { - addedParticipants.append((ssrc, participantUpdate.videoJsonDescription, participantUpdate.presentationJsonDescription)) } } case let .call(isTerminated, _, _, _, _, _): @@ -903,7 +878,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { guard let screencastCapturer = screencastCapturer else { return } - screencastCapturer.injectPixelBuffer(screencastFrame) + screencastCapturer.injectPixelBuffer(screencastFrame.0, rotation: screencastFrame.1) }) self.screencastStateDisposable = (screencastBufferServerContext.isActive |> distinctUntilChanged @@ -942,6 +917,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { self.leaveDisposable.dispose() self.isMutedDisposable.dispose() self.isNoiseSuppressionEnabledDisposable.dispose() + self.isVideoMutedDisposable.dispose() self.memberStatesDisposable.dispose() self.networkStateDisposable.dispose() self.checkCallDisposable?.dispose() @@ -1031,8 +1007,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { participants.append(GroupCallParticipantsContext.Participant( peer: myPeer, ssrc: nil, - videoJsonDescription: nil, - presentationJsonDescription: nil, + videoDescription: nil, + presentationDescription: nil, joinTimestamp: strongSelf.temporaryJoinTimestamp, raiseHandRating: strongSelf.temporaryRaiseHandRating, hasRaiseHand: strongSelf.temporaryHasRaiseHand, @@ -1112,8 +1088,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { participants.append(GroupCallParticipantsContext.Participant( peer: myPeer, ssrc: nil, - videoJsonDescription: nil, - presentationJsonDescription: nil, + videoDescription: nil, + presentationDescription: nil, joinTimestamp: strongSelf.temporaryJoinTimestamp, raiseHandRating: strongSelf.temporaryRaiseHandRating, hasRaiseHand: strongSelf.temporaryHasRaiseHand, @@ -1276,8 +1252,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { participants.append(GroupCallParticipantsContext.Participant( peer: myPeer, ssrc: nil, - videoJsonDescription: nil, - presentationJsonDescription: nil, + videoDescription: nil, + presentationDescription: nil, joinTimestamp: strongSelf.temporaryJoinTimestamp, raiseHandRating: strongSelf.temporaryRaiseHandRating, hasRaiseHand: strongSelf.temporaryHasRaiseHand, @@ -1488,6 +1464,13 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { return } let clientParams = joinCallResult.jsonParams + if let data = clientParams.data(using: .utf8), let dict = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String: Any] { + if let video = dict["video"] as? [String: Any] { + if let endpointId = video["endpoint"] as? String { + strongSelf.currentLocalEndpointId = endpointId + } + } + } strongSelf.ssrcMapping.removeAll() for participant in joinCallResult.state.participants { @@ -1630,10 +1613,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { if let peerId = peerId { if case .local = ssrcKey { orignalMyLevelHasVoice = hasVoice - if !strongSelf.isMutedValue.isEffectivelyMuted { - myLevel = level - myLevelHasVoice = hasVoice - } + myLevel = level + myLevelHasVoice = hasVoice } result.append((peerId, ssrcValue, level, hasVoice)) } else if ssrcValue != 0 { @@ -1838,8 +1819,8 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { participants.append(GroupCallParticipantsContext.Participant( peer: myPeer, ssrc: nil, - videoJsonDescription: nil, - presentationJsonDescription: nil, + videoDescription: nil, + presentationDescription: nil, joinTimestamp: strongSelf.temporaryJoinTimestamp, raiseHandRating: strongSelf.temporaryRaiseHandRating, hasRaiseHand: strongSelf.temporaryHasRaiseHand, @@ -2055,31 +2036,6 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { videoDescription: nil )) } - - if let videoDescription = participant.videoJsonDescription, !videoDescription.isEmpty { - let videoSsrcs = participant.videoSsrcs - if !videoSsrcs.intersection(remainingSsrcs).isEmpty { - remainingSsrcs.subtract(videoSsrcs) - - result.append(OngoingGroupCallContext.MediaChannelDescription( - kind: .video, - audioSsrc: audioSsrc, - videoDescription: videoDescription - )) - } - } - if let videoDescription = participant.presentationJsonDescription, !videoDescription.isEmpty { - let videoSsrcs = participant.presentationSsrcs - if !videoSsrcs.intersection(remainingSsrcs).isEmpty { - remainingSsrcs.subtract(videoSsrcs) - - result.append(OngoingGroupCallContext.MediaChannelDescription( - kind: .video, - audioSsrc: audioSsrc, - videoDescription: videoDescription - )) - } - } } } @@ -2242,6 +2198,10 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { strongSelf.reconnectedAsEventsPipe.putNext(myPeer) strongSelf.switchToTemporaryScheduledParticipantsContext() } else { + strongSelf.disableVideo() + strongSelf.isMutedValue = .muted(isPushToTalkActive: false) + strongSelf.isMutedPromise.set(strongSelf.isMutedValue) + strongSelf.reconnectingAsPeer = myPeer if let participantsContext = strongSelf.participantsContext, let immediateState = participantsContext.immediateState { @@ -2429,28 +2389,32 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { self.participantsContext?.lowerHand() } - public func makeOutgoingVideoView(completion: @escaping (PresentationCallVideoView?) -> Void) { + public func makeOutgoingVideoView(requestClone: Bool, completion: @escaping (PresentationCallVideoView?, PresentationCallVideoView?) -> Void) { if self.videoCapturer == nil { let videoCapturer = OngoingCallVideoCapturer() self.videoCapturer = videoCapturer } - - self.videoCapturer?.makeOutgoingVideoView(completion: { view in - if let view = view { - let setOnFirstFrameReceived = view.setOnFirstFrameReceived - let setOnOrientationUpdated = view.setOnOrientationUpdated - let setOnIsMirroredUpdated = view.setOnIsMirroredUpdated - let updateIsEnabled = view.updateIsEnabled - completion(PresentationCallVideoView( - holder: view, - view: view.view, + + guard let videoCapturer = self.videoCapturer else { + completion(nil, nil) + return + } + videoCapturer.makeOutgoingVideoView(requestClone: requestClone, completion: { mainView, cloneView in + if let mainView = mainView { + let setOnFirstFrameReceived = mainView.setOnFirstFrameReceived + let setOnOrientationUpdated = mainView.setOnOrientationUpdated + let setOnIsMirroredUpdated = mainView.setOnIsMirroredUpdated + let updateIsEnabled = mainView.updateIsEnabled + let mainVideoView = PresentationCallVideoView( + holder: mainView, + view: mainView.view, setOnFirstFrameReceived: { f in setOnFirstFrameReceived(f) }, - getOrientation: { [weak view] in - if let view = view { + getOrientation: { [weak mainView] in + if let mainView = mainView { let mappedValue: PresentationCallVideoView.Orientation - switch view.getOrientation() { + switch mainView.getOrientation() { case .rotation0: mappedValue = .rotation0 case .rotation90: @@ -2465,9 +2429,9 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { return .rotation0 } }, - getAspect: { [weak view] in - if let view = view { - return view.getAspect() + getAspect: { [weak mainView] in + if let mainView = mainView { + return mainView.getAspect() } else { return 0.0 } @@ -2496,9 +2460,73 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { updateIsEnabled: { value in updateIsEnabled(value) } - )) + ) + var cloneVideoView: PresentationCallVideoView? + if let cloneView = cloneView { + let setOnFirstFrameReceived = cloneView.setOnFirstFrameReceived + let setOnOrientationUpdated = cloneView.setOnOrientationUpdated + let setOnIsMirroredUpdated = cloneView.setOnIsMirroredUpdated + let updateIsEnabled = cloneView.updateIsEnabled + cloneVideoView = PresentationCallVideoView( + holder: cloneView, + view: cloneView.view, + setOnFirstFrameReceived: { f in + setOnFirstFrameReceived(f) + }, + getOrientation: { [weak cloneView] in + if let cloneView = cloneView { + let mappedValue: PresentationCallVideoView.Orientation + switch cloneView.getOrientation() { + case .rotation0: + mappedValue = .rotation0 + case .rotation90: + mappedValue = .rotation90 + case .rotation180: + mappedValue = .rotation180 + case .rotation270: + mappedValue = .rotation270 + } + return mappedValue + } else { + return .rotation0 + } + }, + getAspect: { [weak cloneView] in + if let cloneView = cloneView { + return cloneView.getAspect() + } else { + return 0.0 + } + }, + setOnOrientationUpdated: { f in + setOnOrientationUpdated { value, aspect in + let mappedValue: PresentationCallVideoView.Orientation + switch value { + case .rotation0: + mappedValue = .rotation0 + case .rotation90: + mappedValue = .rotation90 + case .rotation180: + mappedValue = .rotation180 + case .rotation270: + mappedValue = .rotation270 + } + f?(mappedValue, aspect) + } + }, + setOnIsMirroredUpdated: { f in + setOnIsMirroredUpdated { value in + f?(value) + } + }, + updateIsEnabled: { value in + updateIsEnabled(value) + } + ) + } + completion(mainVideoView, cloneVideoView) } else { - completion(nil) + completion(nil, nil) } }) } @@ -2511,8 +2539,18 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { self.hasVideo = true if let videoCapturer = self.videoCapturer { self.genericCallContext?.requestVideo(videoCapturer) + self.isVideoMuted = false + self.isVideoMutedDisposable.set((videoCapturer.isActive + |> distinctUntilChanged + |> deliverOnMainQueue).start(next: { [weak self] value in + guard let strongSelf = self else { + return + } + strongSelf.isVideoMuted = !value + strongSelf.updateLocalVideoState() + })) - self.participantsContext?.updateVideoState(peerId: self.joinAsPeerId, isVideoMuted: false) + self.updateLocalVideoState() } } @@ -2520,11 +2558,17 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { self.hasVideo = false if let _ = self.videoCapturer { self.videoCapturer = nil + self.isVideoMutedDisposable.set(nil) self.genericCallContext?.disableVideo() + self.isVideoMuted = true - self.participantsContext?.updateVideoState(peerId: self.joinAsPeerId, isVideoMuted: true) + self.updateLocalVideoState() } } + + private func updateLocalVideoState() { + self.participantsContext?.updateVideoState(peerId: self.joinAsPeerId, isVideoMuted: self.videoCapturer == nil, isVideoPaused: self.isVideoMuted) + } public func switchVideoCamera() { self.useFrontCamera = !self.useFrontCamera @@ -2616,19 +2660,32 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { public func setRequestedVideoList(items: [PresentationGroupCallRequestedVideo]) { self.genericCallContext?.setRequestedVideoChannels(items.compactMap { item -> OngoingGroupCallContext.VideoChannel in - let mappedQuality: OngoingGroupCallContext.VideoChannel.Quality - switch item.quality { + let mappedMinQuality: OngoingGroupCallContext.VideoChannel.Quality + let mappedMaxQuality: OngoingGroupCallContext.VideoChannel.Quality + switch item.minQuality { case .thumbnail: - mappedQuality = .thumbnail + mappedMinQuality = .thumbnail case .medium: - mappedQuality = .medium + mappedMinQuality = .medium case .full: - mappedQuality = .full + mappedMinQuality = .full + } + switch item.maxQuality { + case .thumbnail: + mappedMaxQuality = .thumbnail + case .medium: + mappedMaxQuality = .medium + case .full: + mappedMaxQuality = .full } return OngoingGroupCallContext.VideoChannel( audioSsrc: item.audioSsrc, - videoDescription: item.videoInformation, - quality: mappedQuality + endpointId: item.endpointId, + ssrcGroups: item.ssrcGroups.map { group in + return OngoingGroupCallContext.VideoChannel.SsrcGroup(semantics: group.semantics, ssrcs: group.ssrcs) + }, + minQuality: mappedMinQuality, + maxQuality: mappedMaxQuality ) }) } @@ -2931,6 +2988,11 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { } public func makeIncomingVideoView(endpointId: String, requestClone: Bool, completion: @escaping (PresentationCallVideoView?, PresentationCallVideoView?) -> Void) { + if endpointId == self.currentLocalEndpointId { + self.makeOutgoingVideoView(requestClone: requestClone, completion: completion) + return + } + self.genericCallContext?.makeIncomingVideoView(endpointId: endpointId, requestClone: requestClone, completion: { mainView, cloneView in if let mainView = mainView { let setOnFirstFrameReceived = mainView.setOnFirstFrameReceived diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift b/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift index 6f7e8bdd14..2b6b756bbf 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift @@ -1374,12 +1374,14 @@ final class BlobView: UIView { var level: CGFloat = 0 { didSet { - CATransaction.begin() - CATransaction.setDisableActions(true) - let lv = self.minScale + (self.maxScale - self.minScale) * self.level - self.shapeLayer.transform = CATransform3DMakeScale(lv, lv, 1) - self.scaleUpdated?(self.level) - CATransaction.commit() + if abs(self.level - oldValue) > 0.01 { + CATransaction.begin() + CATransaction.setDisableActions(true) + let lv = self.minScale + (self.maxScale - self.minScale) * self.level + self.shapeLayer.transform = CATransform3DMakeScale(lv, lv, 1) + self.scaleUpdated?(self.level) + CATransaction.commit() + } } } diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatCameraPreviewController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatCameraPreviewController.swift index 7719bd0701..05b5d1185a 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatCameraPreviewController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatCameraPreviewController.swift @@ -426,11 +426,17 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U self.containerLayout = (layout, navigationBarHeight) let isLandscape: Bool - if layout.size.width > layout.size.height, case .compact = layout.metrics.widthClass { + if layout.size.width > layout.size.height { isLandscape = true } else { isLandscape = false } + let isTablet: Bool + if case .regular = layout.metrics.widthClass { + isTablet = true + } else { + isTablet = false + } var insets = layout.insets(options: [.statusBar, .input]) let cleanInsets = layout.insets(options: [.statusBar]) @@ -440,28 +446,44 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U if let _ = self.broadcastPickerView { buttonOffset *= 2.0 } - let bottomInset: CGFloat = 10.0 + cleanInsets.bottom + let bottomInset: CGFloat = isTablet ? 31.0 : 10.0 + cleanInsets.bottom let titleHeight: CGFloat = 54.0 var contentHeight = titleHeight + bottomInset + 52.0 + 17.0 let innerContentHeight: CGFloat = layout.size.height - contentHeight - 160.0 var width = horizontalContainerFillingSizeForLayout(layout: layout, sideInset: layout.safeInsets.left) if isLandscape { - contentHeight = layout.size.height - width = layout.size.width + if isTablet { + width = 870.0 + contentHeight = 690.0 + } else { + contentHeight = layout.size.height + width = layout.size.width + } } else { - contentHeight = titleHeight + bottomInset + 52.0 + 17.0 + innerContentHeight + buttonOffset + if isTablet { + width = 600.0 + contentHeight = 960.0 + } else { + contentHeight = titleHeight + bottomInset + 52.0 + 17.0 + innerContentHeight + buttonOffset + } } let previewInset: CGFloat = 16.0 let sideInset = floor((layout.size.width - width) / 2.0) - let contentContainerFrame = CGRect(origin: CGPoint(x: sideInset, y: layout.size.height - contentHeight), size: CGSize(width: width, height: contentHeight)) - let contentFrame = contentContainerFrame - - var backgroundFrame = CGRect(origin: CGPoint(x: contentFrame.minX, y: contentFrame.minY), size: CGSize(width: contentFrame.width, height: contentFrame.height + 2000.0)) + let contentFrame: CGRect + if isTablet { + contentFrame = CGRect(origin: CGPoint(x: sideInset, y: floor((layout.size.height - contentHeight) / 2.0)), size: CGSize(width: width, height: contentHeight)) + } else { + contentFrame = CGRect(origin: CGPoint(x: sideInset, y: layout.size.height - contentHeight), size: CGSize(width: width, height: contentHeight)) + } + var backgroundFrame = CGRect(origin: CGPoint(x: contentFrame.minX, y: contentFrame.minY), size: CGSize(width: contentFrame.width, height: contentFrame.height)) + if !isTablet { + backgroundFrame.size.height += 2000.0 + } if backgroundFrame.minY < contentFrame.minY { backgroundFrame.origin.y = contentFrame.minY } - transition.updateAlpha(node: self.titleNode, alpha: isLandscape ? 0.0 : 1.0) + transition.updateAlpha(node: self.titleNode, alpha: isLandscape && !isTablet ? 0.0 : 1.0) transition.updateFrame(node: self.backgroundNode, frame: backgroundFrame) transition.updateFrame(node: self.effectNode, frame: CGRect(origin: CGPoint(), size: backgroundFrame.size)) transition.updateFrame(node: self.contentBackgroundNode, frame: CGRect(origin: CGPoint(), size: backgroundFrame.size)) @@ -472,14 +494,24 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U let titleFrame = CGRect(origin: CGPoint(x: floor((contentFrame.width - titleSize.width) / 2.0), y: 18.0), size: titleSize) transition.updateFrame(node: self.titleNode, frame: titleFrame) - let previewSize: CGSize - let previewFrame: CGRect + var previewSize: CGSize + var previewFrame: CGRect if isLandscape { - let previewHeight = contentHeight - layout.intrinsicInsets.bottom - 52.0 - 10.0 + let previewHeight = contentHeight - 21.0 - 52.0 - 10.0 previewSize = CGSize(width: min(contentFrame.width - layout.safeInsets.left - layout.safeInsets.right, previewHeight * 1.7778), height: previewHeight) + if isTablet { + previewSize.width -= previewInset * 2.0 + previewSize.height -= 46.0 + } previewFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((contentFrame.width - previewSize.width) / 2.0), y: 0.0), size: previewSize) + if isTablet { + previewFrame.origin.y += 56.0 + } } else { previewSize = CGSize(width: contentFrame.width - previewInset * 2.0, height: contentHeight - 243.0 - bottomInset + (120.0 - buttonOffset)) + if isTablet { + previewSize.height += 17.0 + } previewFrame = CGRect(origin: CGPoint(x: previewInset, y: 56.0), size: previewSize) } transition.updateFrame(node: self.previewContainerNode, frame: previewFrame) @@ -508,40 +540,49 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U } else { self.screenButton.isHidden = true } - let buttonInset: CGFloat = 6.0 - let buttonWidth = floorToScreenPixels((contentFrame.width - layout.safeInsets.left - layout.safeInsets.right - CGFloat(buttonsCount + 1) * buttonInset) / CGFloat(buttonsCount)) + let buttonInset: CGFloat = 6.0 + var leftButtonInset = buttonInset + let availableWidth: CGFloat + if isTablet { + availableWidth = contentFrame.width - layout.safeInsets.left - layout.safeInsets.right - previewInset * 2.0 + leftButtonInset += previewInset + } else { + availableWidth = contentFrame.width - layout.safeInsets.left - layout.safeInsets.right + } + let buttonWidth = floorToScreenPixels((availableWidth - CGFloat(buttonsCount + 1) * buttonInset) / CGFloat(buttonsCount)) let cameraButtonHeight = self.cameraButton.updateLayout(width: buttonWidth, transition: transition) let screenButtonHeight = self.screenButton.updateLayout(width: buttonWidth, transition: transition) let cancelButtonHeight = self.cancelButton.updateLayout(width: buttonWidth, transition: transition) - transition.updateFrame(node: self.cancelButton, frame: CGRect(x: layout.safeInsets.left + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cancelButtonHeight)) + transition.updateFrame(node: self.cancelButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cancelButtonHeight)) if let broadcastPickerView = self.broadcastPickerView { - transition.updateFrame(node: self.screenButton, frame: CGRect(x: layout.safeInsets.left + buttonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: screenButtonHeight)) - broadcastPickerView.frame = CGRect(x: layout.safeInsets.left + buttonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: screenButtonHeight) - transition.updateFrame(node: self.cameraButton, frame: CGRect(x: layout.safeInsets.left + buttonInset + buttonWidth + buttonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cameraButtonHeight)) + transition.updateFrame(node: self.screenButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: screenButtonHeight)) + broadcastPickerView.frame = CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: screenButtonHeight) + transition.updateFrame(node: self.cameraButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cameraButtonHeight)) } else { - transition.updateFrame(node: self.cameraButton, frame: CGRect(x: layout.safeInsets.left + buttonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cameraButtonHeight)) + transition.updateFrame(node: self.cameraButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cameraButtonHeight)) } } else { + let bottomInset = isTablet ? 21.0 : insets.bottom + 16.0 let buttonInset: CGFloat = 16.0 let cameraButtonHeight = self.cameraButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition) - transition.updateFrame(node: self.cameraButton, frame: CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - insets.bottom - 16.0 - buttonOffset, width: contentFrame.width, height: cameraButtonHeight)) + transition.updateFrame(node: self.cameraButton, frame: CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - bottomInset - buttonOffset, width: contentFrame.width, height: cameraButtonHeight)) let screenButtonHeight = self.screenButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition) - transition.updateFrame(node: self.screenButton, frame: CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - 8.0 - screenButtonHeight - insets.bottom - 16.0, width: contentFrame.width, height: screenButtonHeight)) + transition.updateFrame(node: self.screenButton, frame: CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - 8.0 - screenButtonHeight - bottomInset, width: contentFrame.width, height: screenButtonHeight)) if let broadcastPickerView = self.broadcastPickerView { - broadcastPickerView.frame = CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - 8.0 - screenButtonHeight - insets.bottom - 16.0, width: contentFrame.width + 1000.0, height: screenButtonHeight) + broadcastPickerView.frame = CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - 8.0 - screenButtonHeight - bottomInset, width: contentFrame.width + 1000.0, height: screenButtonHeight) } else { self.screenButton.isHidden = true } let cancelButtonHeight = self.cancelButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition) - transition.updateFrame(node: self.cancelButton, frame: CGRect(x: buttonInset, y: contentHeight - cancelButtonHeight - insets.bottom - 16.0, width: contentFrame.width, height: cancelButtonHeight)) + transition.updateFrame(node: self.cancelButton, frame: CGRect(x: buttonInset, y: contentHeight - cancelButtonHeight - bottomInset, width: contentFrame.width, height: cancelButtonHeight)) } - transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame) + transition.updateFrame(node: self.contentContainerNode, frame: contentFrame) } } diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift index e8fbe6ffc6..ec675f1441 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift @@ -32,6 +32,7 @@ import WebSearchUI import MapResourceToAvatarSizes import SolidRoundedButtonNode import AudioBlob +import DeviceAccess let panelBackgroundColor = UIColor(rgb: 0x1c1c1e) let secondaryPanelBackgroundColor = UIColor(rgb: 0x2c2c2e) @@ -131,8 +132,11 @@ struct VoiceChatPeerEntry: Identifiable { var peer: Peer var about: String? var isMyPeer: Bool - var _videoEndpointId: String? - var _presentationEndpointId: String? + var videoEndpointId: String? + var videoPaused: Bool + var presentationEndpointId: String? + var presentationPaused: Bool + var effectiveSpeakerVideoEndpointId: String? var state: State var muteState: GroupCallParticipantsContext.Participant.MuteState? var canManageCall: Bool @@ -142,22 +146,6 @@ struct VoiceChatPeerEntry: Identifiable { var active: Bool var isLandscape: Bool - var videoEndpointId: String? { - if let muteState = self.muteState, !muteState.canUnmute || muteState.mutedByYou { - return nil - } else { - return self._videoEndpointId - } - } - - var presentationEndpointId: String? { - if let muteState = self.muteState, !muteState.canUnmute || muteState.mutedByYou { - return nil - } else { - return self._presentationEndpointId - } - } - var effectiveVideoEndpointId: String? { return self.presentationEndpointId ?? self.videoEndpointId } @@ -167,7 +155,10 @@ struct VoiceChatPeerEntry: Identifiable { about: String?, isMyPeer: Bool, videoEndpointId: String?, + videoPaused: Bool, presentationEndpointId: String?, + presentationPaused: Bool, + effectiveSpeakerVideoEndpointId: String?, state: State, muteState: GroupCallParticipantsContext.Participant.MuteState?, canManageCall: Bool, @@ -180,8 +171,11 @@ struct VoiceChatPeerEntry: Identifiable { self.peer = peer self.about = about self.isMyPeer = isMyPeer - self._videoEndpointId = videoEndpointId - self._presentationEndpointId = presentationEndpointId + self.videoEndpointId = videoEndpointId + self.videoPaused = videoPaused + self.presentationEndpointId = presentationEndpointId + self.presentationPaused = presentationPaused + self.effectiveSpeakerVideoEndpointId = effectiveSpeakerVideoEndpointId self.state = state self.muteState = muteState self.canManageCall = canManageCall @@ -206,10 +200,19 @@ struct VoiceChatPeerEntry: Identifiable { if lhs.isMyPeer != rhs.isMyPeer { return false } - if lhs._videoEndpointId != rhs._videoEndpointId { + if lhs.videoEndpointId != rhs.videoEndpointId { return false } - if lhs._presentationEndpointId != rhs._presentationEndpointId { + if lhs.videoPaused != rhs.videoPaused { + return false + } + if lhs.presentationEndpointId != rhs.presentationEndpointId { + return false + } + if lhs.presentationPaused != rhs.presentationPaused { + return false + } + if lhs.effectiveSpeakerVideoEndpointId != rhs.effectiveSpeakerVideoEndpointId { return false } if lhs.state != rhs.state { @@ -263,7 +266,7 @@ public final class VoiceChatController: ViewController { let updateIsMuted: (PeerId, Bool) -> Void let switchToPeer: (PeerId, String?, Bool) -> Void let openInvite: () -> Void - let peerContextAction: (VoiceChatPeerEntry, ASDisplayNode, ContextGesture?) -> Void + let peerContextAction: (VoiceChatPeerEntry, ASDisplayNode, ContextGesture?, Bool) -> Void let getPeerVideo: (String, GroupVideoNode.Position) -> GroupVideoNode? var isExpanded: Bool = false @@ -275,7 +278,7 @@ public final class VoiceChatController: ViewController { updateIsMuted: @escaping (PeerId, Bool) -> Void, switchToPeer: @escaping (PeerId, String?, Bool) -> Void, openInvite: @escaping () -> Void, - peerContextAction: @escaping (VoiceChatPeerEntry, ASDisplayNode, ContextGesture?) -> Void, + peerContextAction: @escaping (VoiceChatPeerEntry, ASDisplayNode, ContextGesture?, Bool) -> Void, getPeerVideo: @escaping (String, GroupVideoNode.Position) -> GroupVideoNode? ) { self.updateIsMuted = updateIsMuted @@ -359,7 +362,7 @@ public final class VoiceChatController: ViewController { } private enum ListEntry: Comparable, Identifiable { - case tiles([VoiceChatTileItem]) + case tiles([VoiceChatTileItem], VoiceChatTileLayoutMode) case invite(PresentationTheme, PresentationStrings, String, Bool) case peer(VoiceChatPeerEntry, Int32) @@ -376,8 +379,8 @@ public final class VoiceChatController: ViewController { static func ==(lhs: ListEntry, rhs: ListEntry) -> Bool { switch lhs { - case let .tiles(lhsTiles): - if case let .tiles(rhsTiles) = rhs, lhsTiles == rhsTiles { + case let .tiles(lhsTiles, lhsLayoutMode): + if case let .tiles(rhsTiles, rhsLayoutMode) = rhs, lhsTiles == rhsTiles, lhsLayoutMode == rhsLayoutMode { return true } else { return false @@ -416,7 +419,7 @@ public final class VoiceChatController: ViewController { } } - func tileItem(context: AccountContext, presentationData: PresentationData, interaction: Interaction, videoEndpointId: String, videoReady: Bool, showAsPresentation: Bool) -> VoiceChatTileItem? { + func tileItem(context: AccountContext, presentationData: PresentationData, interaction: Interaction, isTablet: Bool, videoEndpointId: String, videoReady: Bool, videoTimeouted: Bool, videoIsPaused: Bool, showAsPresentation: Bool, secondary: Bool) -> VoiceChatTileItem? { guard case let .peer(peerEntry, _) = self else { return nil } @@ -484,15 +487,16 @@ public final class VoiceChatController: ViewController { } if let about = peerEntry.about, !about.isEmpty { + textIcon = [] text = .text(about, textIcon, .generic) } - return VoiceChatTileItem(account: context.account, peer: peerEntry.peer, videoEndpointId: videoEndpointId, videoReady: videoReady, strings: presentationData.strings, nameDisplayOrder: presentationData.nameDisplayOrder, speaking: speaking, icon: showAsPresentation ? .presentation : icon, text: text, additionalText: additionalText, action: { - interaction.switchToPeer(peer.id, videoEndpointId, true) + return VoiceChatTileItem(account: context.account, peer: peerEntry.peer, videoEndpointId: videoEndpointId, videoReady: videoReady, videoTimeouted: videoTimeouted, isPaused: videoIsPaused, isOwnScreencast: peerEntry.presentationEndpointId == videoEndpointId && peerEntry.isMyPeer, strings: presentationData.strings, nameDisplayOrder: presentationData.nameDisplayOrder, speaking: speaking, secondary: secondary, isTablet: isTablet, icon: showAsPresentation ? .presentation : icon, text: text, additionalText: additionalText, action: { + interaction.switchToPeer(peer.id, videoEndpointId, !secondary) }, contextAction: { node, gesture in - interaction.peerContextAction(peerEntry, node, gesture) - }, getVideo: { - return interaction.getPeerVideo(videoEndpointId, .tile) + interaction.peerContextAction(peerEntry, node, gesture, false) + }, getVideo: { position in + return interaction.getPeerVideo(videoEndpointId, position) }, getAudioLevel: { return interaction.getAudioLevel(peerEntry.peer.id) }) @@ -579,19 +583,42 @@ public final class VoiceChatController: ViewController { } if let about = peerEntry.about, !about.isEmpty { + textIcon = [] text = .text(about, textIcon, .generic) } - return VoiceChatFullscreenParticipantItem(presentationData: ItemListPresentationData(presentationData), nameDisplayOrder: presentationData.nameDisplayOrder, context: context, peer: peerEntry.peer, videoEndpointId: peerEntry.effectiveVideoEndpointId, icon: icon, text: text, textColor: textColor, color: color, isLandscape: peerEntry.isLandscape, active: peerEntry.active, getAudioLevel: { return interaction.getAudioLevel(peerEntry.peer.id) }, getVideo: { - if let endpointId = peerEntry.effectiveVideoEndpointId { - return interaction.getPeerVideo(endpointId, .list) + var videoEndpointId = peerEntry.effectiveVideoEndpointId + var otherVideoEndpointId: String? + let hasBothVideos = peerEntry.presentationEndpointId != nil && peerEntry.videoEndpointId != nil + if hasBothVideos { + if let effectiveVideoEndpointId = peerEntry.effectiveSpeakerVideoEndpointId { + if effectiveVideoEndpointId == peerEntry.videoEndpointId { + videoEndpointId = peerEntry.presentationEndpointId + otherVideoEndpointId = videoEndpointId + } else if effectiveVideoEndpointId == peerEntry.presentationEndpointId { + videoEndpointId = peerEntry.videoEndpointId + otherVideoEndpointId = videoEndpointId + } + } + } + + var isPaused = false + if videoEndpointId == peerEntry.videoEndpointId { + isPaused = peerEntry.videoPaused + } else if videoEndpointId == peerEntry.presentationEndpointId { + isPaused = peerEntry.presentationPaused + } + + return VoiceChatFullscreenParticipantItem(presentationData: ItemListPresentationData(presentationData), nameDisplayOrder: presentationData.nameDisplayOrder, context: context, peer: peerEntry.peer, videoEndpointId: videoEndpointId, isPaused: isPaused, icon: icon, text: text, textColor: textColor, color: color, isLandscape: peerEntry.isLandscape, active: peerEntry.active, showVideoWhenActive: otherVideoEndpointId != nil, getAudioLevel: { return interaction.getAudioLevel(peerEntry.peer.id) }, getVideo: { + if let videoEndpointId = videoEndpointId { + return interaction.getPeerVideo(videoEndpointId, .list) } else { return nil } }, action: { _ in - interaction.switchToPeer(peerEntry.peer.id, nil, false) + interaction.switchToPeer(peerEntry.peer.id, otherVideoEndpointId, false) }, contextAction: { node, gesture in - interaction.peerContextAction(peerEntry, node, gesture) + interaction.peerContextAction(peerEntry, node, gesture, true) }, getUpdatingAvatar: { return interaction.updateAvatarPromise.get() }) @@ -600,8 +627,8 @@ public final class VoiceChatController: ViewController { func item(context: AccountContext, presentationData: PresentationData, interaction: Interaction) -> ListViewItem { switch self { - case let .tiles(tiles): - return VoiceChatTilesGridItem(context: context, tiles: tiles, getIsExpanded: { + case let .tiles(tiles, layoutMode): + return VoiceChatTilesGridItem(context: context, tiles: tiles, layoutMode: layoutMode, getIsExpanded: { return interaction.isExpanded }) case let .invite(_, _, text, isLink): @@ -681,15 +708,16 @@ public final class VoiceChatController: ViewController { } if let about = peerEntry.about, !about.isEmpty { + textIcon = [] expandedText = .text(about, textIcon, .generic) } return VoiceChatParticipantItem(presentationData: ItemListPresentationData(presentationData), dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, context: context, peer: peer, text: text, expandedText: expandedText, icon: icon, getAudioLevel: { return interaction.getAudioLevel(peer.id) }, action: { node in if let node = node { - interaction.peerContextAction(peerEntry, node, nil) + interaction.peerContextAction(peerEntry, node, nil, false) } }, contextAction: { node, gesture in - interaction.peerContextAction(peerEntry, node, gesture) + interaction.peerContextAction(peerEntry, node, gesture, false) }, getIsExpanded: { return interaction.isExpanded }, getUpdatingAvatar: { @@ -736,11 +764,13 @@ public final class VoiceChatController: ViewController { private let listNode: ListView private let fullscreenListContainer: ASDisplayNode private let fullscreenListNode: ListView + private let tileGridNode: VoiceChatTileGridNode private let topPanelNode: ASDisplayNode private let topPanelEdgeNode: ASDisplayNode private let topPanelBackgroundNode: ASDisplayNode private let optionsButton: VoiceChatHeaderButton private let closeButton: VoiceChatHeaderButton + private let panelButton: VoiceChatHeaderButton private let topCornersNode: ASImageNode fileprivate let bottomPanelNode: ASDisplayNode private let bottomGradientNode: ASDisplayNode @@ -786,9 +816,11 @@ public final class VoiceChatController: ViewController { private var animatingInsertion = false private var animatingExpansion = false + private var expansionVelocity: CGFloat? private var animatingAppearance = false private var animatingButtonsSwap = false private var animatingMainStage = false + private var animatingContextMenu = false private var panGestureArguments: (topInset: CGFloat, offset: CGFloat)? private var isPanning = false @@ -796,6 +828,7 @@ public final class VoiceChatController: ViewController { private var currentTitle: String = "" private var currentTitleIsCustom = false private var currentSubtitle: String = "" + private var currentSpeakingSubtitle: String? private var currentCallMembers: ([GroupCallParticipantsContext.Participant], String?)? private var currentInvitedPeers: [Peer]? private var currentSpeakingPeers: Set? @@ -803,9 +836,12 @@ public final class VoiceChatController: ViewController { private var currentNormalButtonColor: UIColor? private var currentActiveButtonColor: UIColor? + private var myEntry: VoiceChatPeerEntry? private var mainEntry: VoiceChatPeerEntry? private var currentEntries: [ListEntry] = [] private var currentFullscreenEntries: [ListEntry] = [] + private var currentTileItems: [VoiceChatTileItem] = [] + private var displayPanelVideos = false private var peerViewDisposable: Disposable? private let leaveDisposable = MetaDisposable() @@ -845,7 +881,8 @@ public final class VoiceChatController: ViewController { private let inviteDisposable = MetaDisposable() private let memberEventsDisposable = MetaDisposable() private let reconnectedAsEventsDisposable = MetaDisposable() - private let voiceSourcesDisposable = MetaDisposable() + private let stateVersionDisposable = MetaDisposable() + private var applicationStateDisposable: Disposable? private let displayAsPeersPromise = Promise<[FoundPeer]>([]) private let inviteLinksPromise = Promise(nil) @@ -873,7 +910,7 @@ public final class VoiceChatController: ViewController { private var currentSpeakers: [PeerId] = [] private var currentDominantSpeaker: (PeerId, String?, Double)? private var currentForcedSpeaker: (PeerId, String?)? - private var effectiveSpeaker: (PeerId, String?)? + private var effectiveSpeaker: (PeerId, String?, Bool, Bool, Bool)? private var updateAvatarDisposable = MetaDisposable() private let updateAvatarPromise = Promise<(TelegramMediaImageRepresentation, Float)?>(nil) @@ -887,6 +924,7 @@ public final class VoiceChatController: ViewController { private var dismissUnmuteTooltipTimer: SwiftSignalKit.Timer? private var lastUnmuteTooltipDisplayTimestamp: Double? + private var panelHidden = false private var displayMode: DisplayMode = .modal(isExpanded: false, isFilled: false) { didSet { if case let .modal(isExpanded, _) = self.displayMode { @@ -952,6 +990,8 @@ public final class VoiceChatController: ViewController { return presentationData.strings.VoiceOver_ScrollStatus(row, count).0 } + self.tileGridNode = VoiceChatTileGridNode(context: self.context) + self.topPanelNode = ASDisplayNode() self.topPanelNode.clipsToBounds = false @@ -971,6 +1011,8 @@ public final class VoiceChatController: ViewController { self.optionsButton.setContent(.more(optionsCircleImage(dark: false))) self.closeButton = VoiceChatHeaderButton(context: self.context) self.closeButton.setContent(.image(closeButtonImage(dark: false))) + self.panelButton = VoiceChatHeaderButton(context: self.context, wide: true) + self.panelButton.setContent(.image(panelButtonImage(dark: false))) self.titleNode = VoiceChatTitleNode(theme: self.presentationData.theme) @@ -1121,7 +1163,7 @@ public final class VoiceChatController: ViewController { strongSelf.updateDisplayMode(.fullscreen(controlsHidden: false)) } else { strongSelf.currentForcedSpeaker = nil - if peerId != strongSelf.currentDominantSpeaker?.0 { + if peerId != strongSelf.currentDominantSpeaker?.0 || (videoEndpointId != nil && videoEndpointId != strongSelf.currentDominantSpeaker?.1) { strongSelf.currentDominantSpeaker = (peerId, videoEndpointId, CACurrentMediaTime()) } strongSelf.updateMainVideo(waitForFullSize: true, updateMembers: true, force: true) @@ -1397,7 +1439,7 @@ public final class VoiceChatController: ViewController { } strongSelf.controller?.push(controller) }) - }, peerContextAction: { [weak self] entry, sourceNode, gesture in + }, peerContextAction: { [weak self] entry, sourceNode, gesture, fullscreen in guard let strongSelf = self, let controller = strongSelf.controller, let sourceNode = sourceNode as? ContextExtractedContentContainingNode else { return } @@ -1591,9 +1633,14 @@ public final class VoiceChatController: ViewController { let openTitle: String let openIcon: UIImage? - if peer.id.namespace == Namespaces.Peer.CloudChannel { - openTitle = strongSelf.presentationData.strings.VoiceChat_OpenChannel - openIcon = UIImage(bundleImageName: "Chat/Context Menu/Channels") + if [Namespaces.Peer.CloudChannel, Namespaces.Peer.CloudGroup].contains(peer.id.namespace) { + if let peer = peer as? TelegramChannel, case .broadcast = peer.info { + openTitle = strongSelf.presentationData.strings.VoiceChat_OpenChannel + openIcon = UIImage(bundleImageName: "Chat/Context Menu/Channels") + } else { + openTitle = strongSelf.presentationData.strings.VoiceChat_OpenGroup + openIcon = UIImage(bundleImageName: "Chat/Context Menu/Groups") + } } else { openTitle = strongSelf.presentationData.strings.Conversation_ContextMenuSendMessage openIcon = UIImage(bundleImageName: "Chat/Context Menu/Message") @@ -1615,7 +1662,7 @@ public final class VoiceChatController: ViewController { f(.dismissWithoutContent) }))) - if let callState = strongSelf.callState, (callState.canManageCall && !callState.adminIds.contains(peer.id)) { + if let callState = strongSelf.callState, (callState.canManageCall && !callState.adminIds.contains(peer.id)), peer.id != strongSelf.call.peerId { items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.VoiceChat_RemovePeer, textColor: .destructive, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Clear"), color: theme.actionSheet.destructiveActionTextColor) }, action: { [weak self] c, _ in @@ -1670,8 +1717,39 @@ public final class VoiceChatController: ViewController { return itemsForEntry(entry, muteState) } + var centerVertically = entry.peer.smallProfileImage != nil || (!fullscreen && entry.effectiveVideoEndpointId != nil) + if let (layout, _) = strongSelf.validLayout, case .regular = layout.metrics.widthClass { + centerVertically = false + } + let dismissPromise = ValuePromise(false) - let source = VoiceChatContextExtractedContentSource(controller: controller, sourceNode: sourceNode, keepInPlace: false, blurBackground: true, centerVertically: entry.peer.smallProfileImage != nil, shouldBeDismissed: dismissPromise.get()) + let source = VoiceChatContextExtractedContentSource(sourceNode: sourceNode, maskView: strongSelf.transitionMaskView, keepInPlace: false, blurBackground: true, centerVertically: centerVertically, shouldBeDismissed: dismissPromise.get(), animateTransitionIn: { [weak self] in + if let strongSelf = self { + strongSelf.animatingContextMenu = true + strongSelf.updateDecorationsLayout(transition: .immediate) + if strongSelf.isLandscape { + strongSelf.transitionMaskTopFillLayer.opacity = 1.0 + } + strongSelf.transitionMaskBottomFillLayer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4, removeOnCompletion: false, completion: { [weak self] _ in + Queue.mainQueue().after(0.3) { + self?.transitionMaskTopFillLayer.opacity = 0.0 + self?.transitionMaskBottomFillLayer.removeAllAnimations() + self?.animatingContextMenu = false + self?.updateDecorationsLayout(transition: .immediate) + } + }) + } + }, animateTransitionOut: { [weak self] in + if let strongSelf = self { + strongSelf.animatingContextMenu = true + strongSelf.updateDecorationsLayout(transition: .immediate) + strongSelf.transitionMaskTopFillLayer.animateAlpha(from: 1.0, to: 0.0, duration: 0.4) + strongSelf.transitionMaskBottomFillLayer.animateAlpha(from: 1.0, to: 0.0, duration: 0.4, completion: { [weak self] _ in + self?.animatingContextMenu = false + self?.updateDecorationsLayout(transition: .immediate) + }) + } + }) sourceNode.requestDismiss = { dismissPromise.set(true) } @@ -1684,7 +1762,7 @@ public final class VoiceChatController: ViewController { return nil } var ignore = false - if case .fullscreen = strongSelf.displayMode { + if case .fullscreen = strongSelf.displayMode, !strongSelf.isPanning { ignore = ![.mainstage, .list].contains(position) } else { ignore = position != .tile @@ -1709,6 +1787,7 @@ public final class VoiceChatController: ViewController { self.topPanelNode.addSubnode(self.titleNode) self.topPanelNode.addSubnode(self.optionsButton) self.topPanelNode.addSubnode(self.closeButton) + self.topPanelNode.addSubnode(self.panelButton) self.bottomPanelNode.addSubnode(self.cameraButton) self.bottomPanelNode.addSubnode(self.audioButton) @@ -1730,6 +1809,7 @@ public final class VoiceChatController: ViewController { self.listContainer.addSubnode(self.topCornersNode) self.contentContainer.addSubnode(self.bottomGradientNode) self.contentContainer.addSubnode(self.bottomPanelBackgroundNode) + self.contentContainer.addSubnode(self.tileGridNode) self.contentContainer.addSubnode(self.mainStageContainerNode) self.contentContainer.addSubnode(self.transitionContainerNode) self.contentContainer.addSubnode(self.bottomPanelNode) @@ -1820,12 +1900,23 @@ public final class VoiceChatController: ViewController { strongSelf.optionsButton.alpha = 0.0 strongSelf.closeButton.isUserInteractionEnabled = false strongSelf.closeButton.alpha = 0.0 - } else if let callState = strongSelf.callState, callState.canManageCall { - strongSelf.optionsButton.isUserInteractionEnabled = true - } else if displayAsPeers.count > 1 { - strongSelf.optionsButton.isUserInteractionEnabled = true + strongSelf.panelButton.isUserInteractionEnabled = false + strongSelf.panelButton.alpha = 0.0 } else { - strongSelf.optionsButton.isUserInteractionEnabled = true + if let (layout, _) = strongSelf.validLayout { + if case .regular = layout.metrics.widthClass, !strongSelf.peerIdToEndpointId.isEmpty { + strongSelf.panelButton.isUserInteractionEnabled = true + } else { + strongSelf.panelButton.isUserInteractionEnabled = false + } + } + if let callState = strongSelf.callState, callState.canManageCall { + strongSelf.optionsButton.isUserInteractionEnabled = true + } else if displayAsPeers.count > 1 { + strongSelf.optionsButton.isUserInteractionEnabled = true + } else { + strongSelf.optionsButton.isUserInteractionEnabled = true + } } if let (layout, navigationHeight) = strongSelf.validLayout { @@ -1935,6 +2026,8 @@ public final class VoiceChatController: ViewController { var effectiveLevel: Float = 0.0 if let state = strongSelf.callState, state.muteState == nil || strongSelf.pushingToTalk { effectiveLevel = level + } else if level > 0.1 { + effectiveLevel = level * 0.5 } strongSelf.actionButton.updateLevel(CGFloat(effectiveLevel)) }) @@ -2004,6 +2097,7 @@ public final class VoiceChatController: ViewController { } self.optionsButton.addTarget(self, action: #selector(self.optionsPressed), forControlEvents: .touchUpInside) self.closeButton.addTarget(self, action: #selector(self.closePressed), forControlEvents: .touchUpInside) + self.panelButton.addTarget(self, action: #selector(self.panelPressed), forControlEvents: .touchUpInside) self.actionButtonColorDisposable = (self.actionButton.outerColor |> deliverOnMainQueue).start(next: { [weak self] normalColor, activeColor in @@ -2070,7 +2164,7 @@ public final class VoiceChatController: ViewController { strongSelf.presentUndoOverlay(content: .invitedToVoiceChat(context: strongSelf.context, peer: peer, text: strongSelf.presentationData.strings.VoiceChat_DisplayAsSuccess(peer.displayTitle(strings: strongSelf.presentationData.strings, displayOrder: strongSelf.presentationData.nameDisplayOrder)).0), action: { _ in return false }) })) - self.voiceSourcesDisposable.set((self.call.stateVersion + self.stateVersionDisposable.set((self.call.stateVersion |> distinctUntilChanged |> deliverOnMainQueue).start(next: { [weak self] _ in guard let strongSelf = self else { @@ -2119,20 +2213,35 @@ public final class VoiceChatController: ViewController { } self.mainStageNode.tapped = { [weak self] in - if let strongSelf = self { - let effectiveDisplayMode = strongSelf.displayMode - let nextDisplayMode: DisplayMode - switch effectiveDisplayMode { - case .modal: - nextDisplayMode = effectiveDisplayMode - case let .fullscreen(controlsHidden): - if controlsHidden { - nextDisplayMode = .fullscreen(controlsHidden: false) - } else { - nextDisplayMode = .fullscreen(controlsHidden: true) - } + if let strongSelf = self, let (layout, navigationHeight) = strongSelf.validLayout, !strongSelf.animatingExpansion && !strongSelf.animatingMainStage && !strongSelf.mainStageNode.animating { + if case .regular = layout.metrics.widthClass { + strongSelf.panelHidden = !strongSelf.panelHidden + + strongSelf.animatingExpansion = true + let transition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .easeInOut) + strongSelf.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: transition) + strongSelf.updateDecorationsLayout(transition: transition) + } else { + let effectiveDisplayMode = strongSelf.displayMode + let nextDisplayMode: DisplayMode + switch effectiveDisplayMode { + case .modal: + nextDisplayMode = effectiveDisplayMode + case let .fullscreen(controlsHidden): + if controlsHidden { + nextDisplayMode = .fullscreen(controlsHidden: false) + } else { + nextDisplayMode = .fullscreen(controlsHidden: true) + } + } + strongSelf.updateDisplayMode(nextDisplayMode) } - strongSelf.updateDisplayMode(nextDisplayMode) + } + } + + self.mainStageNode.stopScreencast = { [weak self] in + if let strongSelf = self { + strongSelf.call.disableScreencast() } } @@ -2146,7 +2255,7 @@ public final class VoiceChatController: ViewController { self.mainStageNode.togglePin = { [weak self] in if let strongSelf = self { - if let (peerId, videoEndpointId) = strongSelf.effectiveSpeaker { + if let (peerId, videoEndpointId, _, _, _) = strongSelf.effectiveSpeaker { if let _ = strongSelf.currentForcedSpeaker { strongSelf.currentDominantSpeaker = (peerId, videoEndpointId, CACurrentMediaTime()) strongSelf.currentForcedSpeaker = nil @@ -2167,6 +2276,14 @@ public final class VoiceChatController: ViewController { self.mainStageNode.getAudioLevel = { [weak self] peerId in return self?.itemInteraction?.getAudioLevel(peerId) ?? .single(0.0) } + + self.applicationStateDisposable = (self.context.sharedContext.applicationBindings.applicationIsActive + |> deliverOnMainQueue).start(next: { [weak self] active in + guard let strongSelf = self else { + return + } + strongSelf.appIsActive = active + }) } deinit { @@ -2184,10 +2301,11 @@ public final class VoiceChatController: ViewController { self.inviteDisposable.dispose() self.memberEventsDisposable.dispose() self.reconnectedAsEventsDisposable.dispose() - self.voiceSourcesDisposable.dispose() + self.stateVersionDisposable.dispose() self.updateAvatarDisposable.dispose() self.ignoreConnectingTimer?.invalidate() self.readyVideoDisposables.dispose() + self.applicationStateDisposable?.dispose() } private func openSettingsMenu(sourceNode: ASDisplayNode, gesture: ContextGesture?) { @@ -2231,7 +2349,7 @@ public final class VoiceChatController: ViewController { } } - if let (availableOutputs, currentOutput) = strongSelf.audioOutputState { + if let (availableOutputs, currentOutput) = strongSelf.audioOutputState, availableOutputs.count > 1 { var currentOutputTitle = "" for output in availableOutputs { if output == currentOutput { @@ -2302,6 +2420,15 @@ public final class VoiceChatController: ViewController { }))) } + items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.VoiceChat_NoiseSuppression, textColor: .primary, textLayout: .secondLineWithValue(strongSelf.isNoiseSuppressionEnabled ? strongSelf.presentationData.strings.VoiceChat_NoiseSuppressionEnabled : strongSelf.presentationData.strings.VoiceChat_NoiseSuppressionDisabled), icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Call/Context Menu/Noise"), color: theme.actionSheet.primaryTextColor) + }, action: { _, f in + f(.dismissWithoutContent) + if let strongSelf = self { + strongSelf.call.setIsNoiseSuppressionEnabled(!strongSelf.isNoiseSuppressionEnabled) + } + }))) + if let callState = strongSelf.callState, callState.isVideoEnabled && (callState.muteState?.canUnmute ?? true) { if #available(iOS 12.0, *) { if strongSelf.call.hasScreencast { @@ -2375,18 +2502,6 @@ public final class VoiceChatController: ViewController { } } - /*items.append(.action(ContextMenuActionItem(text: strongSelf.isNoiseSuppressionEnabled ? "Disable Noise Suppression" : "Enable Noise Suppression", textColor: .primary, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Unmute"), color: theme.actionSheet.primaryTextColor) - }, action: { _, f in - f(.dismissWithoutContent) - - guard let strongSelf = self else { - return - } - - strongSelf.call.setIsNoiseSuppressionEnabled(!strongSelf.isNoiseSuppressionEnabled) - })))*/ - if canManageCall { let isScheduled = strongSelf.isScheduled items.append(.action(ContextMenuActionItem(text: isScheduled ? strongSelf.presentationData.strings.VoiceChat_CancelVoiceChat : strongSelf.presentationData.strings.VoiceChat_EndVoiceChat, textColor: .destructive, icon: { theme in @@ -2825,7 +2940,7 @@ public final class VoiceChatController: ViewController { self.timerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak self] _ in self?.timerNode.isHidden = true }) - + if self.audioButton.isHidden { self.audioButton.isHidden = false self.audioButton.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) @@ -2845,6 +2960,18 @@ public final class VoiceChatController: ViewController { self.controller?.dismissAllTooltips() } + @objc private func panelPressed() { + guard let (layout, navigationHeight) = self.validLayout, !self.animatingExpansion && !self.animatingMainStage && !self.mainStageNode.animating else { + return + } + self.panelHidden = !self.panelHidden + + self.animatingExpansion = true + let transition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .easeInOut) + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: transition) + self.updateDecorationsLayout(transition: transition) + } + @objc private func leavePressed() { self.hapticFeedback.impact(.light) self.controller?.dismissAllTooltips() @@ -3133,6 +3260,10 @@ public final class VoiceChatController: ViewController { Queue.mainQueue().after(0.1) { self.temporaryPushingToTalk = false self.actionButton.pressing = false + + if let (layout, navigationHeight) = self.validLayout { + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .spring)) + } } } else { self.pushingToTalk = false @@ -3265,37 +3396,45 @@ public final class VoiceChatController: ViewController { @objc private func cameraPressed() { self.hapticFeedback.impact(.light) - if self.call.hasVideo || self.call.hasScreencast { + if self.call.hasVideo { self.call.disableVideo() - self.call.disableScreencast() if let (layout, navigationHeight) = self.validLayout { self.animatingButtonsSwap = true self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.4, curve: .spring)) } } else { - self.call.makeOutgoingVideoView { [weak self] view in - guard let strongSelf = self, let view = view else { + DeviceAccess.authorizeAccess(to: .camera(.videoCall), onlyCheck: true, presentationData: self.presentationData.withUpdated(theme: self.darkTheme), present: { [weak self] c, a in + self?.controller?.present(c, in: .window(.root), with: a) + }, openSettings: { [weak self] in + self?.context.sharedContext.applicationBindings.openSettings() + }, _: { [weak self] ready in + guard let strongSelf = self, ready else { return } - let cameraNode = GroupVideoNode(videoView: view, backdropVideoView: nil) - let controller = VoiceChatCameraPreviewController(context: strongSelf.context, cameraNode: cameraNode, shareCamera: { [weak self] videoNode, unmuted in - if let strongSelf = self { - strongSelf.call.setIsMuted(action: unmuted ? .unmuted : .muted(isPushToTalkActive: false)) - strongSelf.call.requestVideo() - - if let (layout, navigationHeight) = strongSelf.validLayout { - strongSelf.animatingButtonsSwap = true - strongSelf.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.4, curve: .spring)) + strongSelf.call.makeOutgoingVideoView(requestClone: false, completion: { [weak self] view, _ in + guard let strongSelf = self, let view = view else { + return + } + let cameraNode = GroupVideoNode(videoView: view, backdropVideoView: nil) + let controller = VoiceChatCameraPreviewController(context: strongSelf.context, cameraNode: cameraNode, shareCamera: { [weak self] videoNode, unmuted in + if let strongSelf = self { + strongSelf.call.setIsMuted(action: unmuted ? .unmuted : .muted(isPushToTalkActive: false)) + strongSelf.call.requestVideo() + + if let (layout, navigationHeight) = strongSelf.validLayout { + strongSelf.animatingButtonsSwap = true + strongSelf.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.4, curve: .spring)) + } } - } - }, switchCamera: { [weak self] in - Queue.mainQueue().after(0.1) { - self?.call.switchVideoCamera() - } + }, switchCamera: { [weak self] in + Queue.mainQueue().after(0.1) { + self?.call.switchVideoCamera() + } + }) + strongSelf.controller?.present(controller, in: .window(.root)) }) - strongSelf.controller?.present(controller, in: .window(.root)) - } + }) } } @@ -3336,6 +3475,9 @@ public final class VoiceChatController: ViewController { } private var effectiveBottomAreaHeight: CGFloat { + if let (layout, _) = self.validLayout, case .regular = layout.metrics.widthClass { + return bottomAreaHeight + } switch self.displayMode { case .modal: return bottomAreaHeight @@ -3358,29 +3500,24 @@ public final class VoiceChatController: ViewController { return } - var isLandscape = false - var effectiveDisplayMode = self.displayMode - if case .compact = layout.metrics.widthClass, layout.size.width > layout.size.height { - isLandscape = true - if case .fullscreen = effectiveDisplayMode { - } else { - effectiveDisplayMode = .fullscreen(controlsHidden: false) - } - } + let isLandscape = self.isLandscape let layoutTopInset: CGFloat = max(layout.statusBarHeight ?? 0.0, layout.safeInsets.top) let listTopInset = isLandscape ? topPanelHeight : layoutTopInset + topPanelHeight let bottomPanelHeight = isLandscape ? layout.intrinsicInsets.bottom : bottomAreaHeight + layout.intrinsicInsets.bottom - var size = layout.size - if case .regular = layout.metrics.widthClass { - size.width = floor(min(size.width, size.height) * 0.5) - } - + let size = layout.size let contentWidth: CGFloat + var contentLeftInset: CGFloat = 0.0 + var forceUpdate = false if case .regular = layout.metrics.widthClass { - size.width = floor(min(size.width, size.height) * 0.5) - contentWidth = size.width + contentWidth = max(320.0, min(375.0, floor(size.width * 0.3))) + if self.peerIdToEndpointId.isEmpty { + contentLeftInset = 0.0 + } else { + contentLeftInset = self.panelHidden ? layout.size.width : layout.size.width - contentWidth + } + forceUpdate = true } else { contentWidth = isLandscape ? min(530.0, size.width - 210.0) : size.width } @@ -3400,22 +3537,23 @@ public final class VoiceChatController: ViewController { } var bottomEdge: CGFloat = 0.0 - self.listNode.forEachItemNode { itemNode in - if let itemNode = itemNode as? ListViewItemNode { - let convertedFrame = self.listNode.view.convert(itemNode.frame, to: self.contentContainer.view) - if convertedFrame.maxY > bottomEdge { - bottomEdge = convertedFrame.maxY + if case .regular = layout.metrics.widthClass { + bottomEdge = size.height + } else { + self.listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? ListViewItemNode { + let convertedFrame = self.listNode.view.convert(itemNode.frame, to: self.contentContainer.view) + if convertedFrame.maxY > bottomEdge { + bottomEdge = convertedFrame.maxY + } } } - } - - let offset = topInset - - if bottomEdge.isZero { - bottomEdge = self.listNode.frame.minY + 46.0 + 56.0 + if bottomEdge.isZero { + bottomEdge = self.listNode.frame.minY + 46.0 + 56.0 + } } - let rawPanelOffset = offset + listTopInset - topPanelHeight + let rawPanelOffset = topInset + listTopInset - topPanelHeight let panelOffset = max(layoutTopInset, rawPanelOffset) let topPanelFrame: CGRect if isLandscape { @@ -3436,6 +3574,10 @@ public final class VoiceChatController: ViewController { transition.updateFrame(node: self.transitionContainerNode, frame: transitionContainerFrame) transition.updateFrame(view: self.transitionMaskView, frame: CGRect(x: 0.0, y: 0.0, width: transitionContainerFrame.width, height: transitionContainerFrame.height)) let updateMaskLayers = { + var topPanelFrame = topPanelFrame + if self.animatingContextMenu { + topPanelFrame.origin.y = 0.0 + } transition.updateFrame(layer: self.transitionMaskTopFillLayer, frame: CGRect(x: 0.0, y: 0.0, width: transitionContainerFrame.width, height: topPanelFrame.maxY)) transition.updateFrame(layer: self.transitionMaskFillLayer, frame: CGRect(x: 0.0, y: topPanelFrame.maxY, width: transitionContainerFrame.width, height: bottomGradientFrame.minY - topPanelFrame.maxY)) transition.updateFrame(layer: self.transitionMaskGradientLayer, frame: CGRect(x: 0.0, y: bottomGradientFrame.minY, width: transitionContainerFrame.width, height: bottomGradientFrame.height)) @@ -3451,44 +3593,57 @@ public final class VoiceChatController: ViewController { } var bottomInset: CGFloat = 0.0 - if case let .fullscreen(controlsHidden) = self.displayMode { + if case .compact = layout.metrics.widthClass, case let .fullscreen(controlsHidden) = self.displayMode { if !controlsHidden { bottomInset = 80.0 } } transition.updateAlpha(node: self.bottomGradientNode, alpha: self.isLandscape ? 0.0 : 1.0) - let videoTopEdgeY = isLandscape ? 0.0 : layoutTopInset - let videoBottomEdgeY = self.isLandscape ? layout.size.height : layout.size.height - layout.intrinsicInsets.bottom - 84.0 - let videoFrame = CGRect(x: 0.0, y: videoTopEdgeY, width: isLandscape ? layout.size.width - layout.safeInsets.right - 84.0 : layout.size.width, height: videoBottomEdgeY - videoTopEdgeY) - transition.updateFrame(node: self.mainStageContainerNode, frame: CGRect(origin: CGPoint(), size: layout.size)) + var isTablet = false + let videoFrame: CGRect + let videoContainerFrame: CGRect + if case .regular = layout.metrics.widthClass { + isTablet = true + let videoTopEdgeY = topPanelFrame.maxY + let videoBottomEdgeY = layout.size.height - layout.intrinsicInsets.bottom + videoFrame = CGRect(x: sideInset, y: 0.0, width: contentLeftInset - sideInset, height: videoBottomEdgeY - videoTopEdgeY) + videoContainerFrame = CGRect(origin: CGPoint(x: 0.0, y: videoTopEdgeY), size: CGSize(width: contentLeftInset, height: layout.size.height)) + } else { + let videoTopEdgeY = isLandscape ? 0.0 : layoutTopInset + let videoBottomEdgeY = self.isLandscape ? layout.size.height : layout.size.height - layout.intrinsicInsets.bottom - 84.0 + videoFrame = CGRect(x: 0.0, y: videoTopEdgeY, width: isLandscape ? max(0.0, layout.size.width - layout.safeInsets.right - 84.0) : layout.size.width, height: videoBottomEdgeY - videoTopEdgeY) + videoContainerFrame = CGRect(origin: CGPoint(), size: layout.size) + } + transition.updateFrame(node: self.mainStageContainerNode, frame: videoContainerFrame) transition.updateFrame(node: self.mainStageBackgroundNode, frame: videoFrame) if !self.mainStageNode.animating { transition.updateFrame(node: self.mainStageNode, frame: videoFrame) } - self.mainStageNode.update(size: videoFrame.size, sideInset: layout.safeInsets.left, bottomInset: bottomInset, isLandscape: self.isLandscape, transition: transition) + self.mainStageNode.update(size: videoFrame.size, sideInset: layout.safeInsets.left, bottomInset: bottomInset, isLandscape: self.isLandscape, isTablet: isTablet, transition: transition) let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: topPanelFrame.maxY), size: CGSize(width: size.width, height: layout.size.height)) let leftBorderFrame: CGRect let rightBorderFrame: CGRect let additionalInset: CGFloat = 60.0 + let additionalSideInset = (size.width - contentWidth) / 2.0 if isLandscape { leftBorderFrame = CGRect(origin: CGPoint(x: 0.0, y: topPanelFrame.maxY - additionalInset), size: CGSize(width: (size.width - contentWidth) / 2.0 + sideInset, height: layout.size.height)) rightBorderFrame = CGRect(origin: CGPoint(x: size.width - (size.width - contentWidth) / 2.0 - sideInset, y: topPanelFrame.maxY - additionalInset), size: CGSize(width: layout.safeInsets.right + (size.width - contentWidth) / 2.0 + sideInset, height: layout.size.height)) } else { - leftBorderFrame = CGRect(origin: CGPoint(x: -additionalInset, y: topPanelFrame.maxY - additionalInset), size: CGSize(width: sideInset + additionalInset, height: layout.size.height)) - rightBorderFrame = CGRect(origin: CGPoint(x: size.width - sideInset, y: topPanelFrame.maxY - additionalInset), size: CGSize(width: sideInset + additionalInset, height: layout.size.height)) + leftBorderFrame = CGRect(origin: CGPoint(x: -additionalInset, y: topPanelFrame.maxY - additionalInset * 0.6), size: CGSize(width: sideInset + additionalInset + (contentLeftInset.isZero ? additionalSideInset : contentLeftInset), height: layout.size.height)) + rightBorderFrame = CGRect(origin: CGPoint(x: size.width - sideInset - (contentLeftInset.isZero ? additionalSideInset : 0.0), y: topPanelFrame.maxY - additionalInset * 0.6), size: CGSize(width: sideInset + additionalInset + additionalSideInset, height: layout.size.height)) } - let topCornersFrame = CGRect(x: sideInset + floorToScreenPixels((size.width - contentWidth) / 2.0), y: topPanelFrame.maxY - 60.0, width: contentWidth - sideInset * 2.0, height: 50.0 + 60.0) + let topCornersFrame = CGRect(x: sideInset + (contentLeftInset.isZero ? floorToScreenPixels((size.width - contentWidth) / 2.0) : contentLeftInset), y: topPanelFrame.maxY - 60.0, width: contentWidth - sideInset * 2.0, height: 50.0 + 60.0) let previousTopPanelFrame = self.topPanelNode.frame let previousBackgroundFrame = self.backgroundNode.frame let previousLeftBorderFrame = self.leftBorderNode.frame let previousRightBorderFrame = self.rightBorderNode.frame - if !topPanelFrame.equalTo(previousTopPanelFrame) { + if !topPanelFrame.equalTo(previousTopPanelFrame) || forceUpdate { self.topPanelNode.frame = topPanelFrame let positionDelta = CGPoint(x: 0.0, y: topPanelFrame.minY - previousTopPanelFrame.minY) transition.animateOffsetAdditive(layer: self.topPanelNode.layer, offset: positionDelta.y, completion: completion) @@ -3500,11 +3655,11 @@ public final class VoiceChatController: ViewController { transition.animatePositionAdditive(node: self.backgroundNode, offset: backgroundPositionDelta) self.leftBorderNode.frame = leftBorderFrame - let leftBorderPositionDelta = CGPoint(x: 0.0, y: previousLeftBorderFrame.minY - leftBorderFrame.minY) + let leftBorderPositionDelta = CGPoint(x: previousLeftBorderFrame.maxX - leftBorderFrame.maxX, y: previousLeftBorderFrame.minY - leftBorderFrame.minY) transition.animatePositionAdditive(node: self.leftBorderNode, offset: leftBorderPositionDelta) self.rightBorderNode.frame = rightBorderFrame - let rightBorderPositionDelta = CGPoint(x: 0.0, y: previousRightBorderFrame.minY - rightBorderFrame.minY) + let rightBorderPositionDelta = CGPoint(x: previousRightBorderFrame.minX - rightBorderFrame.minX, y: previousRightBorderFrame.minY - rightBorderFrame.minY) transition.animatePositionAdditive(node: self.rightBorderNode, offset: rightBorderPositionDelta) } else { completion?() @@ -3528,6 +3683,7 @@ public final class VoiceChatController: ViewController { } private var decorationsAreDark: Bool? + private var ignoreLayout = false private func updateDecorationsColors() { guard let (layout, _) = self.validLayout else { return @@ -3536,13 +3692,11 @@ public final class VoiceChatController: ViewController { let isFullscreen = self.isFullscreen let effectiveDisplayMode = self.displayMode + self.ignoreLayout = true self.controller?.statusBar.updateStatusBarStyle(isFullscreen ? .White : .Ignore, animated: true) - - var size = layout.size - if case .regular = layout.metrics.widthClass { - size.width = floor(min(size.width, size.height) * 0.5) - } + self.ignoreLayout = false + let size = layout.size let topEdgeFrame: CGRect if isFullscreen { let offset: CGFloat @@ -3628,6 +3782,7 @@ public final class VoiceChatController: ViewController { self.closeButton.setContent(.image(closeButtonImage(dark: isFullscreen)), animated: transition.isAnimated) self.optionsButton.setContent(.more(optionsCircleImage(dark: isFullscreen)), animated: transition.isAnimated) + self.panelButton.setContent(.image(panelButtonImage(dark: isFullscreen)), animated: transition.isAnimated) } self.updateTitle(transition: transition) @@ -3651,21 +3806,27 @@ public final class VoiceChatController: ViewController { } } - var subtitle = self.currentSubtitle + var subtitle = self.currentSpeakingSubtitle ?? self.currentSubtitle + var speaking = self.currentSpeakingSubtitle != nil if self.isScheduling { subtitle = "" + speaking = false } else if self.callState?.scheduleTimestamp != nil { if self.callState?.canManageCall ?? false { subtitle = self.presentationData.strings.VoiceChat_TapToEditTitle } else { subtitle = self.presentationData.strings.VoiceChat_Scheduled } + speaking = false } - self.titleNode.update(size: CGSize(width: self.titleNode.bounds.width, height: 44.0), title: title, subtitle: subtitle, slide: slide, transition: transition) + self.titleNode.update(size: CGSize(width: self.titleNode.bounds.width, height: 44.0), title: title, subtitle: subtitle, speaking: speaking, slide: slide, transition: transition) } private func updateButtons(transition: ContainedViewLayoutTransition) { + guard let (layout, _) = self.validLayout else { + return + } var audioMode: CallControllerButtonsSpeakerMode = .none //var hasAudioRouteMenu: Bool = false if let (availableOutputs, maybeCurrentOutput) = self.audioOutputState, let currentOutput = maybeCurrentOutput { @@ -3680,7 +3841,9 @@ public final class VoiceChatController: ViewController { case let .port(port): var type: CallControllerButtonsSpeakerMode.BluetoothType = .generic let portName = port.name.lowercased() - if portName.contains("airpods pro") { + if portName.contains("airpods max") { + type = .airpodsMax + } else if portName.contains("airpods pro") { type = .airpodsPro } else if portName.contains("airpods") { type = .airpods @@ -3725,6 +3888,8 @@ public final class VoiceChatController: ViewController { soundImage = .airpods case .airpodsPro: soundImage = .airpodsPro + case .airpodsMax: + soundImage = .airpodsMax } soundTitle = self.presentationData.strings.Call_Audio } @@ -3744,13 +3909,7 @@ public final class VoiceChatController: ViewController { let audioButtonSize: CGSize var buttonsTitleAlpha: CGFloat - var effectiveDisplayMode = self.displayMode - if let (layout, _) = self.validLayout, layout.size.width > layout.size.height, case .compact = layout.metrics.widthClass { - if case .fullscreen = effectiveDisplayMode { - } else { - effectiveDisplayMode = .fullscreen(controlsHidden: false) - } - } + let effectiveDisplayMode = self.displayMode let hasCameraButton = self.cameraButton.isUserInteractionEnabled let hasVideo = self.call.hasVideo @@ -3759,8 +3918,16 @@ public final class VoiceChatController: ViewController { audioButtonSize = hasCameraButton ? smallButtonSize : sideButtonSize buttonsTitleAlpha = 1.0 case .fullscreen: - audioButtonSize = sideButtonSize - buttonsTitleAlpha = 0.0 + if case .regular = layout.metrics.widthClass { + audioButtonSize = hasCameraButton ? smallButtonSize : sideButtonSize + } else { + audioButtonSize = sideButtonSize + } + if case .regular = layout.metrics.widthClass { + buttonsTitleAlpha = 1.0 + } else { + buttonsTitleAlpha = 0.0 + } } self.cameraButton.update(size: sideButtonSize, content: CallControllerButtonItemNode.Content(appearance: hasVideo ? activeButtonAppearance : normalButtonAppearance, image: hasVideo ? .cameraOn : .cameraOff), text: self.presentationData.strings.VoiceChat_Video, transition: transition) @@ -3772,8 +3939,9 @@ public final class VoiceChatController: ViewController { transition.updateTransformScale(node: self.cameraButton, scale: hasCameraButton ? 1.0 : 0.0) - transition.updateAlpha(node: self.audioButton, alpha: hasCameraButton ? 0.0 : 1.0) - transition.updateTransformScale(node: self.audioButton, scale: hasCameraButton ? 0.0 : 1.0) + let hasAudioButton = !self.isScheduling + transition.updateAlpha(node: self.audioButton, alpha: hasCameraButton || !hasAudioButton ? 0.0 : 1.0) + transition.updateTransformScale(node: self.audioButton, scale: hasCameraButton || !hasAudioButton ? 0.0 : 1.0) self.audioButton.update(size: audioButtonSize, content: CallControllerButtonItemNode.Content(appearance: soundAppearance, image: soundImage, isEnabled: isSoundEnabled), text: soundTitle, transition: transition) self.audioButton.isUserInteractionEnabled = isSoundEnabled @@ -3787,43 +3955,63 @@ public final class VoiceChatController: ViewController { } func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { + guard !self.ignoreLayout else { + return + } let isFirstTime = self.validLayout == nil let previousLayout = self.validLayout?.0 self.validLayout = (layout, navigationHeight) - var size = layout.size + let size = layout.size let contentWidth: CGFloat + let headerWidth: CGFloat + let contentLeftInset: CGFloat if case .regular = layout.metrics.widthClass { - size.width = floor(min(size.width, size.height) * 0.5) - contentWidth = size.width + contentWidth = max(320.0, min(375.0, floor(size.width * 0.3))) + headerWidth = size.width + if self.peerIdToEndpointId.isEmpty { + contentLeftInset = 0.0 + } else { + contentLeftInset = self.panelHidden ? layout.size.width : layout.size.width - contentWidth + } } else { contentWidth = self.isLandscape ? min(530.0, size.width - 210.0) : size.width + headerWidth = contentWidth + contentLeftInset = 0.0 } - + var previousIsLandscape = false if let previousLayout = previousLayout, case .compact = previousLayout.metrics.widthClass, previousLayout.size.width > previousLayout.size.height { previousIsLandscape = true } - - let isLandscape = self.isLandscape - - - if previousIsLandscape != isLandscape { - if case .modal = self.displayMode { - self.displayMode = .modal(isExpanded: true, isFilled: true) + var shouldSwitchToExpanded = false + if case let .modal(isExpanded, _) = self.displayMode { + if previousIsLandscape != self.isLandscape && !isExpanded { + shouldSwitchToExpanded = true + } else if case .regular = layout.metrics.widthClass, !isExpanded { + shouldSwitchToExpanded = true } + } + if shouldSwitchToExpanded { + self.displayMode = .modal(isExpanded: true, isFilled: true) self.updateDecorationsColors() self.updateDecorationsLayout(transition: transition) self.updateMembers() + } else if case .fullscreen = self.displayMode, previousIsLandscape != self.isLandscape { + self.updateMembers() } let effectiveDisplayMode = self.displayMode - transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - contentWidth) / 2.0), y: 10.0), size: CGSize(width: contentWidth, height: 44.0))) + transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - headerWidth) / 2.0), y: 10.0), size: CGSize(width: headerWidth, height: 44.0))) self.updateTitle(transition: transition) - transition.updateFrame(node: self.optionsButton, frame: CGRect(origin: CGPoint(x: 20.0 + floorToScreenPixels((size.width - contentWidth) / 2.0), y: 18.0), size: CGSize(width: 28.0, height: 28.0))) - transition.updateFrame(node: self.closeButton, frame: CGRect(origin: CGPoint(x: size.width - floorToScreenPixels((size.width - contentWidth) / 2.0) - 20.0 - 28.0, y: 18.0), size: CGSize(width: 28.0, height: 28.0))) + transition.updateFrame(node: self.optionsButton, frame: CGRect(origin: CGPoint(x: 20.0 + floorToScreenPixels((size.width - headerWidth) / 2.0), y: 18.0), size: CGSize(width: 28.0, height: 28.0))) + transition.updateFrame(node: self.panelButton, frame: CGRect(origin: CGPoint(x: size.width - floorToScreenPixels((size.width - headerWidth) / 2.0) - 20.0 - 28.0 - 38.0 - 24.0, y: 18.0), size: CGSize(width: 38.0, height: 28.0))) + transition.updateFrame(node: self.closeButton, frame: CGRect(origin: CGPoint(x: size.width - floorToScreenPixels((size.width - headerWidth) / 2.0) - 20.0 - 28.0, y: 18.0), size: CGSize(width: 28.0, height: 28.0))) + + transition.updateAlpha(node: self.optionsButton, alpha: self.optionsButton.isUserInteractionEnabled ? 1.0 : 0.0) + transition.updateAlpha(node: self.panelButton, alpha: self.panelButton.isUserInteractionEnabled ? 1.0 : 0.0) transition.updateFrame(node: self.dimNode, frame: CGRect(origin: CGPoint(), size: layout.size)) transition.updateFrame(node: self.contentContainer, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - size.width) / 2.0), y: 0.0), size: size)) @@ -3832,8 +4020,8 @@ public final class VoiceChatController: ViewController { let sideInset: CGFloat = 14.0 var listInsets = UIEdgeInsets() - listInsets.left = sideInset + (isLandscape ? 0.0 : layout.safeInsets.left) - listInsets.right = sideInset + (isLandscape ? 0.0 : layout.safeInsets.right) + listInsets.left = sideInset + (self.isLandscape ? 0.0 : layout.safeInsets.left) + listInsets.right = sideInset + (self.isLandscape ? 0.0 : layout.safeInsets.right) let topEdgeOffset: CGFloat if let statusBarHeight = layout.statusBarHeight { @@ -3842,7 +4030,7 @@ public final class VoiceChatController: ViewController { topEdgeOffset = 44.0 } - if isLandscape { + if self.isLandscape { transition.updateFrame(node: self.topPanelEdgeNode, frame: CGRect(x: 0.0, y: -topEdgeOffset, width: size.width, height: topPanelHeight + topEdgeOffset)) } else if let _ = self.panGestureArguments { } else { @@ -3857,11 +4045,11 @@ public final class VoiceChatController: ViewController { let bottomPanelHeight = self.effectiveBottomAreaHeight + layout.intrinsicInsets.bottom var listTopInset = layoutTopInset + topPanelHeight - if isLandscape { + if self.isLandscape { listTopInset = topPanelHeight } - let listSize = CGSize(width: contentWidth, height: layout.size.height - listTopInset - (isLandscape ? layout.intrinsicInsets.bottom : bottomPanelHeight) + bottomGradientHeight) + let listSize = CGSize(width: contentWidth, height: layout.size.height - listTopInset - (self.isLandscape ? layout.intrinsicInsets.bottom : bottomPanelHeight) + bottomGradientHeight) let topInset: CGFloat if let (panInitialTopInset, panOffset) = self.panGestureArguments { if self.isExpanded { @@ -3876,7 +4064,15 @@ public final class VoiceChatController: ViewController { } transition.updateFrameAsPositionAndBounds(node: self.listContainer, frame: CGRect(origin: CGPoint(), size: size)) - transition.updateFrame(node: self.listNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - contentWidth) / 2.0), y: listTopInset + topInset), size: listSize)) + transition.updateFrame(node: self.listNode, frame: CGRect(origin: CGPoint(x: contentLeftInset.isZero ? floorToScreenPixels((size.width - contentWidth) / 2.0) : contentLeftInset, y: listTopInset + topInset), size: listSize)) + + let tileGridSize = CGSize(width: max(0.0, contentLeftInset - sideInset), height: size.height - layout.intrinsicInsets.bottom - listTopInset - topInset) + if !self.tileGridNode.isHidden { + let _ = self.tileGridNode.update(size: tileGridSize, layoutMode: .grid, items: self.currentTileItems, transition: transition) + } + transition.updateFrame(node: self.tileGridNode, frame: CGRect(origin: CGPoint(x: sideInset, y: listTopInset + topInset), size: tileGridSize)) + self.tileGridNode.isHidden = contentLeftInset.isZero + self.tileGridNode.updateAbsoluteRect(CGRect(origin: CGPoint(), size: tileGridSize), within: tileGridSize) listInsets.bottom = bottomGradientHeight @@ -3885,26 +4081,17 @@ public final class VoiceChatController: ViewController { let fullscreenListWidth: CGFloat let fullscreenListHeight: CGFloat = 84.0 - let fullscreenListPosition: CGPoint let fullscreenListTransform: CATransform3D let fullscreenListInset: CGFloat = 14.0 let fullscreenListUpdateSizeAndInsets: ListViewUpdateSizeAndInsets let fullscreenListContainerFrame: CGRect - if isLandscape { + if self.isLandscape { fullscreenListWidth = layout.size.height - fullscreenListPosition = CGPoint( - x: layout.size.width - min(self.effectiveBottomAreaHeight, fullscreenBottomAreaHeight) - layout.safeInsets.right - fullscreenListHeight / 2.0, - y: layout.size.height / 2.0 - ) fullscreenListTransform = CATransform3DIdentity fullscreenListUpdateSizeAndInsets = ListViewUpdateSizeAndInsets(size: CGSize(width: fullscreenListHeight, height: layout.size.height), insets: UIEdgeInsets(top: fullscreenListInset, left: 0.0, bottom: fullscreenListInset, right: 0.0), duration: duration, curve: curve) fullscreenListContainerFrame = CGRect(x: layout.size.width - min(self.effectiveBottomAreaHeight, fullscreenBottomAreaHeight) - layout.safeInsets.right - fullscreenListHeight, y: 0.0, width: fullscreenListHeight, height: layout.size.height) } else { fullscreenListWidth = layout.size.width - fullscreenListPosition = CGPoint( - x: layout.size.width / 2.0, - y: layout.size.height - min(bottomPanelHeight, fullscreenBottomAreaHeight + layout.intrinsicInsets.bottom) - fullscreenListHeight / 2.0 + 4.0 - ) fullscreenListTransform = CATransform3DMakeRotation(-CGFloat(CGFloat.pi / 2.0), 0.0, 0.0, 1.0) fullscreenListUpdateSizeAndInsets = ListViewUpdateSizeAndInsets(size: CGSize(width: fullscreenListHeight, height: layout.size.width), insets: UIEdgeInsets(top: fullscreenListInset + layout.safeInsets.left, left: 0.0, bottom: fullscreenListInset + layout.safeInsets.left, right: 0.0), duration: duration, curve: curve) fullscreenListContainerFrame = CGRect(x: 0.0, y: layout.size.height - min(bottomPanelHeight, fullscreenBottomAreaHeight + layout.intrinsicInsets.bottom) - fullscreenListHeight + 4.0, width: layout.size.width, height: fullscreenListHeight) @@ -3918,22 +4105,44 @@ public final class VoiceChatController: ViewController { self.fullscreenListNode.transform = fullscreenListTransform self.fullscreenListNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: nil, updateSizeAndInsets: fullscreenListUpdateSizeAndInsets, stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in }) + if case .regular = layout.metrics.widthClass { + self.transitionContainerNode.view.mask = nil + } else { + self.transitionContainerNode.view.mask = self.transitionMaskView + } var childrenLayout = layout var childrenInsets = childrenLayout.intrinsicInsets - if !isLandscape, case .fullscreen = effectiveDisplayMode { + var childrenSafeInsets = childrenLayout.safeInsets + if case .regular = layout.metrics.widthClass { + let childrenLayoutWidth: CGFloat = 375.0 + if contentLeftInset.isZero { + childrenSafeInsets.left = floorToScreenPixels((size.width - childrenLayoutWidth) / 2.0) + childrenSafeInsets.right = floorToScreenPixels((size.width - childrenLayoutWidth) / 2.0) + } else { + childrenSafeInsets.left = floorToScreenPixels((contentLeftInset - childrenLayoutWidth) / 2.0) + childrenSafeInsets.right = childrenSafeInsets.left + (size.width - contentLeftInset) + } + } else if !self.isLandscape, case .fullscreen = effectiveDisplayMode { childrenInsets.bottom += self.effectiveBottomAreaHeight + fullscreenListHeight + 30.0 } + childrenLayout.safeInsets = childrenSafeInsets childrenLayout.intrinsicInsets = childrenInsets self.controller?.presentationContext.containerLayoutUpdated(childrenLayout, transition: transition) - - var bottomPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - bottomPanelHeight), size: CGSize(width: size.width, height: bottomPanelHeight)) + + var bottomPanelLeftInset = contentLeftInset + var bottomPanelWidth = size.width - contentLeftInset + if case .regular = layout.metrics.widthClass, bottomPanelLeftInset.isZero { + bottomPanelLeftInset = floorToScreenPixels((layout.size.width - contentWidth) / 2.0) + bottomPanelWidth = contentWidth + } + + var bottomPanelFrame = CGRect(origin: CGPoint(x: bottomPanelLeftInset, y: layout.size.height - bottomPanelHeight), size: CGSize(width: bottomPanelWidth, height: bottomPanelHeight)) let bottomPanelCoverHeight = bottomAreaHeight + layout.intrinsicInsets.bottom - if isLandscape { + if self.isLandscape { bottomPanelFrame = CGRect(origin: CGPoint(x: layout.size.width - fullscreenBottomAreaHeight - layout.safeInsets.right, y: 0.0), size: CGSize(width: fullscreenBottomAreaHeight + layout.safeInsets.right, height: layout.size.height)) } - let bottomGradientFrame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - bottomPanelCoverHeight), size: CGSize(width: size.width, height: bottomGradientHeight)) - transition.updateAlpha(node: self.optionsButton, alpha: self.optionsButton.isUserInteractionEnabled ? 1.0 : 0.0) + let bottomGradientFrame = CGRect(origin: CGPoint(x: bottomPanelLeftInset, y: layout.size.height - bottomPanelCoverHeight), size: CGSize(width: bottomPanelWidth, height: bottomGradientHeight)) transition.updateFrame(node: self.bottomGradientNode, frame: bottomGradientFrame) transition.updateFrame(node: self.bottomPanelNode, frame: bottomPanelFrame) @@ -3948,25 +4157,24 @@ public final class VoiceChatController: ViewController { let scheduleTextSize = self.scheduleTextNode.updateLayout(CGSize(width: size.width - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude)) self.scheduleTextNode.frame = CGRect(origin: CGPoint(x: floor((size.width - scheduleTextSize.width) / 2.0), y: layout.size.height - layout.intrinsicInsets.bottom - scheduleTextSize.height - 145.0), size: scheduleTextSize) - let centralButtonSide = min(size.width, size.height) - 32.0 + let centralButtonSide = min(contentWidth, size.height) - 32.0 let centralButtonSize = CGSize(width: centralButtonSide, height: centralButtonSide) let cameraButtonSize = smallButtonSize let sideButtonMinimalInset: CGFloat = 16.0 - let sideButtonOffset = min(42.0, floor((((size.width - 112.0) / 2.0) - sideButtonSize.width) / 2.0)) - let sideButtonOrigin = max(sideButtonMinimalInset, floor((size.width - 112.0) / 2.0) - sideButtonOffset - sideButtonSize.width) + let sideButtonOffset = min(42.0, floor((((contentWidth - 112.0) / 2.0) - sideButtonSize.width) / 2.0)) + let sideButtonOrigin = max(sideButtonMinimalInset, floor((contentWidth - 112.0) / 2.0) - sideButtonOffset - sideButtonSize.width) let smallButtons: Bool - switch effectiveDisplayMode { - case .modal: - if isLandscape { + if case .regular = layout.metrics.widthClass { + smallButtons = false + } else { + switch effectiveDisplayMode { + case .modal: + smallButtons = self.isLandscape + case .fullscreen: smallButtons = true - } else { - smallButtons = false - } - case .fullscreen: - smallButtons = true } - + } let actionButtonState: VoiceChatActionButton.State let actionButtonTitle: String let actionButtonSubtitle: String @@ -4090,86 +4298,100 @@ public final class VoiceChatController: ViewController { } else { leftButtonFrame = CGRect(origin: CGPoint(x: sideButtonOrigin, y: floor((self.effectiveBottomAreaHeight - sideButtonSize.height - upperButtonDistance - cameraButtonSize.height) / 2.0) + upperButtonDistance + cameraButtonSize.height), size: sideButtonSize) } - let rightButtonFrame = CGRect(origin: CGPoint(x: size.width - sideButtonOrigin - sideButtonSize.width, y: floor((self.effectiveBottomAreaHeight - sideButtonSize.height) / 2.0)), size: sideButtonSize) + let rightButtonFrame = CGRect(origin: CGPoint(x: contentWidth - sideButtonOrigin - sideButtonSize.width, y: floor((self.effectiveBottomAreaHeight - sideButtonSize.height) / 2.0)), size: sideButtonSize) + var centerButtonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - centralButtonSize.width) / 2.0), y: floor((self.effectiveBottomAreaHeight - centralButtonSize.height) / 2.0) - 3.0), size: centralButtonSize) - switch effectiveDisplayMode { - case .modal: - if isLandscape { - let sideInset: CGFloat - let buttonsCount: Int - if hasVideo { - sideInset = 26.0 - buttonsCount = 4 + if case .regular = layout.metrics.widthClass { + centerButtonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((contentWidth - centralButtonSize.width) / 2.0), y: floor((self.effectiveBottomAreaHeight - centralButtonSize.height) / 2.0) - 3.0), size: centralButtonSize) + + if hasCameraButton { + firstButtonFrame = CGRect(origin: CGPoint(x: floor(leftButtonFrame.midX - cameraButtonSize.width / 2.0), y: leftButtonFrame.minY - upperButtonDistance - cameraButtonSize.height), size: cameraButtonSize) + } else { + firstButtonFrame = CGRect(origin: CGPoint(x: leftButtonFrame.center.x - cameraButtonSize.width / 2.0, y: leftButtonFrame.center.y - cameraButtonSize.height / 2.0), size: cameraButtonSize) + } + secondButtonFrame = leftButtonFrame + thirdButtonFrame = centerButtonFrame + forthButtonFrame = rightButtonFrame + } else { + switch effectiveDisplayMode { + case .modal: + if self.isLandscape { + let sideInset: CGFloat + let buttonsCount: Int + if hasVideo { + sideInset = 26.0 + buttonsCount = 4 + } else { + sideInset = 42.0 + buttonsCount = 3 + } + let spacing = floor((layout.size.height - sideInset * 2.0 - sideButtonSize.height * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) + let x = floor((fullscreenBottomAreaHeight - sideButtonSize.width) / 2.0) + forthButtonFrame = CGRect(origin: CGPoint(x: x, y: sideInset), size: sideButtonSize) + let thirdButtonPreFrame = CGRect(origin: CGPoint(x: x, y: sideInset + sideButtonSize.height + spacing), size: sideButtonSize) + thirdButtonFrame = CGRect(origin: CGPoint(x: floor(thirdButtonPreFrame.midX - centralButtonSize.width / 2.0), y: floor(thirdButtonPreFrame.midY - centralButtonSize.height / 2.0)), size: centralButtonSize) + secondButtonFrame = CGRect(origin: CGPoint(x: x, y: thirdButtonPreFrame.maxY + spacing), size: sideButtonSize) + if hasCameraButton { + firstButtonFrame = CGRect(origin: CGPoint(x: x, y: layout.size.height - sideInset - sideButtonSize.height), size: sideButtonSize) + } else { + firstButtonFrame = secondButtonFrame + } } else { - sideInset = 42.0 - buttonsCount = 3 + if hasCameraButton { + firstButtonFrame = CGRect(origin: CGPoint(x: floor(leftButtonFrame.midX - cameraButtonSize.width / 2.0), y: leftButtonFrame.minY - upperButtonDistance - cameraButtonSize.height), size: cameraButtonSize) + } else { + firstButtonFrame = CGRect(origin: CGPoint(x: leftButtonFrame.center.x - cameraButtonSize.width / 2.0, y: leftButtonFrame.center.y - cameraButtonSize.height / 2.0), size: cameraButtonSize) + } + secondButtonFrame = leftButtonFrame + thirdButtonFrame = centerButtonFrame + forthButtonFrame = rightButtonFrame } - let spacing = floor((layout.size.height - sideInset * 2.0 - sideButtonSize.height * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) - let x = floor((fullscreenBottomAreaHeight - sideButtonSize.width) / 2.0) - forthButtonFrame = CGRect(origin: CGPoint(x: x, y: sideInset), size: sideButtonSize) - let thirdButtonPreFrame = CGRect(origin: CGPoint(x: x, y: sideInset + sideButtonSize.height + spacing), size: sideButtonSize) - thirdButtonFrame = CGRect(origin: CGPoint(x: floor(thirdButtonPreFrame.midX - centralButtonSize.width / 2.0), y: floor(thirdButtonPreFrame.midY - centralButtonSize.height / 2.0)), size: centralButtonSize) - secondButtonFrame = CGRect(origin: CGPoint(x: x, y: thirdButtonPreFrame.maxY + spacing), size: sideButtonSize) - if hasCameraButton { - firstButtonFrame = CGRect(origin: CGPoint(x: x, y: layout.size.height - sideInset - sideButtonSize.height), size: sideButtonSize) + case let .fullscreen(controlsHidden): + if self.isLandscape { + let sideInset: CGFloat + let buttonsCount: Int + if hasVideo { + sideInset = 26.0 + buttonsCount = 4 + } else { + sideInset = 42.0 + buttonsCount = 3 + } + let spacing = floor((layout.size.height - sideInset * 2.0 - sideButtonSize.height * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) + let x = controlsHidden ? fullscreenBottomAreaHeight + layout.safeInsets.right + 30.0 : floor((fullscreenBottomAreaHeight - sideButtonSize.width) / 2.0) + forthButtonFrame = CGRect(origin: CGPoint(x: x, y: sideInset), size: sideButtonSize) + let thirdButtonPreFrame = CGRect(origin: CGPoint(x: x, y: sideInset + sideButtonSize.height + spacing), size: sideButtonSize) + thirdButtonFrame = CGRect(origin: CGPoint(x: floor(thirdButtonPreFrame.midX - centralButtonSize.width / 2.0), y: floor(thirdButtonPreFrame.midY - centralButtonSize.height / 2.0)), size: centralButtonSize) + secondButtonFrame = CGRect(origin: CGPoint(x: x, y: thirdButtonPreFrame.maxY + spacing), size: sideButtonSize) + if hasVideo { + firstButtonFrame = CGRect(origin: CGPoint(x: x, y: layout.size.height - sideInset - sideButtonSize.height), size: sideButtonSize) + } else { + firstButtonFrame = secondButtonFrame + } } else { - firstButtonFrame = secondButtonFrame + let sideInset: CGFloat + let buttonsCount: Int + if hasVideo { + sideInset = 26.0 + buttonsCount = 4 + } else { + sideInset = 42.0 + buttonsCount = 3 + } + let spacing = floor((layout.size.width - sideInset * 2.0 - sideButtonSize.width * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) + let y = controlsHidden ? self.effectiveBottomAreaHeight + layout.intrinsicInsets.bottom + 30.0: floor((self.effectiveBottomAreaHeight - sideButtonSize.height) / 2.0) + if hasVideo { + firstButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: y), size: sideButtonSize) + secondButtonFrame = CGRect(origin: CGPoint(x: firstButtonFrame.maxX + spacing, y: y), size: sideButtonSize) + } else { + firstButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: y), size: sideButtonSize) + secondButtonFrame = firstButtonFrame + } + let thirdButtonPreFrame = CGRect(origin: CGPoint(x: secondButtonFrame.maxX + spacing, y: y), size: sideButtonSize) + thirdButtonFrame = CGRect(origin: CGPoint(x: floor(thirdButtonPreFrame.midX - centralButtonSize.width / 2.0), y: floor(thirdButtonPreFrame.midY - centralButtonSize.height / 2.0)), size: centralButtonSize) + forthButtonFrame = CGRect(origin: CGPoint(x: thirdButtonPreFrame.maxX + spacing, y: y), size: sideButtonSize) } - } else { - if hasCameraButton { - firstButtonFrame = CGRect(origin: CGPoint(x: floor(leftButtonFrame.midX - cameraButtonSize.width / 2.0), y: leftButtonFrame.minY - upperButtonDistance - cameraButtonSize.height), size: cameraButtonSize) - } else { - firstButtonFrame = CGRect(origin: CGPoint(x: leftButtonFrame.center.x - cameraButtonSize.width / 2.0, y: leftButtonFrame.center.y - cameraButtonSize.height / 2.0), size: cameraButtonSize) - } - secondButtonFrame = leftButtonFrame - thirdButtonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - centralButtonSize.width) / 2.0), y: floor((self.effectiveBottomAreaHeight - centralButtonSize.height) / 2.0) - 3.0), size: centralButtonSize) - forthButtonFrame = rightButtonFrame - } - case let .fullscreen(controlsHidden): - if isLandscape { - let sideInset: CGFloat - let buttonsCount: Int - if hasVideo { - sideInset = 26.0 - buttonsCount = 4 - } else { - sideInset = 42.0 - buttonsCount = 3 - } - let spacing = floor((layout.size.height - sideInset * 2.0 - sideButtonSize.height * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) - let x = controlsHidden ? fullscreenBottomAreaHeight + layout.safeInsets.right + 30.0 : floor((fullscreenBottomAreaHeight - sideButtonSize.width) / 2.0) - forthButtonFrame = CGRect(origin: CGPoint(x: x, y: sideInset), size: sideButtonSize) - let thirdButtonPreFrame = CGRect(origin: CGPoint(x: x, y: sideInset + sideButtonSize.height + spacing), size: sideButtonSize) - thirdButtonFrame = CGRect(origin: CGPoint(x: floor(thirdButtonPreFrame.midX - centralButtonSize.width / 2.0), y: floor(thirdButtonPreFrame.midY - centralButtonSize.height / 2.0)), size: centralButtonSize) - secondButtonFrame = CGRect(origin: CGPoint(x: x, y: thirdButtonPreFrame.maxY + spacing), size: sideButtonSize) - if hasVideo { - firstButtonFrame = CGRect(origin: CGPoint(x: x, y: layout.size.height - sideInset - sideButtonSize.height), size: sideButtonSize) - } else { - firstButtonFrame = secondButtonFrame - } - } else { - let sideInset: CGFloat - let buttonsCount: Int - if hasVideo { - sideInset = 26.0 - buttonsCount = 4 - } else { - sideInset = 42.0 - buttonsCount = 3 - } - let spacing = floor((layout.size.width - sideInset * 2.0 - sideButtonSize.width * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) - let y = controlsHidden ? self.effectiveBottomAreaHeight + layout.intrinsicInsets.bottom + 30.0: floor((self.effectiveBottomAreaHeight - sideButtonSize.height) / 2.0) - if hasVideo { - firstButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: y), size: sideButtonSize) - secondButtonFrame = CGRect(origin: CGPoint(x: firstButtonFrame.maxX + spacing, y: y), size: sideButtonSize) - } else { - firstButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: y), size: sideButtonSize) - secondButtonFrame = firstButtonFrame - } - let thirdButtonPreFrame = CGRect(origin: CGPoint(x: secondButtonFrame.maxX + spacing, y: y), size: sideButtonSize) - thirdButtonFrame = CGRect(origin: CGPoint(x: floor(thirdButtonPreFrame.midX - centralButtonSize.width / 2.0), y: floor(thirdButtonPreFrame.midY - centralButtonSize.height / 2.0)), size: centralButtonSize) - forthButtonFrame = CGRect(origin: CGPoint(x: thirdButtonPreFrame.maxX + spacing, y: y), size: sideButtonSize) - } + } } let buttonHeight = self.scheduleCancelButton.updateLayout(width: size.width - 32.0, transition: .immediate) @@ -4215,11 +4437,38 @@ public final class VoiceChatController: ViewController { } } + private var appIsActive = true { + didSet { + self.updateVisibility() + } + } + private var visibility = false { + didSet { + self.updateVisibility() + } + } + + private func updateVisibility() { + let visible = self.appIsActive && self.visibility + if self.tileGridNode.isHidden { + self.tileGridNode.visiblity = false + } else { + self.tileGridNode.visiblity = isVisible + } + self.listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? VoiceChatTilesGridItemNode { + itemNode.gridVisiblity = visible + } + } + } + func animateIn() { guard let (layout, navigationHeight) = self.validLayout else { return } + self.visibility = true + self.updateDecorationsLayout(transition: .immediate) self.animatingAppearance = true @@ -4270,6 +4519,8 @@ public final class VoiceChatController: ViewController { var bounds = strongSelf.contentContainer.bounds bounds.origin.y = 0.0 strongSelf.contentContainer.bounds = bounds + + strongSelf.visibility = false } completion?() } @@ -4367,6 +4618,7 @@ public final class VoiceChatController: ViewController { strongSelf.didSetContentsReady = true strongSelf.controller?.contentsReady.set(true) } + strongSelf.updateVisibility() }) } @@ -4414,11 +4666,21 @@ public final class VoiceChatController: ViewController { var peerIdToEndpointId: [PeerId: String] = [:] var requestedVideoChannels: [PresentationGroupCallRequestedVideo] = [] + var gridTileItems: [VoiceChatTileItem] = [] var tileItems: [VoiceChatTileItem] = [] + var gridTileByVideoEndpoint: [String: VoiceChatTileItem] = [:] var tileByVideoEndpoint: [String: VoiceChatTileItem] = [:] var entryByPeerId: [PeerId: VoiceChatPeerEntry] = [:] var latestWideVideo: String? = nil + var isTablet = false + var displayPanelVideos = false + if let (layout, _) = self.validLayout, case .regular = layout.metrics.widthClass { + isTablet = true + displayPanelVideos = self.displayPanelVideos + } + + var myEntry: VoiceChatPeerEntry? var mainEntry: VoiceChatPeerEntry? for member in callMembers.0 { if processedPeerIds.contains(member.peer.id) { @@ -4483,7 +4745,10 @@ public final class VoiceChatController: ViewController { about: member.about, isMyPeer: self.callState?.myPeerId == member.peer.id, videoEndpointId: member.videoEndpointId, + videoPaused: member.videoDescription?.isPaused ?? false, presentationEndpointId: member.presentationEndpointId, + presentationPaused: member.presentationDescription?.isPaused ?? false, + effectiveSpeakerVideoEndpointId: self.effectiveSpeaker?.1, state: memberState, muteState: memberMuteState, canManageCall: self.callState?.canManageCall ?? false, @@ -4493,6 +4758,9 @@ public final class VoiceChatController: ViewController { active: memberPeer.id == self.effectiveSpeaker?.0, isLandscape: self.isLandscape ) + if peerEntry.isMyPeer { + myEntry = peerEntry + } if peerEntry.active { mainEntry = peerEntry } @@ -4500,7 +4768,7 @@ public final class VoiceChatController: ViewController { var isTile = false if let interaction = self.itemInteraction { - if let videoEndpointId = member.presentationEndpointId, !self.timeoutedEndpointIds.contains(videoEndpointId) { + if let videoEndpointId = member.presentationEndpointId { if !self.videoOrder.contains(videoEndpointId) { if peerEntry.isMyPeer { self.videoOrder.insert(videoEndpointId, at: 0) @@ -4508,7 +4776,13 @@ public final class VoiceChatController: ViewController { self.videoOrder.append(videoEndpointId) } } - if let tileItem = ListEntry.peer(peerEntry, 0).tileItem(context: self.context, presentationData: self.presentationData, interaction: interaction, videoEndpointId: videoEndpointId, videoReady: self.readyVideoEndpointIds.contains(videoEndpointId), showAsPresentation: peerIdToCameraEndpointId[peerEntry.peer.id] != nil) { + if isTablet { + if let tileItem = ListEntry.peer(peerEntry, 0).tileItem(context: self.context, presentationData: self.presentationData, interaction: interaction, isTablet: isTablet, videoEndpointId: videoEndpointId, videoReady: self.readyVideoEndpointIds.contains(videoEndpointId), videoTimeouted: self.timeoutedEndpointIds.contains(videoEndpointId), videoIsPaused: member.presentationDescription?.isPaused ?? false, showAsPresentation: peerIdToCameraEndpointId[peerEntry.peer.id] != nil, secondary: false) { + isTile = true + gridTileByVideoEndpoint[videoEndpointId] = tileItem + } + } + if let tileItem = ListEntry.peer(peerEntry, 0).tileItem(context: self.context, presentationData: self.presentationData, interaction: interaction, isTablet: isTablet, videoEndpointId: videoEndpointId, videoReady: self.readyVideoEndpointIds.contains(videoEndpointId), videoTimeouted: self.timeoutedEndpointIds.contains(videoEndpointId), videoIsPaused: member.presentationDescription?.isPaused ?? false, showAsPresentation: peerIdToCameraEndpointId[peerEntry.peer.id] != nil, secondary: displayPanelVideos) { isTile = true tileByVideoEndpoint[videoEndpointId] = tileItem } @@ -4516,7 +4790,7 @@ public final class VoiceChatController: ViewController { latestWideVideo = videoEndpointId } } - if let videoEndpointId = member.videoEndpointId, !self.timeoutedEndpointIds.contains(videoEndpointId) { + if let videoEndpointId = member.videoEndpointId { if !self.videoOrder.contains(videoEndpointId) { if peerEntry.isMyPeer { self.videoOrder.insert(videoEndpointId, at: 0) @@ -4524,7 +4798,13 @@ public final class VoiceChatController: ViewController { self.videoOrder.append(videoEndpointId) } } - if let tileItem = ListEntry.peer(peerEntry, 0).tileItem(context: self.context, presentationData: self.presentationData, interaction: interaction, videoEndpointId: videoEndpointId, videoReady: self.readyVideoEndpointIds.contains(videoEndpointId), showAsPresentation: false) { + if isTablet { + if let tileItem = ListEntry.peer(peerEntry, 0).tileItem(context: self.context, presentationData: self.presentationData, interaction: interaction, isTablet: isTablet, videoEndpointId: videoEndpointId, videoReady: self.readyVideoEndpointIds.contains(videoEndpointId), videoTimeouted: self.timeoutedEndpointIds.contains(videoEndpointId), videoIsPaused: member.videoDescription?.isPaused ?? false, showAsPresentation: false, secondary: false) { + isTile = true + gridTileByVideoEndpoint[videoEndpointId] = tileItem + } + } + if let tileItem = ListEntry.peer(peerEntry, 0).tileItem(context: self.context, presentationData: self.presentationData, interaction: interaction, isTablet: isTablet, videoEndpointId: videoEndpointId, videoReady: self.readyVideoEndpointIds.contains(videoEndpointId), videoTimeouted: self.timeoutedEndpointIds.contains(videoEndpointId), videoIsPaused: member.videoDescription?.isPaused ?? false, showAsPresentation: false, secondary: displayPanelVideos) { isTile = true tileByVideoEndpoint[videoEndpointId] = tileItem } @@ -4534,7 +4814,7 @@ public final class VoiceChatController: ViewController { } } - if !isTile { + if !isTile || (isTablet) { entries.append(.peer(peerEntry, index)) } @@ -4542,36 +4822,45 @@ public final class VoiceChatController: ViewController { if self.callState?.networkState == .connecting { } else { - if var videoChannel = member.requestedVideoChannel(quality: .medium) { + if var videoChannel = member.requestedVideoChannel(minQuality: .thumbnail, maxQuality: .medium) { if self.effectiveSpeaker?.1 == videoChannel.endpointId { - videoChannel.quality = .full + videoChannel.maxQuality = .full } requestedVideoChannels.append(videoChannel) } - if var presentationChannel = member.requestedPresentationVideoChannel(quality: .medium) { - if self.effectiveSpeaker?.1 == presentationChannel.endpointId { - presentationChannel.quality = .full + if member.peer.id != self.callState?.myPeerId { + if var presentationChannel = member.requestedPresentationVideoChannel(minQuality: .thumbnail, maxQuality: .medium) { + if self.effectiveSpeaker?.1 == presentationChannel.endpointId { + presentationChannel.minQuality = .full + presentationChannel.maxQuality = .full + } + requestedVideoChannels.append(presentationChannel) } - requestedVideoChannels.append(presentationChannel) } } } - var preList: [String] = [] + var temporaryList: [String] = [] for tileVideoEndpoint in self.videoOrder { if let _ = tileByVideoEndpoint[tileVideoEndpoint] { - preList.append(tileVideoEndpoint) + temporaryList.append(tileVideoEndpoint) } } - if (tileByVideoEndpoint.count % 2) != 0, let last = preList.last, !self.wideVideoNodes.contains(last), let latestWide = latestWideVideo { + if (tileByVideoEndpoint.count % 2) != 0, let last = temporaryList.last, !self.wideVideoNodes.contains(last), let latestWide = latestWideVideo { self.videoOrder.removeAll(where: { $0 == latestWide }) self.videoOrder.append(latestWide) } for tileVideoEndpoint in self.videoOrder { + if let tileItem = gridTileByVideoEndpoint[tileVideoEndpoint] { + gridTileItems.append(tileItem) + } if let tileItem = tileByVideoEndpoint[tileVideoEndpoint] { - tileItems.append(tileItem) + if displayPanelVideos && tileItem.peer.id == self.effectiveSpeaker?.0 { + } else { + tileItems.append(tileItem) + } if let fullscreenEntry = entryByPeerId[tileItem.peer.id] { if processedFullscreenPeerIds.contains(tileItem.peer.id) { continue @@ -4605,7 +4894,10 @@ public final class VoiceChatController: ViewController { about: nil, isMyPeer: false, videoEndpointId: nil, + videoPaused: false, presentationEndpointId: nil, + presentationPaused: false, + effectiveSpeakerVideoEndpointId: nil, state: .invited, muteState: nil, canManageCall: false, @@ -4619,6 +4911,13 @@ public final class VoiceChatController: ViewController { } self.requestedVideoChannels = requestedVideoChannels + + var myVideoUpdated = false + if let previousMyEntry = self.myEntry, let myEntry = myEntry, previousMyEntry.effectiveVideoEndpointId == nil && myEntry.effectiveVideoEndpointId != nil && self.currentForcedSpeaker == nil { + self.currentDominantSpeaker = (myEntry.peer.id, myEntry.effectiveVideoEndpointId, CACurrentMediaTime()) + myVideoUpdated = true + } + self.myEntry = myEntry guard self.didSetDataReady && (force || (!self.isPanning && !self.animatingExpansion && !self.animatingMainStage)) else { return @@ -4630,7 +4929,7 @@ public final class VoiceChatController: ViewController { self.mainStageNode.update(peerEntry: mainEntry, pinned: self.currentForcedSpeaker != nil) if let previousMainEntry = previousMainEntry, maybeUpdateVideo { - if previousMainEntry.effectiveVideoEndpointId != mainEntry.effectiveVideoEndpointId { + if previousMainEntry.effectiveVideoEndpointId != mainEntry.effectiveVideoEndpointId || previousMainEntry.videoPaused != mainEntry.videoPaused || myVideoUpdated { self.updateMainVideo(waitForFullSize: true, entries: fullscreenEntries, force: true) return } @@ -4643,9 +4942,25 @@ public final class VoiceChatController: ViewController { self.updateRequestedVideoChannels() self.peerIdToEndpointId = peerIdToEndpointId - - if !tileItems.isEmpty { - entries.insert(.tiles(tileItems), at: 0) + + var updateLayout = false + var animatingLayout = false + if self.currentTileItems.isEmpty != gridTileItems.isEmpty { + animatingLayout = true + updateLayout = true + } + if !tileItems.isEmpty || !gridTileItems.isEmpty { + if isTablet { + updateLayout = true + self.currentTileItems = gridTileItems + if displayPanelVideos && !tileItems.isEmpty { + entries.insert(.tiles(tileItems, .pairs), at: 0) + } + } else { + if !tileItems.isEmpty { + entries.insert(.tiles(tileItems, .pairs), at: 0) + } + } } var canInvite = true @@ -4697,27 +5012,53 @@ public final class VoiceChatController: ViewController { self.enqueueTransition(transition) let fullscreenTransition = self.preparedFullscreenTransition(from: previousFullscreenEntries, to: fullscreenEntries, isLoading: false, isEmpty: false, canInvite: canInvite, crossFade: false, animated: true, context: self.context, presentationData: presentationData, interaction: self.itemInteraction!) - self.enqueueFullscreenTransition(fullscreenTransition) + if !isTablet { + self.enqueueFullscreenTransition(fullscreenTransition) + } + + if speakingPeersUpdated { + var speakingPeers = speakingPeers + var updatedSpeakers: [PeerId] = [] + for peerId in self.currentSpeakers { + if speakingPeers.contains(peerId) { + updatedSpeakers.append(peerId) + speakingPeers.remove(peerId) + } + } + + var currentSpeakingSubtitle = "" + for peerId in Array(speakingPeers) { + updatedSpeakers.append(peerId) + if let peer = entryByPeerId[peerId]?.peer { + let displayName = speakingPeers.count == 1 ? peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder) : peer.compactDisplayTitle + if currentSpeakingSubtitle.isEmpty { + currentSpeakingSubtitle.append(displayName) + } else { + currentSpeakingSubtitle.append(", \(displayName)") + } + } + } + self.currentSpeakers = updatedSpeakers + self.currentSpeakingSubtitle = currentSpeakingSubtitle.isEmpty ? nil : currentSpeakingSubtitle + self.updateTitle(transition: .immediate) + } if case .fullscreen = self.displayMode, !self.mainStageNode.animating { if speakingPeersUpdated { - var speakingPeers = speakingPeers - var updatedSpeakers: [PeerId] = [] - for peerId in self.currentSpeakers { - if speakingPeers.contains(peerId) { - updatedSpeakers.append(peerId) - speakingPeers.remove(peerId) - } - } - for peerId in Array(speakingPeers) { - updatedSpeakers.append(peerId) - } - self.currentSpeakers = updatedSpeakers - self.mainStageNode.update(speakingPeerId: updatedSpeakers.first) + self.mainStageNode.update(speakingPeerId: self.currentSpeakers.first) } } else { self.mainStageNode.update(speakingPeerId: nil) } + + if updateLayout, let (layout, navigationHeight) = self.validLayout { + let transition = ContainedViewLayoutTransition.animated(duration: 0.4, curve: .easeInOut) + if animatingLayout { + self.animatingExpansion = true + } + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: transition) + self.updateDecorationsLayout(transition: transition) + } } private func callStateDidReset() { @@ -4731,7 +5072,6 @@ public final class VoiceChatController: ViewController { for channel in channels { validSources.insert(channel.endpointId) - if !self.requestedVideoSources.contains(channel.endpointId) { self.requestedVideoSources.insert(channel.endpointId) self.call.makeIncomingVideoView(endpointId: channel.endpointId, requestClone: true, completion: { [weak self] videoView, backdropVideoView in @@ -4740,16 +5080,20 @@ public final class VoiceChatController: ViewController { guard let strongSelf = self, let videoView = videoView else { return } - let videoNode = GroupVideoNode(videoView: videoView, backdropVideoView: backdropVideoView) - strongSelf.readyVideoDisposables.set((videoNode.ready - |> filter { $0 } - |> take(1) - |> timeout(10.0, queue: Queue.mainQueue(), alternate: .single(false)) + let videoNode = GroupVideoNode(videoView: videoView, backdropVideoView: backdropVideoView, disabledText: strongSelf.presentationData.strings.VoiceChat_VideoPaused) + + strongSelf.readyVideoDisposables.set((combineLatest(videoNode.ready, .single(false) |> then(.single(true) |> delay(10.0, queue: Queue.mainQueue()))) |> deliverOnMainQueue - ).start(next: { [weak self, weak videoNode] ready in + ).start(next: { [weak self, weak videoNode] ready, timeouted in if let strongSelf = self, let videoNode = videoNode { Queue.mainQueue().after(0.1) { - if ready { + if timeouted && !ready { + strongSelf.timeoutedEndpointIds.insert(channel.endpointId) + strongSelf.readyVideoEndpointIds.remove(channel.endpointId) + strongSelf.wideVideoNodes.remove(channel.endpointId) + + strongSelf.updateMembers() + } else if ready { strongSelf.readyVideoEndpointIds.insert(channel.endpointId) strongSelf.timeoutedEndpointIds.remove(channel.endpointId) if videoNode.aspectRatio <= 0.77 { @@ -4759,27 +5103,23 @@ public final class VoiceChatController: ViewController { } strongSelf.updateMembers() - if let interaction = strongSelf.itemInteraction { - loop: for i in 0 ..< strongSelf.currentFullscreenEntries.count { - let entry = strongSelf.currentFullscreenEntries[i] - switch entry { - case let .peer(peerEntry, _): - if peerEntry.effectiveVideoEndpointId == channel.endpointId { - let presentationData = strongSelf.presentationData.withUpdated(theme: strongSelf.darkTheme) - strongSelf.fullscreenListNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [ListViewUpdateItem(index: i, previousIndex: i, item: entry.fullscreenItem(context: strongSelf.context, presentationData: presentationData, interaction: interaction), directionHint: nil)], options: [.Synchronous], updateOpaqueState: nil) - break loop + if let (layout, _) = strongSelf.validLayout, case .compact = layout.metrics.widthClass { + if let interaction = strongSelf.itemInteraction { + loop: for i in 0 ..< strongSelf.currentFullscreenEntries.count { + let entry = strongSelf.currentFullscreenEntries[i] + switch entry { + case let .peer(peerEntry, _): + if peerEntry.effectiveVideoEndpointId == channel.endpointId { + let presentationData = strongSelf.presentationData.withUpdated(theme: strongSelf.darkTheme) + strongSelf.fullscreenListNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [ListViewUpdateItem(index: i, previousIndex: i, item: entry.fullscreenItem(context: strongSelf.context, presentationData: presentationData, interaction: interaction), directionHint: nil)], options: [.Synchronous], updateOpaqueState: nil) + break loop + } + default: + break } - default: - break } } } - } else { - strongSelf.timeoutedEndpointIds.insert(channel.endpointId) - strongSelf.readyVideoEndpointIds.remove(channel.endpointId) - strongSelf.wideVideoNodes.remove(channel.endpointId) - - strongSelf.updateMembers() } } } @@ -4821,23 +5161,41 @@ public final class VoiceChatController: ViewController { } let currentEntries = entries ?? self.currentFullscreenEntries - var effectiveSpeaker: (PeerId, String?)? = nil - var anySpeakerWithVideo: (PeerId, String?)? = nil - var anySpeaker: PeerId? = nil + var effectiveSpeaker: (PeerId, String?, Bool, Bool, Bool)? = nil + var anySpeakerWithVideo: (PeerId, String?, Bool, Bool, Bool)? = nil + var anySpeaker: (PeerId, Bool)? = nil if let (peerId, preferredVideoEndpointId) = effectiveMainSpeaker { for entry in currentEntries { switch entry { case let .peer(peer, _): if peer.peer.id == peerId { if let preferredVideoEndpointId = preferredVideoEndpointId, peer.videoEndpointId == preferredVideoEndpointId || peer.presentationEndpointId == preferredVideoEndpointId { - effectiveSpeaker = (peerId, preferredVideoEndpointId) + var isPaused = false + if peer.presentationEndpointId != nil && preferredVideoEndpointId == peer.presentationEndpointId { + isPaused = peer.presentationPaused + } else if peer.videoEndpointId != nil && preferredVideoEndpointId == peer.videoEndpointId { + isPaused = peer.videoPaused + } + effectiveSpeaker = (peerId, preferredVideoEndpointId, peer.isMyPeer, peer.presentationEndpointId != nil && preferredVideoEndpointId == peer.presentationEndpointId, isPaused) } else { - effectiveSpeaker = (peerId, peer.effectiveVideoEndpointId) + var isPaused = false + if peer.effectiveVideoEndpointId != nil && peer.effectiveVideoEndpointId == peer.presentationEndpointId { + isPaused = peer.presentationPaused + } else if peer.effectiveVideoEndpointId != nil && peer.effectiveVideoEndpointId == peer.videoEndpointId { + isPaused = peer.videoPaused + } + effectiveSpeaker = (peerId, peer.effectiveVideoEndpointId, peer.isMyPeer, peer.presentationEndpointId != nil && peer.effectiveVideoEndpointId == peer.presentationEndpointId, isPaused) } } else if anySpeakerWithVideo == nil, let videoEndpointId = peer.effectiveVideoEndpointId { - anySpeakerWithVideo = (peer.peer.id, videoEndpointId) + var isPaused = false + if videoEndpointId == peer.presentationEndpointId { + isPaused = peer.presentationPaused + } else if videoEndpointId == peer.videoEndpointId { + isPaused = peer.videoPaused + } + anySpeakerWithVideo = (peer.peer.id, videoEndpointId, peer.isMyPeer, peer.presentationEndpointId != nil && videoEndpointId == peer.presentationEndpointId, isPaused) } else if anySpeaker == nil { - anySpeaker = peer.peer.id + anySpeaker = (peer.peer.id, peer.isMyPeer) } default: break @@ -4847,8 +5205,8 @@ public final class VoiceChatController: ViewController { if effectiveSpeaker == nil { self.currentForcedSpeaker = nil - effectiveSpeaker = anySpeakerWithVideo ?? anySpeaker.flatMap { ($0, nil) } - if let (peerId, videoEndpointId) = effectiveSpeaker { + effectiveSpeaker = anySpeakerWithVideo ?? anySpeaker.flatMap { ($0.0, nil, $0.1, false, false) } + if let (peerId, videoEndpointId, _, _, _) = effectiveSpeaker { self.currentDominantSpeaker = (peerId, videoEndpointId, CACurrentMediaTime()) } else { self.currentDominantSpeaker = nil @@ -4861,11 +5219,18 @@ public final class VoiceChatController: ViewController { } var waitForFullSize = waitForFullSize - if let (_, maybeVideoEndpointId) = effectiveSpeaker, let videoEndpointId = maybeVideoEndpointId, !self.readyVideoEndpointIds.contains(videoEndpointId), entries == nil { - waitForFullSize = false + var isReady = false + if let (_, maybeVideoEndpointId, _, _, _) = effectiveSpeaker, let videoEndpointId = maybeVideoEndpointId { + isReady = true + if !self.readyVideoEndpointIds.contains(videoEndpointId) { + isReady = false + if entries == nil { + waitForFullSize = false + } + } } - self.mainStageNode.update(peer: effectiveSpeaker, waitForFullSize: waitForFullSize, completion: { + self.mainStageNode.update(peer: effectiveSpeaker, isReady: isReady, waitForFullSize: waitForFullSize, completion: { completion?() }) } @@ -4881,13 +5246,14 @@ public final class VoiceChatController: ViewController { if gestureRecognizer is UILongPressGestureRecognizer { return !self.isScheduling } else if gestureRecognizer is DirectionalPanGestureRecognizer { - if self.mainStageNode.animating { + if self.mainStageNode.animating || self.animatingMainStage { return false } - let location = gestureRecognizer.location(in: self.bottomPanelNode.view) + let bottomPanelLocation = gestureRecognizer.location(in: self.bottomPanelNode.view) let containerLocation = gestureRecognizer.location(in: self.contentContainer.view) - if self.audioButton.frame.contains(location) || (!self.cameraButton.isHidden && self.cameraButton.frame.contains(location)) || self.leaveButton.frame.contains(location) || self.pickerView?.frame.contains(containerLocation) == true { + let mainStageLocation = gestureRecognizer.location(in: self.mainStageNode.view) + if self.audioButton.frame.contains(bottomPanelLocation) || (!self.cameraButton.isHidden && self.cameraButton.frame.contains(bottomPanelLocation)) || self.leaveButton.frame.contains(bottomPanelLocation) || self.pickerView?.frame.contains(containerLocation) == true || (self.mainStageContainerNode.isUserInteractionEnabled && (mainStageLocation.y < 44.0 || mainStageLocation.y > self.mainStageNode.frame.height - 100.0)) { return false } } @@ -4902,6 +5268,9 @@ public final class VoiceChatController: ViewController { } @objc func panGesture(_ recognizer: UIPanGestureRecognizer) { + guard let (layout, _) = self.validLayout else { + return + } let contentOffset = self.listNode.visibleContentOffset() switch recognizer.state { case .began: @@ -4917,7 +5286,7 @@ public final class VoiceChatController: ViewController { self.controller?.dismissAllTooltips() - if case .fullscreen = self.displayMode { + if case .fullscreen = self.displayMode, case .compact = layout.metrics.widthClass { self.isPanning = true self.mainStageBackgroundNode.alpha = 0.0 @@ -4941,57 +5310,64 @@ public final class VoiceChatController: ViewController { return } - switch self.displayMode { - case let .modal(isExpanded, previousIsFilled): - var topInset: CGFloat = 0.0 - if let (currentTopInset, currentPanOffset) = self.panGestureArguments { - topInset = currentTopInset - - if case let .known(value) = contentOffset, value <= 0.5 { + let translateBounds: Bool + if case .regular = layout.metrics.widthClass { + translateBounds = true + } else { + switch self.displayMode { + case let .modal(isExpanded, previousIsFilled): + var topInset: CGFloat = 0.0 + if let (currentTopInset, currentPanOffset) = self.panGestureArguments { + topInset = currentTopInset + + if case let .known(value) = contentOffset, value <= 0.5 { + } else { + translation = currentPanOffset + if self.isExpanded { + recognizer.setTranslation(CGPoint(), in: self.contentContainer.view) + } + } + + self.panGestureArguments = (currentTopInset, translation) + } + + let currentOffset = topInset + translation + + var isFilled = previousIsFilled + if currentOffset < 20.0 { + isFilled = true + } else if currentOffset > 40.0 { + isFilled = false + } + if isFilled != previousIsFilled { + self.displayMode = .modal(isExpanded: isExpanded, isFilled: isFilled) + self.updateDecorationsColors() + } + + if self.isExpanded { } else { - translation = currentPanOffset - if self.isExpanded { - recognizer.setTranslation(CGPoint(), in: self.contentContainer.view) + if currentOffset > 0.0 { + self.listNode.scroller.panGestureRecognizer.setTranslation(CGPoint(), in: self.listNode.scroller) } } + case .fullscreen: + if abs(translation) > 32.0 { + if self.fullscreenListNode.layer.animationKeys()?.contains("opacity") == true { + self.fullscreenListNode.layer.removeAllAnimations() + } + } + var bounds = self.mainStageContainerNode.bounds + bounds.origin.y = -translation + self.mainStageContainerNode.bounds = bounds - self.panGestureArguments = (currentTopInset, translation) - } + var backgroundFrame = self.mainStageNode.frame + backgroundFrame.origin.y += -translation + self.mainStageBackgroundNode.frame = backgroundFrame + + self.fullscreenListContainer.subnodeTransform = CATransform3DMakeTranslation(0.0, translation, 0.0) + } - let currentOffset = topInset + translation - - var isFilled = previousIsFilled - if currentOffset < 20.0 { - isFilled = true - } else if currentOffset > 40.0 { - isFilled = false - } - if isFilled != previousIsFilled { - self.displayMode = .modal(isExpanded: isExpanded, isFilled: isFilled) - self.updateDecorationsColors() - } - - if self.isExpanded { - } else { - if currentOffset > 0.0 { - self.listNode.scroller.panGestureRecognizer.setTranslation(CGPoint(), in: self.listNode.scroller) - } - } - case .fullscreen: - if abs(translation) > 32.0 { - if self.fullscreenListNode.layer.animationKeys()?.contains("opacity") == true { - self.fullscreenListNode.layer.removeAllAnimations() - } - } - var bounds = self.mainStageContainerNode.bounds - bounds.origin.y = -translation - self.mainStageContainerNode.bounds = bounds - - var backgroundFrame = self.mainStageNode.frame - backgroundFrame.origin.y += -translation - self.mainStageBackgroundNode.frame = backgroundFrame - - self.fullscreenListContainer.subnodeTransform = CATransform3DMakeTranslation(0.0, translation, 0.0) + translateBounds = !self.isExpanded } if let (layout, navigationHeight) = self.validLayout { @@ -4999,7 +5375,6 @@ public final class VoiceChatController: ViewController { self.updateDecorationsLayout(transition: .immediate) } - let translateBounds = !self.isExpanded if translateBounds { var bounds = self.contentContainer.bounds bounds.origin.y = -translation @@ -5034,7 +5409,7 @@ public final class VoiceChatController: ViewController { topInset = self.listNode.frame.height } - if case .fullscreen = self.displayMode { + if case .fullscreen = self.displayMode, case .compact = layout.metrics.widthClass { self.panGestureArguments = nil self.fullscreenListContainer.subnodeTransform = CATransform3DIdentity if abs(translation.y) > 100.0 || abs(velocity.y) > 300.0 { @@ -5065,7 +5440,7 @@ public final class VoiceChatController: ViewController { } }) } - } else if case .modal(true, _) = self.displayMode { + } else if case .modal(true, _) = self.displayMode, case .compact = layout.metrics.widthClass { self.panGestureArguments = nil if velocity.y > 300.0 || offset > topInset / 2.0 { self.displayMode = .modal(isExpanded: false, isFilled: false) @@ -5073,12 +5448,14 @@ public final class VoiceChatController: ViewController { self.animatingExpansion = true self.listNode.scroller.setContentOffset(CGPoint(), animated: false) + self.expansionVelocity = velocity.y if let (layout, navigationHeight) = self.validLayout { self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .easeInOut)) } self.updateDecorationsLayout(transition: .animated(duration: 0.3, curve: .easeInOut), completion: { self.animatingExpansion = false }) + self.expansionVelocity = nil } else { self.displayMode = .modal(isExpanded: true, isFilled: true) self.updateDecorationsColors() @@ -5097,6 +5474,9 @@ public final class VoiceChatController: ViewController { if bounds.minY < -60 || (bounds.minY < 0.0 && velocity.y > 300.0) { if self.isScheduling { self.dismissScheduled() + } else if case .regular = layout.metrics.widthClass { + self.controller?.dismiss(closing: false, manual: true) + dismissing = true } else { if case .fullscreen = self.displayMode { } else { @@ -5111,6 +5491,7 @@ public final class VoiceChatController: ViewController { } } + self.expansionVelocity = velocity.y if case .modal = self.displayMode { self.displayMode = .modal(isExpanded: true, isFilled: true) } @@ -5123,6 +5504,7 @@ public final class VoiceChatController: ViewController { self.updateDecorationsLayout(transition: .animated(duration: 0.3, curve: .easeInOut), completion: { self.animatingExpansion = false }) + self.expansionVelocity = nil } else if !self.isScheduling { self.updateDecorationsColors() self.animatingExpansion = true @@ -5159,7 +5541,7 @@ public final class VoiceChatController: ViewController { self.animatingExpansion = false }) - if case .fullscreen = self.displayMode { + if case .fullscreen = self.displayMode, case .regular = layout.metrics.widthClass { self.fullscreenListContainer.subnodeTransform = CATransform3DIdentity self.isPanning = false self.mainStageBackgroundNode.alpha = 1.0 @@ -5510,15 +5892,20 @@ public final class VoiceChatController: ViewController { } private func displayUnmuteTooltip() { + guard let (layout, _) = self.validLayout else { + return + } let location = self.actionButton.view.convert(self.actionButton.bounds, to: self.view).center var point = CGRect(origin: CGPoint(x: location.x - 5.0, y: location.y - 5.0 - 68.0), size: CGSize(width: 10.0, height: 10.0)) var position: TooltipScreen.ArrowPosition = .bottom - if self.isLandscape { - point.origin.x = location.x - 5.0 - 36.0 - point.origin.y = location.y - 5.0 - position = .right - } else if case .fullscreen = self.displayMode { - point.origin.y += 32.0 + if case .compact = layout.metrics.widthClass { + if self.isLandscape { + point.origin.x = location.x - 5.0 - 36.0 + point.origin.y = location.y - 5.0 + position = .right + } else if case .fullscreen = self.displayMode { + point.origin.y += 32.0 + } } self.controller?.present(TooltipScreen(text: self.presentationData.strings.VoiceChat_UnmuteSuggestion, style: .gradient(UIColor(rgb: 0x1d446c), UIColor(rgb: 0x193e63)), icon: nil, location: .point(point, position), displayDuration: .custom(8.0), shouldDismissOnTouch: { _ in return .dismiss(consume: false) @@ -5541,6 +5928,9 @@ public final class VoiceChatController: ViewController { } private func attachFullscreenVideos() { + guard let (layout, _) = self.validLayout, case .compact = layout.metrics.widthClass else { + return + } var verticalItemNodes: [String: ASDisplayNode] = [:] self.listNode.forEachItemNode { itemNode in if let itemNode = itemNode as? VoiceChatTilesGridItemNode { @@ -5555,33 +5945,40 @@ public final class VoiceChatController: ViewController { } } } + self.fullscreenListNode.forEachItemNode { itemNode in - if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item, let otherItemNode = verticalItemNodes[String(item.peer.id.toInt64()) + "_" + (item.videoEndpointId ?? "")] { - itemNode.animateTransitionIn(from: otherItemNode, containerNode: self.transitionContainerNode, transition: .immediate, animate: false) + if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item { + let otherItemNode = verticalItemNodes[String(item.peer.id.toInt64()) + "_" + (item.videoEndpointId ?? "")] + itemNode.transitionIn(from: otherItemNode) } } } private func attachTileVideos() { var fullscreenItemNodes: [String: VoiceChatFullscreenParticipantItemNode] = [:] - self.fullscreenListNode.forEachItemNode { itemNode in - if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item { - fullscreenItemNodes[String(item.peer.id.toInt64()) + "_" + (item.videoEndpointId ?? "")] = itemNode + var tileNodes: [VoiceChatTileItemNode] = [] + if !self.tileGridNode.isHidden { + tileNodes = self.tileGridNode.tileNodes + } else { + self.fullscreenListNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item { + fullscreenItemNodes[String(item.peer.id.toInt64()) + "_" + (item.videoEndpointId ?? "")] = itemNode + } + } + self.listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? VoiceChatTilesGridItemNode { + tileNodes = itemNode.tileNodes + } } } - self.listNode.forEachItemNode { itemNode in - if let itemNode = itemNode as? VoiceChatTilesGridItemNode { - for tileNode in itemNode.tileNodes { - if let item = tileNode.item { - if let otherItemNode = fullscreenItemNodes[String(item.peer.id.toInt64()) + "_" + item.videoEndpointId] { - tileNode.animateTransitionIn(from: otherItemNode, containerNode: self.transitionContainerNode, transition: .immediate, animate: false) - } - - if tileNode.item?.peer.id == self.effectiveSpeaker?.0 && tileNode.item?.videoEndpointId == self.effectiveSpeaker?.1 { - tileNode.isHidden = true - } - } + for tileNode in tileNodes { + if let item = tileNode.item { + let otherItemNode = fullscreenItemNodes[String(item.peer.id.toInt64()) + "_" + item.videoEndpointId] + tileNode.transitionIn(from: otherItemNode) + + if tileNode.item?.peer.id == self.effectiveSpeaker?.0 && tileNode.item?.videoEndpointId == self.effectiveSpeaker?.1 { + tileNode.isHidden = true } } } @@ -5605,6 +6002,11 @@ public final class VoiceChatController: ViewController { self.animatingMainStage = true } + var hasFullscreenList = false + if let (layout, _) = self.validLayout, case .compact = layout.metrics.widthClass { + hasFullscreenList = true + } + let completion = { self.displayMode = displayMode self.updateDecorationsColors() @@ -5613,55 +6015,77 @@ public final class VoiceChatController: ViewController { self.mainStageContainerNode.isUserInteractionEnabled = isFullscreen let transition: ContainedViewLayoutTransition = .animated(duration: 0.55, curve: .spring) - if case .modal = previousDisplayMode, case .fullscreen = self.displayMode { + self.mainStageNode.alpha = 0.0 self.updateDecorationsLayout(transition: .immediate) var verticalItemNodes: [String: ASDisplayNode] = [:] - self.listNode.forEachItemNode { itemNode in - if let itemNode = itemNode as? VoiceChatTilesGridItemNode { - for tileNode in itemNode.tileNodes { - if let item = tileNode.item { - verticalItemNodes[String(item.peer.id.toInt64()) + "_" + item.videoEndpointId] = tileNode - } + + var tileNodes: [VoiceChatTileItemNode] = [] + if !self.tileGridNode.isHidden { + tileNodes = self.tileGridNode.tileNodes + } else { + self.listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? VoiceChatTilesGridItemNode { + tileNodes = itemNode.tileNodes } } } + for tileNode in tileNodes { + if let item = tileNode.item { + verticalItemNodes[String(item.peer.id.toInt64()) + "_" + item.videoEndpointId] = tileNode + } + } let completion = { let effectiveSpeakerPeerId = self.effectiveSpeaker?.0 - self.fullscreenListContainer.isHidden = false - self.fullscreenListNode.alpha = 0.0 + if hasFullscreenList { + self.fullscreenListContainer.isHidden = false + self.fullscreenListNode.alpha = 0.0 + } + + var gridSnapshotView: UIView? + if !hasFullscreenList, let snapshotView = self.tileGridNode.view.snapshotView(afterScreenUpdates: false) { + gridSnapshotView = snapshotView + self.tileGridNode.view.addSubview(snapshotView) + self.displayPanelVideos = true + self.updateMembers(maybeUpdateVideo: false, force: true) + } let completion = { - self.attachFullscreenVideos() - - self.fullscreenListNode.alpha = 1.0 - self.fullscreenListNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15) + if hasFullscreenList { + self.attachFullscreenVideos() + + self.fullscreenListNode.alpha = 1.0 + self.fullscreenListNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15) + } } if let effectiveSpeakerPeerId = effectiveSpeakerPeerId, let otherItemNode = verticalItemNodes[String(effectiveSpeakerPeerId.toInt64()) + "_" + (self.effectiveSpeaker?.1 ?? "")] { + + if hasFullscreenList { + let transitionStartPosition = otherItemNode.view.convert(CGPoint(x: otherItemNode.frame.width / 2.0, y: otherItemNode.frame.height), to: self.fullscreenListContainer.view.superview) + self.fullscreenListContainer.layer.animatePosition(from: transitionStartPosition, to: self.fullscreenListContainer.position, duration: 0.55, timingFunction: kCAMediaTimingFunctionSpring) + } - self.mainStageNode.alpha = 0.0 - - let transitionStartPosition = otherItemNode.view.convert(CGPoint(x: otherItemNode.frame.width / 2.0, y: otherItemNode.frame.height), to: self.fullscreenListContainer.view.superview) - self.fullscreenListContainer.layer.animatePosition(from: transitionStartPosition, to: self.fullscreenListContainer.position, duration: 0.55, timingFunction: kCAMediaTimingFunctionSpring) - self.mainStageNode.animateTransitionIn(from: otherItemNode, transition: transition, completion: { [weak self] in self?.animatingMainStage = false }) self.mainStageNode.alpha = 1.0 self.mainStageBackgroundNode.alpha = 1.0 - self.mainStageBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.13, completion: { [weak otherItemNode] _ in + self.mainStageBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: hasFullscreenList ? 0.13 : 0.3, completion: { [weak otherItemNode] _ in otherItemNode?.alpha = 0.0 + gridSnapshotView?.removeFromSuperview() completion() }) } else { completion() } - self.listContainer.layer.animateScale(from: 1.0, to: 0.86, duration: 0.55, timingFunction: kCAMediaTimingFunctionSpring) + if hasFullscreenList { + self.listContainer.layer.animateScale(from: 1.0, to: 0.86, duration: 0.55, timingFunction: kCAMediaTimingFunctionSpring) + } if self.isLandscape { self.transitionMaskTopFillLayer.opacity = 1.0 @@ -5722,34 +6146,60 @@ public final class VoiceChatController: ViewController { self.listContainer.transform = CATransform3DIdentity - self.listNode.forEachItemNode { itemNode in - if let itemNode = itemNode as? VoiceChatTilesGridItemNode { - for tileNode in itemNode.tileNodes { - if let item = tileNode.item { - if item.peer.id == effectiveSpeakerPeerId, item.videoEndpointId == self.effectiveSpeaker?.1 { - targetTileNode = tileNode - } - } + var tileNodes: [VoiceChatTileItemNode] = [] + if !self.tileGridNode.isHidden { + tileNodes = self.tileGridNode.tileNodes + } else { + self.listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? VoiceChatTilesGridItemNode { + tileNodes = itemNode.tileNodes + } + } + } + for tileNode in tileNodes { + if let item = tileNode.item { + if item.peer.id == effectiveSpeakerPeerId, item.videoEndpointId == self.effectiveSpeaker?.1 { + targetTileNode = tileNode } } } - let transitionOffset = -self.mainStageContainerNode.bounds.minY - if transitionOffset.isZero { + var transitionOffset = -self.mainStageContainerNode.bounds.minY + if transitionOffset.isZero, let (layout, _) = self.validLayout { + if case .regular = layout.metrics.widthClass { + transitionOffset += 87.0 + } if let targetTileNode = targetTileNode { let transitionTargetPosition = targetTileNode.view.convert(CGPoint(x: targetTileNode.frame.width / 2.0, y: targetTileNode.frame.height), to: self.fullscreenListContainer.view.superview) self.fullscreenListContainer.layer.animatePosition(from: self.fullscreenListContainer.position, to: transitionTargetPosition, duration: 0.55, timingFunction: kCAMediaTimingFunctionSpring) } - - self.fullscreenListNode.alpha = 0.0 - self.fullscreenListNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, completion: { [weak self] _ in - self?.fullscreenListContainer.isHidden = true - self?.fullscreenListNode.alpha = 1.0 - self?.attachTileVideos() + + if !hasFullscreenList { + self.displayPanelVideos = false + self.listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? VoiceChatTilesGridItemNode { + itemNode.snapshotForDismissal() + } + } + self.updateMembers(maybeUpdateVideo: false, force: true) + self.attachTileVideos() - self?.mainStageBackgroundNode.alpha = 0.0 - self?.mainStageBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25) - }) + self.mainStageBackgroundNode.alpha = 0.0 + self.mainStageBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25) + } else { + self.fullscreenListNode.alpha = 0.0 + self.mainStageBackgroundNode.alpha = 1.0 + self.fullscreenListNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, completion: { [weak self] _ in + if let strongSelf = self { + strongSelf.fullscreenListContainer.isHidden = true + strongSelf.fullscreenListNode.alpha = 1.0 + strongSelf.attachTileVideos() + + strongSelf.mainStageBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25) + strongSelf.mainStageBackgroundNode.alpha = 0.0 + } + }) + } } self.mainStageNode.animateTransitionOut(to: targetTileNode, offset: transitionOffset, transition: transition, completion: { [weak self] in guard let strongSelf = self else { @@ -5772,9 +6222,11 @@ public final class VoiceChatController: ViewController { strongSelf.animatingMainStage = false }) - self.listContainer.layer.animateScale(from: 0.86, to: 1.0, duration: 0.55, timingFunction: kCAMediaTimingFunctionSpring) + if hasFullscreenList { + self.listContainer.layer.animateScale(from: 0.86, to: 1.0, duration: 0.55, timingFunction: kCAMediaTimingFunctionSpring) + } - self.transitionMaskTopFillLayer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15) + self.transitionMaskTopFillLayer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3) if !transitionOffset.isZero { self.transitionMaskBottomFillLayer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3) } @@ -5821,71 +6273,79 @@ public final class VoiceChatController: ViewController { guard let (layout, _) = self.validLayout else { return CGPoint() } - var size = layout.size - if case .regular = layout.metrics.widthClass { - size.width = floor(min(size.width, size.height) * 0.5) - } + let size = layout.size let hasCameraButton = self.cameraButton.isUserInteractionEnabled let centralButtonSide = min(size.width, size.height) - 32.0 let centralButtonSize = CGSize(width: centralButtonSide, height: centralButtonSide) - switch self.displayMode { - case .modal: - if self.isLandscape { - let sideInset: CGFloat - let buttonsCount: Int - if hasCameraButton { - sideInset = 26.0 - buttonsCount = 4 + if case .regular = layout.metrics.widthClass { + let contentWidth: CGFloat = max(320.0, min(375.0, floor(size.width * 0.3))) + let contentLeftInset: CGFloat + if self.peerIdToEndpointId.isEmpty { + contentLeftInset = floorToScreenPixels((layout.size.width - contentWidth) / 2.0) + } else { + contentLeftInset = self.panelHidden ? layout.size.width : layout.size.width - contentWidth + } + return CGPoint(x: contentLeftInset + floorToScreenPixels(contentWidth / 2.0), y: layout.size.height - self.effectiveBottomAreaHeight - layout.intrinsicInsets.bottom + floor(self.effectiveBottomAreaHeight / 2.0) - 3.0) + } else { + switch self.displayMode { + case .modal: + if self.isLandscape { + let sideInset: CGFloat + let buttonsCount: Int + if hasCameraButton { + sideInset = 26.0 + buttonsCount = 4 + } else { + sideInset = 42.0 + buttonsCount = 3 + } + let spacing = floor((layout.size.height - sideInset * 2.0 - sideButtonSize.height * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) + let x = layout.size.width - fullscreenBottomAreaHeight - layout.safeInsets.right + floor((fullscreenBottomAreaHeight - sideButtonSize.width) / 2.0) + let actionButtonFrame = CGRect(origin: CGPoint(x: x, y: sideInset + sideButtonSize.height + spacing), size: sideButtonSize) + return actionButtonFrame.center } else { - sideInset = 42.0 - buttonsCount = 3 + let actionButtonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - centralButtonSize.width) / 2.0), y: layout.size.height - self.effectiveBottomAreaHeight - layout.intrinsicInsets.bottom + floor((self.effectiveBottomAreaHeight - centralButtonSize.height) / 2.0) - 3.0), size: centralButtonSize) + return actionButtonFrame.center } - let spacing = floor((layout.size.height - sideInset * 2.0 - sideButtonSize.height * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) - let x = layout.size.width - fullscreenBottomAreaHeight - layout.safeInsets.right + floor((fullscreenBottomAreaHeight - sideButtonSize.width) / 2.0) - let actionButtonFrame = CGRect(origin: CGPoint(x: x, y: sideInset + sideButtonSize.height + spacing), size: sideButtonSize) - return actionButtonFrame.center - } else { - let actionButtonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - centralButtonSize.width) / 2.0), y: layout.size.height - self.effectiveBottomAreaHeight - layout.intrinsicInsets.bottom + floor((self.effectiveBottomAreaHeight - centralButtonSize.height) / 2.0) - 3.0), size: centralButtonSize) - return actionButtonFrame.center - } - case let .fullscreen(controlsHidden): - if self.isLandscape { - let sideInset: CGFloat - let buttonsCount: Int - if hasCameraButton { - sideInset = 26.0 - buttonsCount = 4 + case let .fullscreen(controlsHidden): + if self.isLandscape { + let sideInset: CGFloat + let buttonsCount: Int + if hasCameraButton { + sideInset = 26.0 + buttonsCount = 4 + } else { + sideInset = 42.0 + buttonsCount = 3 + } + let spacing = floor((layout.size.height - sideInset * 2.0 - sideButtonSize.height * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) + let x = layout.size.width - fullscreenBottomAreaHeight - layout.safeInsets.right + (controlsHidden ? fullscreenBottomAreaHeight + layout.safeInsets.right + 30.0 : floor((fullscreenBottomAreaHeight - sideButtonSize.width) / 2.0)) + let actionButtonFrame = CGRect(origin: CGPoint(x: x, y: sideInset + sideButtonSize.height + spacing), size: sideButtonSize) + return actionButtonFrame.center } else { - sideInset = 42.0 - buttonsCount = 3 + let sideInset: CGFloat + let buttonsCount: Int + if hasCameraButton { + sideInset = 26.0 + buttonsCount = 4 + } else { + sideInset = 42.0 + buttonsCount = 3 + } + let spacing = floor((layout.size.width - sideInset * 2.0 - sideButtonSize.width * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) + let y = layout.size.height - self.effectiveBottomAreaHeight - layout.intrinsicInsets.bottom + (controlsHidden ? self.effectiveBottomAreaHeight + layout.intrinsicInsets.bottom + 30.0: floor((self.effectiveBottomAreaHeight - sideButtonSize.height) / 2.0)) + let secondButtonFrame: CGRect + if hasCameraButton { + let firstButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: y), size: sideButtonSize) + secondButtonFrame = CGRect(origin: CGPoint(x: firstButtonFrame.maxX + spacing, y: y), size: sideButtonSize) + } else { + secondButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: y), size: sideButtonSize) + } + let actionButtonFrame = CGRect(origin: CGPoint(x: secondButtonFrame.maxX + spacing, y: y), size: sideButtonSize) + return actionButtonFrame.center } - let spacing = floor((layout.size.height - sideInset * 2.0 - sideButtonSize.height * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) - let x = layout.size.width - fullscreenBottomAreaHeight - layout.safeInsets.right + (controlsHidden ? fullscreenBottomAreaHeight + layout.safeInsets.right + 30.0 : floor((fullscreenBottomAreaHeight - sideButtonSize.width) / 2.0)) - let actionButtonFrame = CGRect(origin: CGPoint(x: x, y: sideInset + sideButtonSize.height + spacing), size: sideButtonSize) - return actionButtonFrame.center - } else { - let sideInset: CGFloat - let buttonsCount: Int - if hasCameraButton { - sideInset = 26.0 - buttonsCount = 4 - } else { - sideInset = 42.0 - buttonsCount = 3 - } - let spacing = floor((layout.size.width - sideInset * 2.0 - sideButtonSize.width * CGFloat(buttonsCount)) / (CGFloat(buttonsCount - 1))) - let y = layout.size.height - self.effectiveBottomAreaHeight - layout.intrinsicInsets.bottom + (controlsHidden ? self.effectiveBottomAreaHeight + layout.intrinsicInsets.bottom + 30.0: floor((self.effectiveBottomAreaHeight - sideButtonSize.height) / 2.0)) - let secondButtonFrame: CGRect - if hasCameraButton { - let firstButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: y), size: sideButtonSize) - secondButtonFrame = CGRect(origin: CGPoint(x: firstButtonFrame.maxX + spacing, y: y), size: sideButtonSize) - } else { - secondButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: y), size: sideButtonSize) - } - let actionButtonFrame = CGRect(origin: CGPoint(x: secondButtonFrame.maxX + spacing, y: y), size: sideButtonSize) - return actionButtonFrame.center - } + } } } } @@ -6112,28 +6572,35 @@ private final class VoiceChatContextExtractedContentSource: ContextExtractedCont var keepInPlace: Bool let ignoreContentTouches: Bool = false let blurBackground: Bool + let maskView: UIView? + + private var animateTransitionIn: () -> Void + private var animateTransitionOut: () -> Void - private let controller: ViewController private let sourceNode: ContextExtractedContentContainingNode var centerVertically: Bool var shouldBeDismissed: Signal - init(controller: ViewController, sourceNode: ContextExtractedContentContainingNode, keepInPlace: Bool, blurBackground: Bool, centerVertically: Bool, shouldBeDismissed: Signal) { - self.controller = controller + init(sourceNode: ContextExtractedContentContainingNode, maskView: UIView?, keepInPlace: Bool, blurBackground: Bool, centerVertically: Bool, shouldBeDismissed: Signal, animateTransitionIn: @escaping () -> Void, animateTransitionOut: @escaping () -> Void) { self.sourceNode = sourceNode + self.maskView = maskView self.keepInPlace = keepInPlace self.blurBackground = blurBackground self.centerVertically = centerVertically self.shouldBeDismissed = shouldBeDismissed + self.animateTransitionIn = animateTransitionIn + self.animateTransitionOut = animateTransitionOut } func takeView() -> ContextControllerTakeViewInfo? { - return ContextControllerTakeViewInfo(contentContainingNode: self.sourceNode, contentAreaInScreenSpace: UIScreen.main.bounds) + self.animateTransitionIn() + return ContextControllerTakeViewInfo(contentContainingNode: self.sourceNode, contentAreaInScreenSpace: UIScreen.main.bounds, maskView: self.maskView) } func putBack() -> ContextControllerPutBackViewInfo? { - return ContextControllerPutBackViewInfo(contentAreaInScreenSpace: UIScreen.main.bounds) + self.animateTransitionOut() + return ContextControllerPutBackViewInfo(contentAreaInScreenSpace: UIScreen.main.bounds, maskView: self.maskView) } } diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatFullscreenParticipantItem.swift b/submodules/TelegramCallsUI/Sources/VoiceChatFullscreenParticipantItem.swift index 26586fff78..dc0c995f1a 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatFullscreenParticipantItem.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatFullscreenParticipantItem.swift @@ -68,12 +68,14 @@ final class VoiceChatFullscreenParticipantItem: ListViewItem { let context: AccountContext let peer: Peer let videoEndpointId: String? + let isPaused: Bool let icon: Icon let text: VoiceChatParticipantItem.ParticipantText let textColor: Color let color: Color let isLandscape: Bool let active: Bool + let showVideoWhenActive: Bool let getAudioLevel: (() -> Signal)? let getVideo: () -> GroupVideoNode? let action: ((ASDisplayNode?) -> Void)? @@ -82,18 +84,20 @@ final class VoiceChatFullscreenParticipantItem: ListViewItem { public let selectable: Bool = true - public init(presentationData: ItemListPresentationData, nameDisplayOrder: PresentationPersonNameOrder, context: AccountContext, peer: Peer, videoEndpointId: String?, icon: Icon, text: VoiceChatParticipantItem.ParticipantText, textColor: Color, color: Color, isLandscape: Bool, active: Bool, getAudioLevel: (() -> Signal)?, getVideo: @escaping () -> GroupVideoNode?, action: ((ASDisplayNode?) -> Void)?, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? = nil, getUpdatingAvatar: @escaping () -> Signal<(TelegramMediaImageRepresentation, Float)?, NoError>) { + public init(presentationData: ItemListPresentationData, nameDisplayOrder: PresentationPersonNameOrder, context: AccountContext, peer: Peer, videoEndpointId: String?, isPaused: Bool, icon: Icon, text: VoiceChatParticipantItem.ParticipantText, textColor: Color, color: Color, isLandscape: Bool, active: Bool, showVideoWhenActive: Bool, getAudioLevel: (() -> Signal)?, getVideo: @escaping () -> GroupVideoNode?, action: ((ASDisplayNode?) -> Void)?, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? = nil, getUpdatingAvatar: @escaping () -> Signal<(TelegramMediaImageRepresentation, Float)?, NoError>) { self.presentationData = presentationData self.nameDisplayOrder = nameDisplayOrder self.context = context self.peer = peer self.videoEndpointId = videoEndpointId + self.isPaused = isPaused self.icon = icon self.text = text self.textColor = textColor self.color = color self.isLandscape = isLandscape self.active = active + self.showVideoWhenActive = showVideoWhenActive self.getAudioLevel = getAudioLevel self.getVideo = getVideo self.action = action @@ -269,9 +273,7 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { gesture.cancel() return } - if item.peer.smallProfileImage != nil { - contextAction(strongSelf.contextSourceNode, gesture) - } + contextAction(strongSelf.contextSourceNode, gesture) } self.contextSourceNode.willUpdateIsExtractedToContextPreview = { [weak self] isExtracted, transition in guard let strongSelf = self, let _ = strongSelf.item else { @@ -289,161 +291,79 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { override func selected() { super.selected() + if self.animatingSelection { + return + } self.layoutParams?.0.action?(self.contextSourceNode) } - func animateTransitionIn(from sourceNode: ASDisplayNode?, containerNode: ASDisplayNode, transition: ContainedViewLayoutTransition, animate: Bool = true) { + func transitionIn(from sourceNode: ASDisplayNode?) { guard let item = self.item else { return } - var duration: Double = 0.2 - var timingFunction: String = CAMediaTimingFunctionName.easeInEaseOut.rawValue - if case let .animated(transitionDuration, curve) = transition { - duration = transitionDuration - timingFunction = curve.timingFunction + let active = item.active && !item.showVideoWhenActive + + var videoNode: GroupVideoNode? + if let sourceNode = sourceNode as? VoiceChatTileItemNode { + if let sourceVideoNode = sourceNode.videoNode { + sourceNode.videoNode = nil + videoNode = sourceVideoNode + } } - let initialAnimate = animate - if let sourceNode = sourceNode as? VoiceChatTileItemNode { - var startContainerPosition = sourceNode.view.convert(sourceNode.bounds, to: containerNode.view).center - var animate = initialAnimate - if startContainerPosition.y < -tileHeight || startContainerPosition.y > containerNode.frame.height + tileHeight { - animate = false + if videoNode == nil { + videoNode = item.getVideo() + } + + if let videoNode = videoNode { + if active { + self.avatarNode.alpha = 1.0 + videoNode.alpha = 0.0 + } else { + self.avatarNode.alpha = 0.0 + videoNode.alpha = 1.0 } + self.videoNode = videoNode + self.videoContainerNode.insertSubnode(videoNode, at: 0) - if let videoNode = sourceNode.videoNode { - if item.active { - self.avatarNode.alpha = 1.0 - videoNode.alpha = 0.0 - startContainerPosition = startContainerPosition.offsetBy(dx: 0.0, dy: 9.0) - } else { - self.avatarNode.alpha = 0.0 - } - - sourceNode.videoNode = nil - self.videoNode = videoNode - self.videoContainerNode.insertSubnode(videoNode, at: 0) - - if animate { - videoNode.updateLayout(size: videoSize, layoutMode: .fillOrFitToSquare, transition: transition) - - let scale = sourceNode.bounds.width / videoSize.width - self.videoContainerNode.layer.animateScale(from: sourceNode.bounds.width / videoSize.width, to: tileSize.width / videoSize.width, duration: duration, timingFunction: timingFunction) - self.videoContainerNode.layer.animate(from: backgroundCornerRadius * (1.0 / scale) as NSNumber, to: videoCornerRadius as NSNumber, keyPath: "cornerRadius", timingFunction: timingFunction, duration: duration, removeOnCompletion: false, completion: { _ in - }) - - self.videoFadeNode.alpha = 1.0 - self.videoFadeNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) - } else { - videoNode.updateLayout(size: videoSize, layoutMode: .fillOrFitToSquare, transition: .immediate) - self.videoFadeNode.alpha = 1.0 - } - } - - if animate { - let initialPosition = self.contextSourceNode.position - let targetContainerPosition = self.contextSourceNode.view.convert(self.contextSourceNode.bounds, to: containerNode.view).center - - self.contextSourceNode.position = targetContainerPosition - containerNode.addSubnode(self.contextSourceNode) - - self.contextSourceNode.layer.animatePosition(from: startContainerPosition, to: targetContainerPosition, duration: duration, timingFunction: timingFunction, completion: { [weak self] _ in - if let strongSelf = self { - strongSelf.contextSourceNode.position = initialPosition - strongSelf.containerNode.addSubnode(strongSelf.contextSourceNode) - } - }) - - if item.active { - self.highlightNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - self.highlightNode.layer.animateScale(from: 0.001, to: 1.0, duration: 0.2, timingFunction: timingFunction) - } - - self.backgroundImageNode.layer.animateScale(from: 0.001, to: 1.0, duration: duration, timingFunction: timingFunction) - self.backgroundImageNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration, timingFunction: timingFunction) - self.contentWrapperNode.layer.animateScale(from: 0.001, to: 1.0, duration: duration, timingFunction: timingFunction) - self.contentWrapperNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration, timingFunction: timingFunction) - } else if !initialAnimate { - if transition.isAnimated { - self.contextSourceNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration, timingFunction: timingFunction) - self.contextSourceNode.layer.animateScale(from: 0.0, to: 1.0, duration: duration, timingFunction: timingFunction) - } - } - } else if let sourceNode = sourceNode as? VoiceChatParticipantItemNode, let _ = sourceNode.item { - var startContainerPosition = sourceNode.avatarNode.view.convert(sourceNode.avatarNode.bounds, to: containerNode.view).center - var animate = true - if startContainerPosition.y < -tileHeight || startContainerPosition.y > containerNode.frame.height + tileHeight { - animate = false - } - startContainerPosition = startContainerPosition.offsetBy(dx: 0.0, dy: 9.0) - - if animate { - sourceNode.avatarNode.alpha = 0.0 - sourceNode.audioLevelView?.alpha = 0.0 - - let initialPosition = self.contextSourceNode.position - let targetContainerPosition = self.contextSourceNode.view.convert(self.contextSourceNode.bounds, to: containerNode.view).center - - self.contextSourceNode.position = targetContainerPosition - containerNode.addSubnode(self.contextSourceNode) - - self.contextSourceNode.layer.animatePosition(from: startContainerPosition, to: targetContainerPosition, duration: duration, timingFunction: timingFunction, completion: { [weak self, weak sourceNode] _ in - if let strongSelf = self, let sourceNode = sourceNode { - sourceNode.avatarNode.alpha = 1.0 - sourceNode.audioLevelView?.alpha = 1.0 - strongSelf.contextSourceNode.position = initialPosition - strongSelf.containerNode.addSubnode(strongSelf.contextSourceNode) - } - }) - - if item.active { - self.highlightNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - self.highlightNode.layer.animateScale(from: 0.001, to: 1.0, duration: 0.2, timingFunction: timingFunction) - } - - self.avatarNode.layer.animateScale(from: 0.8, to: 1.0, duration: duration, timingFunction: timingFunction) - - self.backgroundImageNode.layer.animateScale(from: 0.001, to: 1.0, duration: duration, timingFunction: timingFunction) - self.backgroundImageNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration, timingFunction: timingFunction) - self.contentWrapperNode.layer.animateScale(from: 0.001, to: 1.0, duration: duration, timingFunction: timingFunction) - self.contentWrapperNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration, timingFunction: timingFunction) - } - } else { - if transition.isAnimated { - self.contextSourceNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration, timingFunction: timingFunction) - self.contextSourceNode.layer.animateScale(from: 0.0, to: 1.0, duration: duration, timingFunction: timingFunction) - } + videoNode.updateLayout(size: videoSize, layoutMode: .fillOrFitToSquare, transition: .immediate) + videoNode.frame = CGRect(origin: CGPoint(), size: videoSize) } } + private func updateIsExtracted(_ isExtracted: Bool, transition: ContainedViewLayoutTransition) { guard self.isExtracted != isExtracted, let extractedRect = self.extractedRect, let nonExtractedRect = self.nonExtractedRect, let item = self.item else { return } self.isExtracted = isExtracted - if isExtracted { - let profileNode = VoiceChatPeerProfileNode(context: item.context, size: extractedRect.size, peer: item.peer, text: item.text, customNode: self.videoContainerNode, additionalEntry: .single(nil), requestDismiss: { [weak self] in - self?.contextSourceNode.requestDismiss?() - }) - profileNode.frame = CGRect(origin: CGPoint(), size: extractedRect.size) - self.profileNode = profileNode - self.contextSourceNode.contentNode.addSubnode(profileNode) + if item.peer.smallProfileImage != nil { + if isExtracted { + let profileNode = VoiceChatPeerProfileNode(context: item.context, size: extractedRect.size, peer: item.peer, text: item.text, customNode: self.videoContainerNode, additionalEntry: .single(nil), requestDismiss: { [weak self] in + self?.contextSourceNode.requestDismiss?() + }) + profileNode.frame = CGRect(origin: CGPoint(), size: extractedRect.size) + self.profileNode = profileNode + self.contextSourceNode.contentNode.addSubnode(profileNode) - profileNode.animateIn(from: self, targetRect: extractedRect, transition: transition) - - self.contextSourceNode.contentNode.customHitTest = { [weak self] point in - if let strongSelf = self, let profileNode = strongSelf.profileNode { - if profileNode.avatarListWrapperNode.frame.contains(point) { - return profileNode.avatarListNode.view + profileNode.animateIn(from: self, targetRect: extractedRect, transition: transition) + + self.contextSourceNode.contentNode.customHitTest = { [weak self] point in + if let strongSelf = self, let profileNode = strongSelf.profileNode { + if profileNode.avatarListWrapperNode.frame.contains(point) { + return profileNode.avatarListNode.view + } } + return nil } - return nil + self.highlightNode.isHidden = true + } else if let profileNode = self.profileNode { + self.profileNode = nil + profileNode.animateOut(to: self, targetRect: nonExtractedRect, transition: transition) + + self.contextSourceNode.contentNode.customHitTest = nil + self.highlightNode.isHidden = !item.active } - } else if let profileNode = self.profileNode { - self.profileNode = nil - profileNode.animateOut(to: self, targetRect: nonExtractedRect, transition: transition) - - self.contextSourceNode.contentNode.customHitTest = nil } } @@ -452,14 +372,19 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { let makeStatusLayout = self.statusNode.asyncLayout() let currentItem = self.layoutParams?.0 - let hasVideo = self.videoNode != nil + var hasVideo = self.videoNode != nil return { item, params, first, last in let titleFont = Font.semibold(13.0) var titleAttributedString: NSAttributedString? + if !hasVideo && item.videoEndpointId != nil { + hasVideo = true + } + let active = item.active && !item.showVideoWhenActive + var titleColor = item.presentationData.theme.list.itemPrimaryTextColor - if !hasVideo || item.active { + if !hasVideo || active { switch item.textColor { case .generic: titleColor = item.presentationData.theme.list.itemPrimaryTextColor @@ -570,13 +495,23 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { apperanceTransition.updateAlpha(layer: audioLevelView.layer, alpha: 1.0) } } else { - currentVideoNode.removeFromSupernode() + if currentItem?.peer.id == item.peer.id { + currentVideoNode.layer.animateScale(from: 1.0, to: 0.0, duration: appearanceDuration, completion: { [weak self, weak currentVideoNode] _ in + if currentVideoNode !== self?.videoNode { + currentVideoNode?.removeFromSupernode() + } + }) + } else { + currentVideoNode.removeFromSupernode() + } } } let videoNodeUpdated = strongSelf.videoNode !== videoNode strongSelf.videoNode = videoNode + videoNode?.updateIsBlurred(isBlurred: item.isPaused, light: true) + let nonExtractedRect: CGRect let avatarFrame: CGRect let titleFrame: CGRect @@ -594,7 +529,10 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { titleFrame = CGRect(origin: CGPoint(x: 8.0, y: 63.0), size: titleLayout.size) let extractedWidth = availableWidth - let extractedRect = CGRect(x: 0.0, y: 0.0, width: extractedWidth, height: extractedWidth + statusLayout.height + 39.0) + var extractedRect = CGRect(x: 0.0, y: 0.0, width: extractedWidth, height: extractedWidth + statusLayout.height + 39.0) + if item.peer.smallProfileImage == nil { + extractedRect = nonExtractedRect + } strongSelf.extractedRect = extractedRect strongSelf.nonExtractedRect = nonExtractedRect @@ -706,7 +644,7 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { strongSelf.audioLevelView = audioLevelView strongSelf.offsetContainerNode.view.insertSubview(audioLevelView, at: 0) - if let item = strongSelf.item, strongSelf.videoNode != nil && !item.active { + if let item = strongSelf.item, strongSelf.videoNode != nil && !active { audioLevelView.alpha = 0.0 } } @@ -777,7 +715,7 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { nodeToAnimateIn = animationNode } var color = color - if (hasVideo && !item.active) || color.rgb == 0x979797 { + if (hasVideo && !active) || color.rgb == 0x979797 { color = UIColor(rgb: 0xffffff) } animationNode.update(state: VoiceChatMicrophoneNode.State(muted: muted, filled: true, color: color), animated: true) @@ -868,16 +806,16 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { strongSelf.videoContainerNode.position = CGPoint(x: tileSize.width / 2.0, y: tileSize.height / 2.0) strongSelf.videoContainerNode.cornerRadius = videoCornerRadius strongSelf.videoContainerNode.transform = CATransform3DMakeScale(videoContainerScale, videoContainerScale, 1.0) - } - strongSelf.highlightNode.isHidden = !item.active + strongSelf.highlightNode.isHidden = !item.active + } let canUpdateAvatarVisibility = !strongSelf.isExtracted && !strongSelf.animatingExtraction if let videoNode = videoNode { if !strongSelf.isExtracted && !strongSelf.animatingExtraction { if currentItem != nil { - if item.active { + if active { if strongSelf.avatarNode.alpha.isZero { strongSelf.animatingSelection = true strongSelf.videoContainerNode.layer.animateScale(from: videoContainerScale, to: 0.001, duration: appearanceDuration) @@ -913,7 +851,7 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { } } } else { - if item.active { + if active { videoNode.alpha = 0.0 if canUpdateAvatarVisibility { strongSelf.avatarNode.alpha = 1.0 @@ -937,19 +875,23 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { } if let _ = currentItem, videoNodeUpdated { - if item.active { + if active { if canUpdateAvatarVisibility { strongSelf.avatarNode.alpha = 1.0 } videoNode.alpha = 0.0 } else { + strongSelf.animatingSelection = true + let previousAvatarNodeAlpha = strongSelf.avatarNode.alpha strongSelf.avatarNode.alpha = 0.0 - strongSelf.avatarNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: appearanceDuration) - videoNode.layer.animateScale(from: 0.01, to: 1.0, duration: appearanceDuration) + strongSelf.avatarNode.layer.animateAlpha(from: previousAvatarNodeAlpha, to: 0.0, duration: appearanceDuration) + videoNode.layer.animateScale(from: 0.01, to: 1.0, duration: appearanceDuration, completion: { [weak self] _ in + self?.animatingSelection = false + }) videoNode.alpha = 1.0 } } else { - if item.active { + if active { if canUpdateAvatarVisibility { strongSelf.avatarNode.alpha = 1.0 } @@ -968,7 +910,6 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode { strongSelf.raiseHandNode?.frame = CGRect(origin: CGPoint(), size: animationSize).insetBy(dx: -6.0, dy: -6.0).offsetBy(dx: -2.0, dy: 0.0) strongSelf.actionButtonNode.transform = CATransform3DMakeScale(animationScale, animationScale, 1.0) -// strongSelf.actionButtonNode.frame = animationFrame transition.updateFrame(node: strongSelf.actionButtonNode, frame: animationFrame) strongSelf.updateIsHighlighted(transition: transition) diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatOptionsButton.swift b/submodules/TelegramCallsUI/Sources/VoiceChatHeaderButton.swift similarity index 88% rename from submodules/TelegramCallsUI/Sources/VoiceChatOptionsButton.swift rename to submodules/TelegramCallsUI/Sources/VoiceChatHeaderButton.swift index d494e4b5e2..92b9af8cb2 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatOptionsButton.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatHeaderButton.swift @@ -17,20 +17,6 @@ func optionsBackgroundImage(dark: Bool) -> UIImage? { })?.stretchableImage(withLeftCapWidth: 14, topCapHeight: 14) } -func optionsButtonImage(dark: Bool) -> UIImage? { - return generateImage(CGSize(width: 28.0, height: 28.0), contextGenerator: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - - context.setFillColor(UIColor(rgb: dark ? 0x1c1c1e : 0x2c2c2e).cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) - - context.setFillColor(UIColor.white.cgColor) - context.fillEllipse(in: CGRect(x: 6.0, y: 12.0, width: 4.0, height: 4.0)) - context.fillEllipse(in: CGRect(x: 12.0, y: 12.0, width: 4.0, height: 4.0)) - context.fillEllipse(in: CGRect(x: 18.0, y: 12.0, width: 4.0, height: 4.0)) - }) -} - func optionsCircleImage(dark: Bool) -> UIImage? { return generateImage(CGSize(width: 28.0, height: 28.0), contextGenerator: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) @@ -40,6 +26,28 @@ func optionsCircleImage(dark: Bool) -> UIImage? { }) } +func panelButtonImage(dark: Bool) -> UIImage? { + return generateImage(CGSize(width: 38.0, height: 28.0), contextGenerator: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + + context.addPath(UIBezierPath(roundedRect: CGRect(origin: CGPoint(), size: size), cornerRadius: 14.0).cgPath) + context.setFillColor(UIColor(rgb: dark ? 0x1c1c1e : 0x2c2c2e).cgColor) + context.fillPath() + + context.setFillColor(UIColor.white.cgColor) + + if let image = UIImage(bundleImageName: "Call/PanelIcon") { + let imageSize = image.size + let imageRect = CGRect(origin: CGPoint(), size: imageSize) + context.saveGState() + context.translateBy(x: 7.0, y: 2.0) + context.clip(to: imageRect, mask: image.cgImage!) + context.fill(imageRect) + context.restoreGState() + } + }) +} + func closeButtonImage(dark: Bool) -> UIImage? { return generateImage(CGSize(width: 28.0, height: 28.0), contextGenerator: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) @@ -76,9 +84,12 @@ final class VoiceChatHeaderButton: HighlightableButtonNode { var contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? - init(context: AccountContext) { + private let wide: Bool + + init(context: AccountContext, wide: Bool = false) { self.context = context self.theme = context.sharedContext.currentPresentationData.with { $0 }.theme + self.wide = wide self.referenceNode = ContextReferenceContentNode() self.containerNode = ContextControllerSourceNode() @@ -111,9 +122,9 @@ final class VoiceChatHeaderButton: HighlightableButtonNode { strongSelf.contextAction?(strongSelf.containerNode, gesture) } - self.iconNode.image = optionsButtonImage(dark: false) + self.iconNode.image = optionsCircleImage(dark: false) - self.containerNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 28.0, height: 28.0)) + self.containerNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: wide ? 38.0 : 28.0, height: 28.0)) self.referenceNode.frame = self.containerNode.bounds self.iconNode.frame = self.containerNode.bounds self.avatarNode.frame = self.containerNode.bounds @@ -182,7 +193,7 @@ final class VoiceChatHeaderButton: HighlightableButtonNode { } override func calculateSizeThatFits(_ constrainedSize: CGSize) -> CGSize { - return CGSize(width: 28.0, height: 28.0) + return CGSize(width: wide ? 38.0 : 28.0, height: 28.0) } func onLayout() { diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatMainStageNode.swift b/submodules/TelegramCallsUI/Sources/VoiceChatMainStageNode.swift index a73b0e35af..1468745aab 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatMainStageNode.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatMainStageNode.swift @@ -29,7 +29,7 @@ private let destructiveColor: UIColor = UIColor(rgb: 0xff3b30) final class VoiceChatMainStageNode: ASDisplayNode { private let context: AccountContext private let call: PresentationGroupCall - private var currentPeer: (PeerId, String?)? + private var currentPeer: (PeerId, String?, Bool, Bool, Bool)? private var currentPeerEntry: VoiceChatPeerEntry? var callState: PresentationGroupCallState? @@ -51,23 +51,29 @@ final class VoiceChatMainStageNode: ASDisplayNode { private let speakingPeerDisposable = MetaDisposable() private let speakingAudioLevelDisposable = MetaDisposable() private var backdropAvatarNode: ImageNode - private var backdropEffectView: UIVisualEffectView? private var avatarNode: ImageNode private let titleNode: ImmediateTextNode private let microphoneNode: VoiceChatMicrophoneNode - + private let placeholderTextNode: ImmediateTextNode + private let placeholderIconNode: ASImageNode + private let placeholderButton: HighlightTrackingButtonNode + private var placeholderButtonEffectView: UIVisualEffectView? + private let placeholderButtonHighlightNode: ASDisplayNode + private let placeholderButtonTextNode: ImmediateTextNode + private let speakingContainerNode: ASDisplayNode private var speakingEffectView: UIVisualEffectView? private let speakingAvatarNode: AvatarNode private let speakingTitleNode: ImmediateTextNode private var speakingAudioLevelView: VoiceBlobView? - private var validLayout: (CGSize, CGFloat, CGFloat, Bool)? + private var validLayout: (CGSize, CGFloat, CGFloat, Bool, Bool)? var tapped: (() -> Void)? var back: (() -> Void)? var togglePin: (() -> Void)? var switchTo: ((PeerId) -> Void)? + var stopScreencast: (() -> Void)? var controlsHidden: ((Bool) -> Void)? @@ -110,6 +116,8 @@ final class VoiceChatMainStageNode: ASDisplayNode { context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: size.height), options: CGGradientDrawingOptions()) }) { self.bottomFadeNode.backgroundColor = UIColor(patternImage: image) + self.bottomFadeNode.view.layer.rasterizationScale = UIScreen.main.scale + self.bottomFadeNode.view.layer.shouldRasterize = true } self.bottomFillNode = ASDisplayNode() @@ -124,19 +132,20 @@ final class VoiceChatMainStageNode: ASDisplayNode { self.backButtonArrowNode.image = NavigationBarTheme.generateBackArrowImage(color: .white) self.backButtonNode = HighlightableButtonNode() + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.pinButtonIconNode = ASImageNode() self.pinButtonIconNode.displayWithoutProcessing = true self.pinButtonIconNode.displaysAsynchronously = false self.pinButtonIconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Call/Pin"), color: .white) self.pinButtonTitleNode = ImmediateTextNode() self.pinButtonTitleNode.isHidden = true - self.pinButtonTitleNode.attributedText = NSAttributedString(string: "Unpin", font: Font.regular(17.0), textColor: .white) + self.pinButtonTitleNode.attributedText = NSAttributedString(string: presentationData.strings.VoiceChat_Unpin, font: Font.regular(17.0), textColor: .white) self.pinButtonNode = HighlightableButtonNode() self.backdropAvatarNode = ImageNode() self.backdropAvatarNode.contentMode = .scaleAspectFill self.backdropAvatarNode.displaysAsynchronously = false - self.backdropAvatarNode.isHidden = true self.audioLevelNode = VoiceChatBlobNode(size: CGSize(width: 300.0, height: 300.0)) @@ -159,34 +168,74 @@ final class VoiceChatMainStageNode: ASDisplayNode { self.speakingTitleNode = ImmediateTextNode() self.speakingTitleNode.displaysAsynchronously = false + self.placeholderTextNode = ImmediateTextNode() + self.placeholderTextNode.alpha = 0.0 + self.placeholderTextNode.maximumNumberOfLines = 2 + self.placeholderTextNode.textAlignment = .center + + self.placeholderIconNode = ASImageNode() + self.placeholderIconNode.alpha = 0.0 + self.placeholderIconNode.contentMode = .scaleAspectFit + self.placeholderIconNode.displaysAsynchronously = false + + self.placeholderButton = HighlightTrackingButtonNode() + self.placeholderButton.alpha = 0.0 + self.placeholderButton.clipsToBounds = true + self.placeholderButton.cornerRadius = backgroundCornerRadius + + self.placeholderButtonHighlightNode = ASDisplayNode() + self.placeholderButtonHighlightNode.alpha = 0.0 + self.placeholderButtonHighlightNode.backgroundColor = UIColor(white: 1.0, alpha: 0.4) + self.placeholderButtonHighlightNode.isUserInteractionEnabled = false + + self.placeholderButtonTextNode = ImmediateTextNode() + self.placeholderButtonTextNode.attributedText = NSAttributedString(string: presentationData.strings.VoiceChat_StopScreenSharingShort, font: Font.semibold(17.0), textColor: .white) + self.placeholderButtonTextNode.isUserInteractionEnabled = false + super.init() self.clipsToBounds = true self.cornerRadius = backgroundCornerRadius self.addSubnode(self.backgroundNode) + self.addSubnode(self.backdropAvatarNode) self.addSubnode(self.topFadeNode) self.addSubnode(self.bottomFadeNode) self.addSubnode(self.bottomFillNode) - self.addSubnode(self.backdropAvatarNode) self.addSubnode(self.audioLevelNode) self.addSubnode(self.avatarNode) self.addSubnode(self.titleNode) self.addSubnode(self.microphoneNode) self.addSubnode(self.headerNode) - self.headerNode.addSubnode(self.backButtonNode) self.headerNode.addSubnode(self.backButtonArrowNode) self.headerNode.addSubnode(self.pinButtonIconNode) self.headerNode.addSubnode(self.pinButtonTitleNode) self.headerNode.addSubnode(self.pinButtonNode) - self.addSubnode(self.speakingContainerNode) + self.addSubnode(self.placeholderIconNode) + self.addSubnode(self.placeholderTextNode) + self.addSubnode(self.placeholderButton) + self.placeholderButton.addSubnode(self.placeholderButtonHighlightNode) + self.placeholderButton.addSubnode(self.placeholderButtonTextNode) + self.placeholderButton.highligthedChanged = { [weak self] highlighted in + if let strongSelf = self { + if highlighted { + strongSelf.placeholderButtonHighlightNode.layer.removeAnimation(forKey: "opacity") + strongSelf.placeholderButtonHighlightNode.alpha = 1.0 + } else { + strongSelf.placeholderButtonHighlightNode.alpha = 0.0 + strongSelf.placeholderButtonHighlightNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2) + } + } + } + self.placeholderButton.addTarget(self, action: #selector(self.stopSharingPressed), forControlEvents: .touchUpInside) + + self.addSubnode(self.speakingContainerNode) self.speakingContainerNode.addSubnode(self.speakingAvatarNode) self.speakingContainerNode.addSubnode(self.speakingTitleNode) - let presentationData = context.sharedContext.currentPresentationData.with { $0 } self.backButtonNode.setTitle(presentationData.strings.Common_Back, with: Font.regular(17.0), with: .white, for: []) self.backButtonNode.hitTestSlop = UIEdgeInsets(top: -8.0, left: -20.0, bottom: -8.0, right: -8.0) self.backButtonNode.highligthedChanged = { [weak self] highlighted in @@ -248,19 +297,12 @@ final class VoiceChatMainStageNode: ASDisplayNode { self.speakingContainerNode.view.insertSubview(speakingEffectView, at: 0) self.speakingEffectView = speakingEffectView - let effect: UIVisualEffect - if #available(iOS 13.0, *) { - effect = UIBlurEffect(style: .systemMaterialDark) - } else { - effect = UIBlurEffect(style: .dark) - } - let backdropEffectView = UIVisualEffectView(effect: effect) - backdropEffectView.isHidden = true - self.view.insertSubview(backdropEffectView, aboveSubview: self.backdropAvatarNode.view) - self.backdropEffectView = backdropEffectView + let placeholderButtonEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) + placeholderButtonEffectView.isUserInteractionEnabled = false + self.placeholderButton.view.insertSubview(placeholderButtonEffectView, at: 0) + self.placeholderButtonEffectView = placeholderButtonEffectView self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap))) - self.speakingContainerNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.speakingTap))) } @@ -283,6 +325,10 @@ final class VoiceChatMainStageNode: ASDisplayNode { self.togglePin?() } + @objc private func stopSharingPressed() { + self.stopScreencast?() + } + var animating: Bool { return self.animatingIn || self.animatingOut } @@ -291,7 +337,7 @@ final class VoiceChatMainStageNode: ASDisplayNode { private var appeared = false func animateTransitionIn(from sourceNode: ASDisplayNode, transition: ContainedViewLayoutTransition, completion: @escaping () -> Void) { - guard let sourceNode = sourceNode as? VoiceChatTileItemNode, let _ = sourceNode.item, let (_, sideInset, bottomInset, isLandscape) = self.validLayout else { + guard let sourceNode = sourceNode as? VoiceChatTileItemNode, let _ = sourceNode.item, let (_, sideInset, bottomInset, isLandscape, isTablet) = self.validLayout else { return } self.appeared = true @@ -301,6 +347,8 @@ final class VoiceChatMainStageNode: ASDisplayNode { self.titleNode.alpha = 0.0 self.microphoneNode.alpha = 0.0 self.headerNode.alpha = 0.0 + + let hasPlaceholder = !self.placeholderIconNode.alpha.isZero let alphaTransition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .easeInOut) alphaTransition.updateAlpha(node: self.backgroundNode, alpha: 1.0) @@ -308,6 +356,16 @@ final class VoiceChatMainStageNode: ASDisplayNode { alphaTransition.updateAlpha(node: self.titleNode, alpha: 1.0) alphaTransition.updateAlpha(node: self.microphoneNode, alpha: 1.0) alphaTransition.updateAlpha(node: self.headerNode, alpha: 1.0) + if hasPlaceholder { + self.placeholderIconNode.alpha = 0.0 + self.placeholderTextNode.alpha = 0.0 + alphaTransition.updateAlpha(node: self.placeholderTextNode, alpha: 1.0) + + if !self.placeholderButton.alpha.isZero { + self.placeholderButton.alpha = 0.0 + alphaTransition.updateAlpha(node: self.placeholderButton, alpha: 1.0) + } + } let targetFrame = self.frame @@ -321,26 +379,47 @@ final class VoiceChatMainStageNode: ASDisplayNode { infoFrame.origin.y = targetFrame.height - infoFrame.height - (sideInset.isZero ? bottomInset : 14.0) transition.updateFrame(view: snapshotView, frame: infoFrame) } - + self.animatingIn = true let startLocalFrame = sourceNode.view.convert(sourceNode.bounds, to: self.supernode?.view) - self.update(size: startLocalFrame.size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, force: true, transition: .immediate) + self.update(size: startLocalFrame.size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, force: true, transition: .immediate) self.frame = startLocalFrame - self.update(size: targetFrame.size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, force: true, transition: transition) + self.update(size: targetFrame.size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, force: true, transition: transition) transition.updateFrame(node: self, frame: targetFrame, completion: { [weak self] _ in sourceNode.alpha = 1.0 self?.animatingIn = false completion() }) + + if hasPlaceholder, let iconSnapshotView = sourceNode.placeholderIconNode.view.snapshotView(afterScreenUpdates: false), let textSnapshotView = sourceNode.placeholderTextNode.view.snapshotView(afterScreenUpdates: false) { + iconSnapshotView.frame = sourceNode.placeholderIconNode.frame + self.view.addSubview(iconSnapshotView) + textSnapshotView.frame = sourceNode.placeholderTextNode.frame + self.view.addSubview(textSnapshotView) + transition.updatePosition(layer: iconSnapshotView.layer, position: self.placeholderIconNode.position, completion: { [weak self, weak iconSnapshotView] _ in + iconSnapshotView?.removeFromSuperview() + self?.placeholderIconNode.alpha = 1.0 + }) + transition.updateTransformScale(layer: iconSnapshotView.layer, scale: 2.0) + textSnapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak textSnapshotView] _ in + textSnapshotView?.removeFromSuperview() + }) + let textPosition = self.placeholderTextNode.position + self.placeholderTextNode.position = textSnapshotView.center + transition.updatePosition(layer: textSnapshotView.layer, position: textPosition) + transition.updatePosition(node: self.placeholderTextNode, position: textPosition) + } } func animateTransitionOut(to targetNode: ASDisplayNode?, offset: CGFloat, transition: ContainedViewLayoutTransition, completion: @escaping () -> Void) { - guard let (_, sideInset, bottomInset, isLandscape) = self.validLayout else { + guard let (_, sideInset, bottomInset, isLandscape, isTablet) = self.validLayout else { return } self.appeared = false + let hasPlaceholder = !self.placeholderIconNode.alpha.isZero + let alphaTransition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .easeInOut) if offset.isZero { alphaTransition.updateAlpha(node: self.backgroundNode, alpha: 0.0) @@ -357,9 +436,38 @@ final class VoiceChatMainStageNode: ASDisplayNode { alphaTransition.updateAlpha(node: self.microphoneNode, alpha: 0.0) alphaTransition.updateAlpha(node: self.headerNode, alpha: 0.0) alphaTransition.updateAlpha(node: self.bottomFadeNode, alpha: 1.0) + if hasPlaceholder { + alphaTransition.updateAlpha(node: self.placeholderTextNode, alpha: 0.0) + if !self.placeholderButton.alpha.isZero { + self.placeholderButton.alpha = 0.0 + self.placeholderButton.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2) + } + } + let originalFrame = self.frame + let initialFrame = originalFrame.offsetBy(dx: 0.0, dy: offset) guard let targetNode = targetNode as? VoiceChatTileItemNode, let _ = targetNode.item else { - completion() + guard let supernode = self.supernode else { + completion() + return + } + self.animatingOut = true + self.frame = initialFrame + if offset < 0.0 { + let targetFrame = CGRect(origin: CGPoint(x: 0.0, y: -originalFrame.size.height), size: originalFrame.size) + transition.updateFrame(node: self, frame: targetFrame, completion: { [weak self] _ in + self?.frame = originalFrame + completion() + self?.animatingOut = false + }) + } else { + let targetFrame = CGRect(origin: CGPoint(x: 0.0, y: supernode.frame.height), size: originalFrame.size) + transition.updateFrame(node: self, frame: targetFrame, completion: { [weak self] _ in + self?.frame = originalFrame + completion() + self?.animatingOut = false + }) + } return } @@ -367,10 +475,8 @@ final class VoiceChatMainStageNode: ASDisplayNode { if offset.isZero { targetNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.1) } - + self.animatingOut = true - let originalFrame = self.frame - let initialFrame = originalFrame.offsetBy(dx: 0.0, dy: offset) let targetFrame = targetNode.view.convert(targetNode.bounds, to: self.supernode?.view) self.currentVideoNode?.keepBackdropSize = true @@ -385,31 +491,66 @@ final class VoiceChatMainStageNode: ASDisplayNode { snapshotView.frame = infoFrame transition.updateFrame(view: snapshotView, frame: CGRect(origin: CGPoint(), size: targetFrame.size)) } - + targetNode.alpha = 0.0 self.frame = initialFrame - self.update(size: targetFrame.size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, force: true, transition: transition) + + let textPosition = self.placeholderTextNode.position + var textTargetPosition = textPosition + var textView: UIView? + if hasPlaceholder, let iconSnapshotView = targetNode.placeholderIconNode.view.snapshotView(afterScreenUpdates: false), let textSnapshotView = targetNode.placeholderTextNode.view.snapshotView(afterScreenUpdates: false) { + self.view.addSubview(iconSnapshotView) + self.view.addSubview(textSnapshotView) + iconSnapshotView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0) + iconSnapshotView.center = self.placeholderIconNode.position + textSnapshotView.center = textPosition + textTargetPosition = targetNode.placeholderTextNode.position + + self.placeholderIconNode.alpha = 0.0 + transition.updatePosition(layer: iconSnapshotView.layer, position: targetNode.placeholderIconNode.position, completion: { [weak self, weak iconSnapshotView] _ in + iconSnapshotView?.removeFromSuperview() + self?.placeholderIconNode.alpha = 1.0 + }) + transition.updateTransformScale(layer: iconSnapshotView.layer, scale: 1.0) + + textView = textSnapshotView + textSnapshotView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, removeOnCompletion: false) + } + + self.update(size: targetFrame.size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, force: true, transition: transition) transition.updateFrame(node: self, frame: targetFrame, completion: { [weak self] _ in if let strongSelf = self { completion() infoView?.removeFromSuperview() + textView?.removeFromSuperview() targetNode.alpha = 1.0 targetNode.highlightNode.layer.animateAlpha(from: 0.0, to: targetNode.highlightNode.alpha, duration: 0.2) strongSelf.animatingOut = false strongSelf.frame = originalFrame - strongSelf.update(size: initialFrame.size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, transition: .immediate) + strongSelf.update(size: initialFrame.size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, transition: .immediate) } }) + if hasPlaceholder { + self.placeholderTextNode.position = textPosition + if let textSnapshotView = textView { + transition.updatePosition(layer: textSnapshotView.layer, position: textTargetPosition) + } + transition.updatePosition(node: self.placeholderTextNode, position: textTargetPosition) + } + self.update(speakingPeerId: nil) } private var effectiveSpeakingPeerId: PeerId? private func updateSpeakingPeer() { + guard let (_, _, _, _, isTablet) = self.validLayout else { + return + } var effectiveSpeakingPeerId = self.speakingPeerId - if let peerId = effectiveSpeakingPeerId, self.visiblePeerIds.contains(peerId) || self.currentPeer?.0 == peerId || self.callState?.myPeerId == peerId { + if let peerId = effectiveSpeakingPeerId, self.visiblePeerIds.contains(peerId) || self.currentPeer?.0 == peerId || self.callState?.myPeerId == peerId || isTablet { effectiveSpeakingPeerId = nil } guard self.effectiveSpeakingPeerId != effectiveSpeakingPeerId else { @@ -439,8 +580,8 @@ final class VoiceChatMainStageNode: ASDisplayNode { strongSelf.speakingContainerNode.alpha = 0.0 - if let (size, sideInset, bottomInset, isLandscape) = strongSelf.validLayout { - strongSelf.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, transition: .immediate) + if let (size, sideInset, bottomInset, isLandscape, isTablet) = strongSelf.validLayout { + strongSelf.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, transition: .immediate) } strongSelf.speakingContainerNode.alpha = 1.0 @@ -521,11 +662,11 @@ final class VoiceChatMainStageNode: ASDisplayNode { func update(peerEntry: VoiceChatPeerEntry, pinned: Bool) { let previousPeerEntry = self.currentPeerEntry self.currentPeerEntry = peerEntry - + let peer = peerEntry.peer let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } if !arePeersEqual(previousPeerEntry?.peer, peerEntry.peer) { - self.backdropAvatarNode.setSignal(peerAvatarCompleteImage(account: self.context.account, peer: peer, size: CGSize(width: 180.0, height: 180.0), round: false, font: avatarPlaceholderFont(size: 78.0), drawLetters: false)) + self.backdropAvatarNode.setSignal(peerAvatarCompleteImage(account: self.context.account, peer: peer, size: CGSize(width: 180.0, height: 180.0), round: false, font: avatarPlaceholderFont(size: 78.0), drawLetters: false, blurred: true)) self.avatarNode.setSignal(peerAvatarCompleteImage(account: self.context.account, peer: peer, size: CGSize(width: 180.0, height: 180.0), font: avatarPlaceholderFont(size: 78.0), fullSize: true)) } @@ -573,8 +714,8 @@ final class VoiceChatMainStageNode: ASDisplayNode { titleAttributedString = updatedString } self.titleNode.attributedText = titleAttributedString - if let (size, sideInset, bottomInset, isLandscape) = self.validLayout { - self.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, transition: .immediate) + if let (size, sideInset, bottomInset, isLandscape, isTablet) = self.validLayout { + self.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, transition: .immediate) } self.pinButtonTitleNode.isHidden = !pinned @@ -617,15 +758,16 @@ final class VoiceChatMainStageNode: ASDisplayNode { } private func setAvatarHidden(_ hidden: Bool) { - self.backdropAvatarNode.isHidden = hidden - self.backdropEffectView?.isHidden = hidden + self.topFadeNode.isHidden = !hidden + self.bottomFadeNode.isHidden = !hidden + self.bottomFillNode.isHidden = !hidden self.avatarNode.isHidden = hidden self.audioLevelNode.isHidden = hidden } - func update(peer: (peer: PeerId, endpointId: String?)?, waitForFullSize: Bool, completion: (() -> Void)? = nil) { + func update(peer: (peer: PeerId, endpointId: String?, isMyPeer: Bool, isPresentation: Bool, isPaused: Bool)?, isReady: Bool = true, waitForFullSize: Bool, completion: (() -> Void)? = nil) { let previousPeer = self.currentPeer - if previousPeer?.0 == peer?.0 && previousPeer?.1 == peer?.1 { + if previousPeer?.0 == peer?.0 && previousPeer?.1 == peer?.1 && previousPeer?.2 == peer?.2 && previousPeer?.3 == peer?.3 && previousPeer?.4 == peer?.4 { completion?() return } @@ -633,24 +775,50 @@ final class VoiceChatMainStageNode: ASDisplayNode { self.updateSpeakingPeer() - if let (_, endpointId) = peer { + var isTablet = false + if let (_, _, _, _, isTabletValue) = self.validLayout { + isTablet = isTabletValue + } + + if let (_, endpointId, isMyPeer, isPresentation, isPaused) = peer { + let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } + + var showPlaceholder = false + if isMyPeer && isPresentation { + self.placeholderTextNode.attributedText = NSAttributedString(string: presentationData.strings.VoiceChat_YouAreSharingScreen, font: Font.semibold(15.0), textColor: .white) + self.placeholderIconNode.image = generateTintedImage(image: UIImage(bundleImageName: isTablet ? "Call/ScreenShareTablet" : "Call/ScreenSharePhone"), color: .white) + showPlaceholder = true + } else if isPaused { + self.placeholderTextNode.attributedText = NSAttributedString(string: presentationData.strings.VoiceChat_VideoPaused, font: Font.semibold(14.0), textColor: .white) + self.placeholderIconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Call/Pause"), color: .white) + showPlaceholder = true + } + + let updatePlaceholderVisibility = { + let peerChanged = previousPeer?.0 != peer?.0 + let transition: ContainedViewLayoutTransition = self.appeared && !peerChanged ? .animated(duration: 0.2, curve: .easeInOut) : .immediate + transition.updateAlpha(node: self.placeholderTextNode, alpha: showPlaceholder ? 1.0 : 0.0) + transition.updateAlpha(node: self.placeholderIconNode, alpha: showPlaceholder ? 1.0 : 0.0) + transition.updateAlpha(node: self.placeholderButton, alpha: showPlaceholder && !isPaused ? 1.0 : 0.0) + } + if endpointId != previousPeer?.1 { + updatePlaceholderVisibility() if let endpointId = endpointId { var delayTransition = false - if previousPeer?.0 == peer?.0 && self.appeared { + if previousPeer?.0 == peer?.0 && previousPeer?.1 == nil && self.appeared { delayTransition = true } if !delayTransition { self.setAvatarHidden(true) } - self.call.makeIncomingVideoView(endpointId: endpointId, requestClone: true, completion: { [weak self] videoView, backdropVideoView in Queue.mainQueue().async { guard let strongSelf = self, let videoView = videoView else { return } - let videoNode = GroupVideoNode(videoView: videoView, backdropVideoView: backdropVideoView) + let videoNode = GroupVideoNode(videoView: videoView, backdropVideoView: backdropVideoView, disabledText: presentationData.strings.VoiceChat_VideoPaused) videoNode.tapped = { [weak self] in guard let strongSelf = self else { return @@ -675,12 +843,18 @@ final class VoiceChatMainStageNode: ASDisplayNode { strongSelf.controlsHidden?(false) strongSelf.setControlsHidden(false, animated: true) } + videoNode.updateIsBlurred(isBlurred: isPaused, light: true, animated: false) videoNode.isUserInteractionEnabled = true let previousVideoNode = strongSelf.currentVideoNode strongSelf.currentVideoNode = videoNode - strongSelf.insertSubnode(videoNode, aboveSubnode: strongSelf.backgroundNode) + strongSelf.insertSubnode(videoNode, aboveSubnode: strongSelf.backdropAvatarNode) - if delayTransition { + if !isReady { + videoNode.alpha = 0.0 + strongSelf.topFadeNode.isHidden = true + strongSelf.bottomFadeNode.isHidden = true + strongSelf.bottomFillNode.isHidden = true + } else if delayTransition { videoNode.alpha = 0.0 } if waitForFullSize { @@ -694,17 +868,22 @@ final class VoiceChatMainStageNode: ASDisplayNode { |> take(1) |> deliverOnMainQueue).start(next: { [weak self] _ in Queue.mainQueue().after(0.1) { - if let strongSelf = self { - if let (size, sideInset, bottomInset, isLandscape) = strongSelf.validLayout { - strongSelf.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, transition: .immediate) - } + guard let strongSelf = self else { + return + } + + if let (size, sideInset, bottomInset, isLandscape, isTablet) = strongSelf.validLayout { + strongSelf.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, transition: .immediate) } Queue.mainQueue().after(0.02) { completion?() } - if delayTransition { + if videoNode.alpha.isZero { + strongSelf.topFadeNode.isHidden = true + strongSelf.bottomFadeNode.isHidden = true + strongSelf.bottomFillNode.isHidden = true if let videoNode = strongSelf.currentVideoNode { videoNode.alpha = 1.0 videoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, completion: { [weak self] _ in @@ -726,8 +905,8 @@ final class VoiceChatMainStageNode: ASDisplayNode { } })) } else { - if let (size, sideInset, bottomInset, isLandscape) = strongSelf.validLayout { - strongSelf.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, transition: .immediate) + if let (size, sideInset, bottomInset, isLandscape, isTablet) = strongSelf.validLayout { + strongSelf.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, transition: .immediate) } if let previousVideoNode = previousVideoNode { previousVideoNode.removeFromSupernode() @@ -738,28 +917,55 @@ final class VoiceChatMainStageNode: ASDisplayNode { } }) } else { - self.setAvatarHidden(false) - if self.appeared { - if let currentVideoNode = self.currentVideoNode { - currentVideoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak currentVideoNode] _ in - currentVideoNode?.removeFromSupernode() - }) - } - } else { - if let currentVideoNode = self.currentVideoNode { - currentVideoNode.removeFromSupernode() - self.currentVideoNode = nil - } + if let currentVideoNode = self.currentVideoNode { + currentVideoNode.removeFromSupernode() + self.currentVideoNode = nil } + self.setAvatarHidden(false) completion?() } } else { - if let currentVideoNode = self.currentVideoNode { - currentVideoNode.removeFromSupernode() - self.currentVideoNode = nil - } self.setAvatarHidden(endpointId != nil) - completion?() + if waitForFullSize && !isReady && !isPaused, let videoNode = self.currentVideoNode { + self.videoReadyDisposable.set((videoNode.ready + |> filter { $0 } + |> take(1) + |> deliverOnMainQueue).start(next: { [weak self] _ in + Queue.mainQueue().after(0.1) { + guard let strongSelf = self else { + return + } + + if let (size, sideInset, bottomInset, isLandscape, isTablet) = strongSelf.validLayout { + strongSelf.update(size: size, sideInset: sideInset, bottomInset: bottomInset, isLandscape: isLandscape, isTablet: isTablet, transition: .immediate) + } + + Queue.mainQueue().after(0.02) { + completion?() + } + + updatePlaceholderVisibility() + if videoNode.alpha.isZero { + videoNode.updateIsBlurred(isBlurred: isPaused, light: true, animated: false) + strongSelf.topFadeNode.isHidden = true + strongSelf.bottomFadeNode.isHidden = true + strongSelf.bottomFillNode.isHidden = true + if let videoNode = strongSelf.currentVideoNode { + videoNode.alpha = 1.0 + videoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, completion: { [weak self] _ in + if let strongSelf = self { + strongSelf.setAvatarHidden(true) + } + }) + } + } + } + })) + } else { + updatePlaceholderVisibility() + self.currentVideoNode?.updateIsBlurred(isBlurred: isPaused, light: true, animated: true) + completion?() + } } } else { self.videoReadyDisposable.set(nil) @@ -782,8 +988,8 @@ final class VoiceChatMainStageNode: ASDisplayNode { transition.updateAlpha(node: self.bottomFillNode, alpha: hidden ? 0.0 : 1.0, delay: delay) } - func update(size: CGSize, sideInset: CGFloat, bottomInset: CGFloat, isLandscape: Bool, force: Bool = false, transition: ContainedViewLayoutTransition) { - self.validLayout = (size, sideInset, bottomInset, isLandscape) + func update(size: CGSize, sideInset: CGFloat, bottomInset: CGFloat, isLandscape: Bool, isTablet: Bool, force: Bool = false, transition: ContainedViewLayoutTransition) { + self.validLayout = (size, sideInset, bottomInset, isLandscape, isTablet) if self.animating && !force { return @@ -813,9 +1019,6 @@ final class VoiceChatMainStageNode: ASDisplayNode { transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size)) transition.updateFrame(node: self.backdropAvatarNode, frame: CGRect(origin: CGPoint(), size: size)) - if let backdropEffectView = self.backdropEffectView { - transition.updateFrame(view: backdropEffectView, frame: CGRect(origin: CGPoint(), size: size)) - } let avatarSize = CGSize(width: 180.0, height: 180.0) let avatarFrame = CGRect(origin: CGPoint(x: (size.width - avatarSize.width) / 2.0, y: (size.height - avatarSize.height) / 2.0), size: avatarSize) @@ -823,7 +1026,7 @@ final class VoiceChatMainStageNode: ASDisplayNode { transition.updateFrame(node: self.audioLevelNode, frame: avatarFrame.insetBy(dx: -60.0, dy: -60.0)) let animationSize = CGSize(width: 36.0, height: 36.0) - let titleSize = self.titleNode.updateLayout(size) + let titleSize = self.titleNode.updateLayout(CGSize(width: size.width - sideInset * 2.0 - 24.0 - animationSize.width, height: size.height)) transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: sideInset + 12.0 + animationSize.width, y: size.height - bottomInset - titleSize.height - 16.0), size: titleSize)) transition.updateFrame(node: self.microphoneNode, frame: CGRect(origin: CGPoint(x: sideInset + 7.0, y: size.height - bottomInset - animationSize.height - 6.0), size: animationSize)) @@ -860,6 +1063,23 @@ final class VoiceChatMainStageNode: ASDisplayNode { self.speakingAvatarNode.frame = CGRect(origin: CGPoint(x: 4.0, y: 4.0), size: speakingAvatarSize) self.speakingTitleNode.frame = CGRect(origin: CGPoint(x: 4.0 + speakingAvatarSize.width + 14.0, y: floorToScreenPixels((38.0 - speakingTitleSize.height) / 2.0)), size: speakingTitleSize) transition.updateFrame(node: self.speakingContainerNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - speakingContainerSize.width) / 2.0), y: 46.0), size: speakingContainerSize)) + + let placeholderTextSize = self.placeholderTextNode.updateLayout(CGSize(width: size.width - 100.0, height: 100.0)) + transition.updateFrame(node: self.placeholderTextNode, frame: CGRect(origin: CGPoint(x: floor((size.width - placeholderTextSize.width) / 2.0), y: floorToScreenPixels(size.height / 2.0) + 10.0), size: placeholderTextSize)) + if let imageSize = self.placeholderIconNode.image?.size { + transition.updateFrame(node: self.placeholderIconNode, frame: CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: floorToScreenPixels(size.height / 2.0) - imageSize.height - 8.0), size: imageSize)) + } + + let placeholderButtonTextSize = self.placeholderButtonTextNode.updateLayout(CGSize(width: 240.0, height: 100.0)) + let placeholderButtonSize = CGSize(width: placeholderButtonTextSize.width + 60.0, height: 52.0) + transition.updateFrame(node: self.placeholderButton, frame: CGRect(origin: CGPoint(x: floor((size.width - placeholderButtonSize.width) / 2.0), y: floorToScreenPixels(size.height / 2.0) + 10.0 + placeholderTextSize.height + 30.0), size: placeholderButtonSize)) + self.placeholderButtonEffectView?.frame = CGRect(origin: CGPoint(), size: placeholderButtonSize) + self.placeholderButtonHighlightNode.frame = CGRect(origin: CGPoint(), size: placeholderButtonSize) + self.placeholderButtonTextNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((placeholderButtonSize.width - placeholderButtonTextSize.width) / 2.0), y: floorToScreenPixels((placeholderButtonSize.height - placeholderButtonTextSize.height) / 2.0)), size: placeholderButtonTextSize) + + if let imageSize = self.placeholderIconNode.image?.size { + transition.updateFrame(node: self.placeholderIconNode, frame: CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: floorToScreenPixels(size.height / 2.0) - imageSize.height - 8.0), size: imageSize)) + } } func flipVideoIfNeeded() { diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatPeerProfileNode.swift b/submodules/TelegramCallsUI/Sources/VoiceChatPeerProfileNode.swift index 97f2a2ff05..08fc3989fe 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatPeerProfileNode.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatPeerProfileNode.swift @@ -210,7 +210,7 @@ final class VoiceChatPeerProfileNode: ASDisplayNode { transition.updateCornerRadius(node: self.backgroundImageNode, cornerRadius: 0.0) - let initialRect = sourceNode.frame + let initialRect = sourceRect let initialScale: CGFloat = sourceRect.width / targetRect.width let targetSize = CGSize(width: targetRect.size.width, height: targetRect.size.width) @@ -254,6 +254,7 @@ final class VoiceChatPeerProfileNode: ASDisplayNode { self.avatarListWrapperNode.layer.animateSpring(from: initialScale as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: springDuration, initialVelocity: 0.0, damping: springDamping) self.avatarListWrapperNode.layer.animateSpring(from: NSValue(cgPoint: initialRect.center), to: NSValue(cgPoint: self.avatarListWrapperNode.position), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, completion: { [weak self] _ in if let strongSelf = self { + strongSelf.avatarListNode.updateCustomItemsOnlySynchronously = false strongSelf.avatarListNode.currentItemNode?.addSubnode(sourceNode.videoContainerNode) } }) @@ -268,6 +269,7 @@ final class VoiceChatPeerProfileNode: ASDisplayNode { self.avatarListNode.stripContainerNode.frame = CGRect(x: 0.0, y: 13.0, width: targetRect.width, height: 2.0) self.avatarListNode.shadowNode.frame = CGRect(x: 0.0, y: 0.0, width: targetRect.width, height: 44.0) + self.avatarListNode.updateCustomItemsOnlySynchronously = true self.avatarListNode.update(size: targetSize, peer: self.peer, customNode: self.customNode, additionalEntry: self.additionalEntry, isExpanded: true, transition: .immediate) let backgroundTargetRect = CGRect(x: 0.0, y: targetSize.height - backgroundCornerRadius * 2.0, width: targetRect.width, height: targetRect.height - targetSize.height + backgroundCornerRadius * 2.0) @@ -334,6 +336,7 @@ final class VoiceChatPeerProfileNode: ASDisplayNode { self.avatarListWrapperNode.layer.animateSpring(from: initialScale as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: springDuration, initialVelocity: 0.0, damping: springDamping) self.avatarListWrapperNode.layer.animateSpring(from: NSValue(cgPoint: initialRect.center), to: NSValue(cgPoint: self.avatarListWrapperNode.position), keyPath: "position", duration: springDuration, initialVelocity: 0.0, damping: springDamping, completion: { [weak self] _ in if let strongSelf = self { + strongSelf.avatarListNode.updateCustomItemsOnlySynchronously = false // strongSelf.avatarListNode.currentItemNode?.addSubnode(sourceNode.videoContainerNode) } }) @@ -348,6 +351,7 @@ final class VoiceChatPeerProfileNode: ASDisplayNode { self.avatarListNode.stripContainerNode.frame = CGRect(x: 0.0, y: 13.0, width: targetRect.width, height: 2.0) self.avatarListNode.shadowNode.frame = CGRect(x: 0.0, y: 0.0, width: targetRect.width, height: 44.0) + self.avatarListNode.updateCustomItemsOnlySynchronously = true self.avatarListNode.update(size: targetSize, peer: self.peer, customNode: nil, additionalEntry: self.additionalEntry, isExpanded: true, transition: .immediate) let backgroundTargetRect = CGRect(x: 0.0, y: targetSize.height - backgroundCornerRadius * 2.0, width: targetRect.width, height: targetRect.height - targetSize.height + backgroundCornerRadius * 2.0) @@ -362,7 +366,7 @@ final class VoiceChatPeerProfileNode: ASDisplayNode { self.appeared = true } - func animateOut(to targetNode: ASDisplayNode, targetRect: CGRect, transition: ContainedViewLayoutTransition) { + func animateOut(to targetNode: ASDisplayNode, targetRect: CGRect, transition: ContainedViewLayoutTransition, completion: @escaping () -> Void = {}) { let radiusTransition = ContainedViewLayoutTransition.animated(duration: 0.2, curve: .easeInOut) let springDuration: Double = 0.3 let springDamping: CGFloat = 1000.0 @@ -383,12 +387,13 @@ final class VoiceChatPeerProfileNode: ASDisplayNode { if let targetNode = targetNode { targetNode.contentNode.insertSubnode(targetNode.videoContainerNode, aboveSubnode: targetNode.backgroundNode) } + completion() self?.removeFromSupernode() }) radiusTransition.updateCornerRadius(node: self.avatarListContainerNode, cornerRadius: backgroundCornerRadius) - if let snapshotView = targetNode.infoNode.view.snapshotView(afterScreenUpdates: false) { + if let snapshotView = targetNode.infoNode.view.snapshotView(afterScreenUpdates: true) { self.view.insertSubview(snapshotView, aboveSubview: targetNode.videoContainerNode.view) let snapshotFrame = snapshotView.frame snapshotView.frame = CGRect(origin: CGPoint(x: 0.0, y: initialSize.width - snapshotView.frame.size.height), size: snapshotView.frame.size) @@ -439,6 +444,7 @@ final class VoiceChatPeerProfileNode: ASDisplayNode { if let targetNode = targetNode { targetNode.offsetContainerNode.insertSubnode(targetNode.videoContainerNode, at: 0) } + completion() self?.removeFromSupernode() }) diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatTileGridNode.swift b/submodules/TelegramCallsUI/Sources/VoiceChatTileGridNode.swift index f0124a1d30..721a817651 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatTileGridNode.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatTileGridNode.swift @@ -8,6 +8,12 @@ import AccountContext private let tileSpacing: CGFloat = 4.0 let tileHeight: CGFloat = 180.0 +enum VoiceChatTileLayoutMode { + case pairs + case rows + case grid +} + final class VoiceChatTileGridNode: ASDisplayNode { private let context: AccountContext @@ -17,6 +23,10 @@ final class VoiceChatTileGridNode: ASDisplayNode { private var absoluteLocation: (CGRect, CGSize)? + var tileNodes: [VoiceChatTileItemNode] { + return Array(self.itemNodes.values) + } + init(context: AccountContext) { self.context = context @@ -25,6 +35,14 @@ final class VoiceChatTileGridNode: ASDisplayNode { self.clipsToBounds = true } + var visiblity = true { + didSet { + for (_, tileNode) in self.itemNodes { + tileNode.visiblity = self.visiblity + } + } + } + func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { self.absoluteLocation = (rect, containerSize) for itemNode in self.itemNodes.values { @@ -35,32 +53,68 @@ final class VoiceChatTileGridNode: ASDisplayNode { } } - func update(size: CGSize, items: [VoiceChatTileItem], transition: ContainedViewLayoutTransition) -> CGSize { + func update(size: CGSize, layoutMode: VoiceChatTileLayoutMode, items: [VoiceChatTileItem], transition: ContainedViewLayoutTransition) -> CGSize { self.items = items var validIds: [String] = [] - - let halfWidth = floorToScreenPixels((size.width - tileSpacing) / 2.0) - let lastItemIsWide = items.count % 2 != 0 + + let colsCount: CGFloat + if case .grid = layoutMode { + if items.count < 3 { + colsCount = 1 + } else if items.count < 5 { + colsCount = 2 + } else { + colsCount = 3 + } + } else { + colsCount = 2 + } + let rowsCount = ceil(CGFloat(items.count) / colsCount) + + let genericItemWidth = floorToScreenPixels((size.width - tileSpacing * (colsCount - 1)) / colsCount) + let lastRowItemsAreWide: Bool + let lastRowItemWidth: CGFloat + if case .grid = layoutMode { + lastRowItemsAreWide = [1, 2].contains(items.count) || items.count % Int(colsCount) != 0 + var lastRowItemsCount = CGFloat(items.count % Int(colsCount)) + if lastRowItemsCount.isZero { + lastRowItemsCount = colsCount + } + lastRowItemWidth = floorToScreenPixels((size.width - tileSpacing * (lastRowItemsCount - 1)) / lastRowItemsCount) + } else { + lastRowItemsAreWide = items.count == 1 || items.count % Int(colsCount) != 0 + lastRowItemWidth = size.width + } let isFirstTime = self.isFirstTime if isFirstTime { self.isFirstTime = false } - let availableWidth = min(size.width, size.height) + var availableWidth = min(size.width, size.height) + var itemHeight = tileHeight + if case .grid = layoutMode { + itemHeight = size.height / rowsCount - (tileSpacing * (rowsCount - 1)) + } for i in 0 ..< self.items.count { let item = self.items[i] - let isLast = i == self.items.count - 1 + let col = CGFloat(i % Int(colsCount)) + let row = floor(CGFloat(i) / colsCount) + let isLastRow = row == (rowsCount - 1) + let rowItemWidth = isLastRow && lastRowItemsAreWide ? lastRowItemWidth : genericItemWidth let itemSize = CGSize( - width: isLast && lastItemIsWide ? size.width : halfWidth, - height: tileHeight + width: rowItemWidth, + height: itemHeight ) - let col = CGFloat(i % 2) - let row = floor(CGFloat(i) / 2.0) - let itemFrame = CGRect(origin: CGPoint(x: col * (halfWidth + tileSpacing), y: row * (tileHeight + tileSpacing)), size: itemSize) + + if case .grid = layoutMode { + availableWidth = rowItemWidth + } + + let itemFrame = CGRect(origin: CGPoint(x: col * (rowItemWidth + tileSpacing), y: row * (itemHeight + tileSpacing)), size: itemSize) validIds.append(item.id) var itemNode: VoiceChatTileItemNode? @@ -77,6 +131,7 @@ final class VoiceChatTileGridNode: ASDisplayNode { self.addSubnode(addedItemNode) } if let itemNode = itemNode { + itemNode.visiblity = self.visiblity if wasAdded { itemNode.frame = itemFrame if !isFirstTime { @@ -112,18 +167,20 @@ final class VoiceChatTileGridNode: ASDisplayNode { } let rowCount = ceil(CGFloat(self.items.count) / 2.0) - return CGSize(width: size.width, height: rowCount * (tileHeight + tileSpacing)) + return CGSize(width: size.width, height: rowCount * (itemHeight + tileSpacing)) } } final class VoiceChatTilesGridItem: ListViewItem { let context: AccountContext let tiles: [VoiceChatTileItem] + let layoutMode: VoiceChatTileLayoutMode let getIsExpanded: () -> Bool - init(context: AccountContext, tiles: [VoiceChatTileItem], getIsExpanded: @escaping () -> Bool) { + init(context: AccountContext, tiles: [VoiceChatTileItem], layoutMode: VoiceChatTileLayoutMode, getIsExpanded: @escaping () -> Bool) { self.context = context self.tiles = tiles + self.layoutMode = layoutMode self.getIsExpanded = getIsExpanded } @@ -227,6 +284,7 @@ final class VoiceChatTilesGridItemNode: ListViewItemNode { strongSelf.cornersNode.image = decorationCornersImage(top: true, bottom: false, dark: item.getIsExpanded()) tileGridNode = VoiceChatTileGridNode(context: item.context) + tileGridNode.visiblity = strongSelf.gridVisiblity strongSelf.addSubnode(tileGridNode) strongSelf.tileGridNode = tileGridNode } @@ -237,7 +295,7 @@ final class VoiceChatTilesGridItemNode: ListViewItemNode { } let transition: ContainedViewLayoutTransition = currentItem == nil ? .immediate : .animated(duration: 0.3, curve: .easeInOut) - let tileGridSize = tileGridNode.update(size: CGSize(width: params.width - params.leftInset - params.rightInset, height: params.availableHeight), items: item.tiles, transition: transition) + let tileGridSize = tileGridNode.update(size: CGSize(width: params.width - params.leftInset - params.rightInset, height: params.availableHeight), layoutMode: item.layoutMode, items: item.tiles, transition: transition) if currentItem == nil { tileGridNode.frame = CGRect(x: params.leftInset, y: 0.0, width: tileGridSize.width, height: tileGridSize.height) strongSelf.backgroundNode.frame = tileGridNode.frame @@ -256,4 +314,16 @@ final class VoiceChatTilesGridItemNode: ListViewItemNode { self.absoluteLocation = (rect, containerSize) self.tileGridNode?.updateAbsoluteRect(rect, within: containerSize) } + + var gridVisiblity: Bool = true { + didSet { + self.tileGridNode?.visiblity = self.gridVisiblity + } + } + + func snapshotForDismissal() { + if let snapshotView = self.tileGridNode?.view.snapshotView(afterScreenUpdates: false) { + self.tileGridNode?.view.addSubview(snapshotView) + } + } } diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatTileItemNode.swift b/submodules/TelegramCallsUI/Sources/VoiceChatTileItemNode.swift index 6512e82482..bd487bffcd 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatTileItemNode.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatTileItemNode.swift @@ -27,32 +27,42 @@ final class VoiceChatTileItem: Equatable { let peer: Peer let videoEndpointId: String let videoReady: Bool + let videoTimeouted: Bool + let isPaused: Bool + let isOwnScreencast: Bool let strings: PresentationStrings let nameDisplayOrder: PresentationPersonNameOrder let icon: Icon let text: VoiceChatParticipantItem.ParticipantText let additionalText: VoiceChatParticipantItem.ParticipantText? let speaking: Bool + let secondary: Bool + let isTablet: Bool let action: () -> Void let contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? - let getVideo: () -> GroupVideoNode? + let getVideo: (GroupVideoNode.Position) -> GroupVideoNode? let getAudioLevel: (() -> Signal)? var id: String { return self.videoEndpointId } - init(account: Account, peer: Peer, videoEndpointId: String, videoReady: Bool, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, speaking: Bool, icon: Icon, text: VoiceChatParticipantItem.ParticipantText, additionalText: VoiceChatParticipantItem.ParticipantText?, action: @escaping () -> Void, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?, getVideo: @escaping () -> GroupVideoNode?, getAudioLevel: (() -> Signal)?) { + init(account: Account, peer: Peer, videoEndpointId: String, videoReady: Bool, videoTimeouted: Bool, isPaused: Bool, isOwnScreencast: Bool, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, speaking: Bool, secondary: Bool, isTablet: Bool, icon: Icon, text: VoiceChatParticipantItem.ParticipantText, additionalText: VoiceChatParticipantItem.ParticipantText?, action: @escaping () -> Void, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)?, getVideo: @escaping (GroupVideoNode.Position) -> GroupVideoNode?, getAudioLevel: (() -> Signal)?) { self.account = account self.peer = peer self.videoEndpointId = videoEndpointId self.videoReady = videoReady + self.videoTimeouted = videoTimeouted + self.isPaused = isPaused + self.isOwnScreencast = isOwnScreencast self.strings = strings self.nameDisplayOrder = nameDisplayOrder self.icon = icon self.text = text self.additionalText = additionalText self.speaking = speaking + self.secondary = secondary + self.isTablet = isTablet self.action = action self.contextAction = contextAction self.getVideo = getVideo @@ -69,6 +79,15 @@ final class VoiceChatTileItem: Equatable { if lhs.videoReady != rhs.videoReady { return false } + if lhs.videoTimeouted != rhs.videoTimeouted { + return false + } + if lhs.isPaused != rhs.isPaused { + return false + } + if lhs.isOwnScreencast != rhs.isOwnScreencast { + return false + } if lhs.icon != rhs.icon { return false } @@ -81,6 +100,9 @@ final class VoiceChatTileItem: Equatable { if lhs.speaking != rhs.speaking { return false } + if lhs.secondary != rhs.secondary { + return false + } if lhs.icon != rhs.icon { return false } @@ -121,6 +143,9 @@ final class VoiceChatTileItemNode: ASDisplayNode { var highlightNode: VoiceChatTileHighlightNode private let statusNode: VoiceChatParticipantStatusNode + let placeholderTextNode: ImmediateTextNode + let placeholderIconNode: ASImageNode + private var profileNode: VoiceChatPeerProfileNode? private var extractedRect: CGRect? private var nonExtractedRect: CGRect? @@ -164,9 +189,17 @@ final class VoiceChatTileItemNode: ASDisplayNode { self.highlightNode.alpha = 0.0 self.highlightNode.updateGlowAndGradientAnimations(type: .speaking) - super.init() + self.placeholderTextNode = ImmediateTextNode() + self.placeholderTextNode.alpha = 0.0 + self.placeholderTextNode.maximumNumberOfLines = 2 + self.placeholderTextNode.textAlignment = .center - self.clipsToBounds = true + self.placeholderIconNode = ASImageNode() + self.placeholderIconNode.alpha = 0.0 + self.placeholderIconNode.contentMode = .scaleAspectFit + self.placeholderIconNode.displaysAsynchronously = false + + super.init() self.containerNode.addSubnode(self.contextSourceNode) self.containerNode.targetNodeForActivationProgress = self.contextSourceNode.contentNode @@ -178,6 +211,8 @@ final class VoiceChatTileItemNode: ASDisplayNode { self.contentNode.addSubnode(self.fadeNode) self.contentNode.addSubnode(self.infoNode) self.infoNode.addSubnode(self.titleNode) + self.contentNode.addSubnode(self.placeholderTextNode) + self.contentNode.addSubnode(self.placeholderIconNode) self.contentNode.addSubnode(self.highlightNode) self.containerNode.shouldBegin = { [weak self] location in @@ -227,15 +262,22 @@ final class VoiceChatTileItemNode: ASDisplayNode { } self.isExtracted = isExtracted + let springDuration: Double = 0.42 + let springDamping: CGFloat = 124.0 if isExtracted { let profileNode = VoiceChatPeerProfileNode(context: self.context, size: extractedRect.size, peer: item.peer, text: item.text, customNode: self.videoContainerNode, additionalEntry: .single(nil), requestDismiss: { [weak self] in self?.contextSourceNode.requestDismiss?() }) - profileNode.frame = CGRect(origin: CGPoint(), size: extractedRect.size) + profileNode.frame = CGRect(origin: CGPoint(), size: self.bounds.size) self.profileNode = profileNode self.contextSourceNode.contentNode.addSubnode(profileNode) profileNode.animateIn(from: self, targetRect: extractedRect, transition: transition) + var appearenceTransition = transition + if transition.isAnimated { + appearenceTransition = .animated(duration: springDuration, curve: .customSpring(damping: springDamping, initialVelocity: 0.0)) + } + appearenceTransition.updateFrame(node: profileNode, frame: extractedRect) self.contextSourceNode.contentNode.customHitTest = { [weak self] point in if let strongSelf = self, let profileNode = strongSelf.profileNode { @@ -245,9 +287,28 @@ final class VoiceChatTileItemNode: ASDisplayNode { } return nil } + + self.backgroundNode.isHidden = true + self.fadeNode.isHidden = true + self.infoNode.isHidden = true + self.highlightNode.isHidden = true } else if let profileNode = self.profileNode { self.profileNode = nil - profileNode.animateOut(to: self, targetRect: nonExtractedRect, transition: transition) + + self.infoNode.isHidden = false + profileNode.animateOut(to: self, targetRect: nonExtractedRect, transition: transition, completion: { [weak self] in + if let strongSelf = self { + strongSelf.backgroundNode.isHidden = false + strongSelf.fadeNode.isHidden = false + strongSelf.highlightNode.isHidden = false + } + }) + + var appearenceTransition = transition + if transition.isAnimated { + appearenceTransition = .animated(duration: 0.2, curve: .easeInOut) + } + appearenceTransition.updateFrame(node: profileNode, frame: nonExtractedRect) self.contextSourceNode.contentNode.customHitTest = nil } @@ -259,8 +320,23 @@ final class VoiceChatTileItemNode: ASDisplayNode { if let shimmerNode = self.shimmerNode { shimmerNode.updateAbsoluteRect(rect, within: containerSize) } - let isVisible = rect.maxY >= 0.0 && rect.minY <= containerSize.height - self.videoNode?.updateIsEnabled(isVisible) + self.updateIsEnabled() + } + + var visiblity = true { + didSet { + self.updateIsEnabled() + } + } + + func updateIsEnabled() { + guard let (rect, containerSize) = self.absoluteLocation else { + return + } + let isVisibleInContainer = rect.maxY >= 0.0 && rect.minY <= containerSize.height + if let videoNode = self.videoNode, videoNode.supernode === self.videoContainerNode { + videoNode.updateIsEnabled(self.visiblity && isVisibleInContainer) + } } func update(size: CGSize, availableWidth: CGFloat, item: VoiceChatTileItem, transition: ContainedViewLayoutTransition) { @@ -270,10 +346,12 @@ final class VoiceChatTileItemNode: ASDisplayNode { self.validLayout = (size, availableWidth) - if !item.videoReady { + if !item.videoReady || item.isOwnScreencast { let shimmerNode: VoiceChatTileShimmeringNode + let shimmerTransition: ContainedViewLayoutTransition if let current = self.shimmerNode { shimmerNode = current + shimmerTransition = transition } else { shimmerNode = VoiceChatTileShimmeringNode(account: item.account, peer: item.peer) self.contentNode.insertSubnode(shimmerNode, aboveSubnode: self.fadeNode) @@ -282,9 +360,10 @@ final class VoiceChatTileItemNode: ASDisplayNode { if let (rect, containerSize) = self.absoluteLocation { shimmerNode.updateAbsoluteRect(rect, within: containerSize) } + shimmerTransition = .immediate } - transition.updateFrame(node: shimmerNode, frame: CGRect(origin: CGPoint(), size: size)) - shimmerNode.update(shimmeringColor: UIColor.white, size: size, transition: transition) + shimmerTransition.updateFrame(node: shimmerNode, frame: CGRect(origin: CGPoint(), size: size)) + shimmerNode.update(shimmeringColor: UIColor.white, shimmering: !item.isOwnScreencast && !item.videoTimeouted && !item.isPaused, size: size, transition: shimmerTransition) } else if let shimmerNode = self.shimmerNode { self.shimmerNode = nil shimmerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak shimmerNode] _ in @@ -292,11 +371,14 @@ final class VoiceChatTileItemNode: ASDisplayNode { }) } + var nodeToAnimateIn: ASDisplayNode? + var placeholderAppeared = false + var itemTransition = transition if self.item != item { let previousItem = self.item self.item = item - + if let getAudioLevel = item.getAudioLevel { self.audioLevelDisposable.set((getAudioLevel() |> deliverOnMainQueue).start(next: { [weak self] value in @@ -316,13 +398,31 @@ final class VoiceChatTileItemNode: ASDisplayNode { current.removeFromSupernode() } - if let videoNode = item.getVideo() { + if let videoNode = item.getVideo(item.secondary ? .list : .tile) { itemTransition = .immediate self.videoNode = videoNode self.videoContainerNode.addSubnode(videoNode) + self.updateIsEnabled() } } + self.videoNode?.updateIsBlurred(isBlurred: item.isPaused, light: true) + + var showPlaceholder = false + if item.isOwnScreencast { + self.placeholderTextNode.attributedText = NSAttributedString(string: item.strings.VoiceChat_YouAreSharingScreen, font: Font.semibold(13.0), textColor: .white) + self.placeholderIconNode.image = generateTintedImage(image: UIImage(bundleImageName: item.isTablet ? "Call/ScreenShareTablet" : "Call/ScreenSharePhone"), color: .white) + showPlaceholder = true + } else if item.isPaused { + self.placeholderTextNode.attributedText = NSAttributedString(string: item.strings.VoiceChat_VideoPaused, font: Font.semibold(13.0), textColor: .white) + self.placeholderIconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Call/Pause"), color: .white) + showPlaceholder = true + } + + placeholderAppeared = self.placeholderTextNode.alpha.isZero && showPlaceholder + transition.updateAlpha(node: self.placeholderTextNode, alpha: showPlaceholder ? 1.0 : 0.0) + transition.updateAlpha(node: self.placeholderIconNode, alpha: showPlaceholder ? 1.0 : 0.0) + let titleFont = Font.semibold(13.0) let titleColor = UIColor.white var titleAttributedString: NSAttributedString? @@ -361,25 +461,8 @@ final class VoiceChatTileItemNode: ASDisplayNode { } self.titleNode.attributedText = titleAttributedString - if case let .microphone(muted) = item.icon { - let animationNode: VoiceChatMicrophoneNode - if let current = self.animationNode { - animationNode = current - } else { - animationNode = VoiceChatMicrophoneNode() - self.animationNode = animationNode - self.infoNode.addSubnode(animationNode) - } - animationNode.alpha = 1.0 - animationNode.update(state: VoiceChatMicrophoneNode.State(muted: muted, filled: true, color: microphoneColor), animated: true) - } else if let animationNode = self.animationNode { - self.animationNode = nil - animationNode.removeFromSupernode() - } - var hadMicrophoneNode = false var hadIconNode = false - var nodeToAnimateIn: ASDisplayNode? if case let .microphone(muted) = item.icon { let animationNode: VoiceChatMicrophoneNode @@ -389,13 +472,18 @@ final class VoiceChatTileItemNode: ASDisplayNode { animationNode = VoiceChatMicrophoneNode() self.animationNode = animationNode self.infoNode.addSubnode(animationNode) + + nodeToAnimateIn = animationNode } animationNode.alpha = 1.0 animationNode.update(state: VoiceChatMicrophoneNode.State(muted: muted, filled: true, color: microphoneColor), animated: true) } else if let animationNode = self.animationNode { hadMicrophoneNode = true self.animationNode = nil - animationNode.removeFromSupernode() + animationNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false) + animationNode.layer.animateScale(from: 1.0, to: 0.001, duration: 0.2, removeOnCompletion: false, completion: { [weak animationNode] _ in + animationNode?.removeFromSupernode() + }) } if case .presentation = item.icon { @@ -449,7 +537,9 @@ final class VoiceChatTileItemNode: ASDisplayNode { if self.videoContainerNode.supernode === self.contentNode { if let videoNode = self.videoNode { itemTransition.updateFrame(node: videoNode, frame: bounds) - videoNode.updateLayout(size: size, layoutMode: .fillOrFitToSquare, transition: itemTransition) + if videoNode.supernode === self.videoContainerNode { + videoNode.updateLayout(size: size, layoutMode: .fillOrFitToSquare, transition: itemTransition) + } } transition.updateFrame(node: self.videoContainerNode, frame: bounds) } @@ -463,6 +553,11 @@ final class VoiceChatTileItemNode: ASDisplayNode { let titleSize = self.titleNode.updateLayout(CGSize(width: size.width - 50.0, height: size.height)) self.titleNode.frame = CGRect(origin: CGPoint(x: 30.0, y: size.height - titleSize.height - 8.0), size: titleSize) + var transition = transition + if nodeToAnimateIn != nil || placeholderAppeared { + transition = .immediate + } + if let iconNode = self.iconNode, let image = iconNode.image { transition.updateFrame(node: iconNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels(16.0 - image.size.width / 2.0), y: floorToScreenPixels(size.height - 15.0 - image.size.height / 2.0)), size: image.size)) } @@ -473,70 +568,40 @@ final class VoiceChatTileItemNode: ASDisplayNode { animationNode.transform = CATransform3DMakeScale(0.66667, 0.66667, 1.0) transition.updatePosition(node: animationNode, position: CGPoint(x: 16.0, y: size.height - 15.0)) } + + let placeholderTextSize = self.placeholderTextNode.updateLayout(CGSize(width: size.width - 30.0, height: 100.0)) + transition.updateFrame(node: self.placeholderTextNode, frame: CGRect(origin: CGPoint(x: floor((size.width - placeholderTextSize.width) / 2.0), y: floorToScreenPixels(size.height / 2.0) + 10.0), size: placeholderTextSize)) + if let image = self.placeholderIconNode.image { + let imageSize = CGSize(width: image.size.width * 0.5, height: image.size.height * 0.5) + transition.updateFrame(node: self.placeholderIconNode, frame: CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: floorToScreenPixels(size.height / 2.0) - imageSize.height - 4.0), size: imageSize)) + } } - func animateTransitionIn(from sourceNode: ASDisplayNode, containerNode: ASDisplayNode, transition: ContainedViewLayoutTransition, animate: Bool = true) { - guard let _ = self.item else { + func transitionIn(from sourceNode: ASDisplayNode?) { + guard let item = self.item else { return } - var duration: Double = 0.2 - var timingFunction: String = CAMediaTimingFunctionName.easeInEaseOut.rawValue - if case let .animated(transitionDuration, curve) = transition { - duration = transitionDuration + 0.05 - timingFunction = curve.timingFunction + var videoNode: GroupVideoNode? + if let sourceNode = sourceNode as? VoiceChatFullscreenParticipantItemNode, let _ = sourceNode.item { + if let sourceVideoNode = sourceNode.videoNode { + sourceNode.videoNode = nil + videoNode = sourceVideoNode + } } - if let sourceNode = sourceNode as? VoiceChatFullscreenParticipantItemNode, let _ = sourceNode.item { - let initialAnimate = animate + if videoNode == nil { + videoNode = item.getVideo(item.secondary ? .list : .tile) + } - var startContainerPosition = sourceNode.view.convert(sourceNode.bounds, to: containerNode.view).center - var animate = initialAnimate -// if startContainerPosition.y > containerNode.frame.height - 238.0 { -// animate = false -// } + if let videoNode = videoNode { + videoNode.alpha = 1.0 + self.videoNode = videoNode + self.videoContainerNode.addSubnode(videoNode) - if let videoNode = sourceNode.videoNode { - sourceNode.videoNode = nil - videoNode.alpha = 1.0 - self.videoNode = videoNode - self.videoContainerNode.addSubnode(videoNode) - } - - if animate { - sourceNode.isHidden = true - Queue.mainQueue().after(0.7) { - sourceNode.isHidden = false - } - - let initialPosition = self.contextSourceNode.position - let targetContainerPosition = self.contextSourceNode.view.convert(self.contextSourceNode.bounds, to: containerNode.view).center - - self.contextSourceNode.position = targetContainerPosition - containerNode.addSubnode(self.contextSourceNode) - - self.contextSourceNode.layer.animateScale(from: 0.467, to: 1.0, duration: duration, timingFunction: timingFunction) - self.contextSourceNode.layer.animatePosition(from: startContainerPosition, to: targetContainerPosition, duration: duration, timingFunction: timingFunction, completion: { [weak self] _ in - if let strongSelf = self { - strongSelf.contextSourceNode.position = initialPosition - strongSelf.containerNode.addSubnode(strongSelf.contextSourceNode) - } - }) - - self.videoNode?.updateLayout(size: self.bounds.size, layoutMode: .fillOrFitToSquare, transition: transition) - self.videoNode?.frame = self.bounds - } else if !initialAnimate { - self.videoNode?.updateLayout(size: self.bounds.size, layoutMode: .fillOrFitToSquare, transition: .immediate) - self.videoNode?.frame = self.bounds - - sourceNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: duration, timingFunction: timingFunction, removeOnCompletion: false, completion: { [weak sourceNode] _ in - sourceNode?.layer.removeAllAnimations() - }) - sourceNode.layer.animateScale(from: 1.0, to: 0.0, duration: duration, timingFunction: timingFunction) - } + videoNode.updateLayout(size: self.bounds.size, layoutMode: .fillOrFitToSquare, transition: .immediate) + videoNode.frame = self.bounds - if transition.isAnimated { - self.fadeNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) - } + self.updateIsEnabled() } } } @@ -822,6 +887,7 @@ private class VoiceChatTileShimmeringNode: ASDisplayNode { private let borderEffectNode: ShimmerEffectForegroundNode private var currentShimmeringColor: UIColor? + private var currentShimmering: Bool? private var currentSize: CGSize? public init(account: Account, peer: Peer) { @@ -844,30 +910,33 @@ private class VoiceChatTileShimmeringNode: ASDisplayNode { self.addSubnode(self.borderNode) self.borderNode.addSubnode(self.borderEffectNode) - self.backgroundNode.setSignal(peerAvatarCompleteImage(account: account, peer: peer, size: CGSize(width: 180.0, height: 180.0), round: false, font: Font.regular(16.0), drawLetters: false, fullSize: false, blurred: true)) + self.backgroundNode.setSignal(peerAvatarCompleteImage(account: account, peer: peer, size: CGSize(width: 250.0, height: 250.0), round: false, font: Font.regular(16.0), drawLetters: false, fullSize: false, blurred: true)) } public override func didLoad() { super.didLoad() - self.effectNode.layer.compositingFilter = "screenBlendMode" - self.borderEffectNode.layer.compositingFilter = "screenBlendMode" - - let borderMaskView = UIView() - borderMaskView.layer.borderWidth = 1.0 - borderMaskView.layer.borderColor = UIColor.white.cgColor - borderMaskView.layer.cornerRadius = backgroundCornerRadius - self.borderMaskView = borderMaskView - - if let size = self.currentSize { - borderMaskView.frame = CGRect(origin: CGPoint(), size: size) + if self.effectNode.supernode != nil { + self.effectNode.layer.compositingFilter = "screenBlendMode" + self.borderEffectNode.layer.compositingFilter = "screenBlendMode" + + let borderMaskView = UIView() + borderMaskView.layer.borderWidth = 1.0 + borderMaskView.layer.borderColor = UIColor.white.cgColor + borderMaskView.layer.cornerRadius = backgroundCornerRadius + self.borderMaskView = borderMaskView + + if let size = self.currentSize { + borderMaskView.frame = CGRect(origin: CGPoint(), size: size) + } + self.borderNode.view.mask = borderMaskView + + if #available(iOS 13.0, *) { + borderMaskView.layer.cornerCurve = .continuous + } } - - self.borderNode.view.mask = borderMaskView - if #available(iOS 13.0, *) { self.layer.cornerCurve = .continuous - borderMaskView.layer.cornerCurve = .continuous } } @@ -876,21 +945,27 @@ private class VoiceChatTileShimmeringNode: ASDisplayNode { self.borderEffectNode.updateAbsoluteRect(rect, within: containerSize) } - public func update(shimmeringColor: UIColor, size: CGSize, transition: ContainedViewLayoutTransition) { - if let currentShimmeringColor = self.currentShimmeringColor, currentShimmeringColor.isEqual(shimmeringColor) && self.currentSize == size { + public func update(shimmeringColor: UIColor, shimmering: Bool, size: CGSize, transition: ContainedViewLayoutTransition) { + if let currentShimmeringColor = self.currentShimmeringColor, currentShimmeringColor.isEqual(shimmeringColor) && self.currentSize == size && self.currentShimmering == shimmering { return } + let firstTime = self.currentShimmering == nil self.currentShimmeringColor = shimmeringColor + self.currentShimmering = shimmering self.currentSize = size + let transition: ContainedViewLayoutTransition = firstTime ? .immediate : (transition.isAnimated ? transition : .animated(duration: 0.45, curve: .easeInOut)) + transition.updateAlpha(node: self.effectNode, alpha: shimmering ? 1.0 : 0.0) + transition.updateAlpha(node: self.borderNode, alpha: shimmering ? 1.0 : 0.0) + let bounds = CGRect(origin: CGPoint(), size: size) self.effectNode.update(foregroundColor: shimmeringColor.withAlphaComponent(0.3)) - self.effectNode.frame = bounds + transition.updateFrame(node: self.effectNode, frame: bounds) self.borderEffectNode.update(foregroundColor: shimmeringColor.withAlphaComponent(0.45)) - self.borderEffectNode.frame = bounds + transition.updateFrame(node: self.borderEffectNode, frame: bounds) transition.updateFrame(node: self.backgroundNode, frame: bounds) transition.updateFrame(node: self.borderNode, frame: bounds) diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatTitleNode.swift b/submodules/TelegramCallsUI/Sources/VoiceChatTitleNode.swift index 5d2569a4d3..7bf78c1574 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatTitleNode.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatTitleNode.swift @@ -3,12 +3,15 @@ import UIKit import AsyncDisplayKit import Display import TelegramPresentationData +import ChatTitleActivityNode + +private let constructiveColor: UIColor = UIColor(rgb: 0x34c759) final class VoiceChatTitleNode: ASDisplayNode { private var theme: PresentationTheme private let titleNode: ASTextNode - private let infoNode: ASTextNode + private let infoNode: ChatTitleActivityNode let recordingIconNode: VoiceChatRecordingIconNode public var isRecording: Bool = false { @@ -28,11 +31,7 @@ final class VoiceChatTitleNode: ASDisplayNode { self.titleNode.truncationMode = .byTruncatingTail self.titleNode.isOpaque = false - self.infoNode = ASTextNode() - self.infoNode.displaysAsynchronously = false - self.infoNode.maximumNumberOfLines = 1 - self.infoNode.truncationMode = .byTruncatingTail - self.infoNode.isOpaque = false + self.infoNode = ChatTitleActivityNode() self.recordingIconNode = VoiceChatRecordingIconNode(hasBackground: false) @@ -65,7 +64,7 @@ final class VoiceChatTitleNode: ASDisplayNode { self.tapped?() } - func update(size: CGSize, title: String, subtitle: String, slide: Bool, transition: ContainedViewLayoutTransition) { + func update(size: CGSize, title: String, subtitle: String, speaking: Bool, slide: Bool, transition: ContainedViewLayoutTransition) { guard !size.width.isZero else { return } @@ -94,11 +93,18 @@ final class VoiceChatTitleNode: ASDisplayNode { } self.titleNode.attributedText = NSAttributedString(string: title, font: Font.medium(17.0), textColor: UIColor(rgb: 0xffffff)) - self.infoNode.attributedText = NSAttributedString(string: subtitle, font: Font.regular(13.0), textColor: UIColor(rgb: 0xffffff, alpha: 0.5)) + + var state = ChatTitleActivityNodeState.none + if speaking { + state = .recordingVoice(NSAttributedString(string: subtitle, font: Font.regular(13.0), textColor: constructiveColor), constructiveColor) + } else { + state = .info(NSAttributedString(string: subtitle, font: Font.regular(13.0), textColor: UIColor(rgb: 0xffffff, alpha: 0.5)), .generic) + } + let _ = self.infoNode.transitionToState(state, animation: .slide) let constrainedSize = CGSize(width: size.width - 140.0, height: size.height) let titleSize = self.titleNode.measure(constrainedSize) - let infoSize = self.infoNode.measure(constrainedSize) + let infoSize = self.infoNode.updateLayout(constrainedSize, offset: 1.0, alignment: .center) let titleInfoSpacing: CGFloat = 0.0 let combinedHeight = titleSize.height + infoSize.height + titleInfoSpacing diff --git a/submodules/TelegramCore/Sources/Account.swift b/submodules/TelegramCore/Sources/Account.swift index 9c39c9e485..d8317e304b 100644 --- a/submodules/TelegramCore/Sources/Account.swift +++ b/submodules/TelegramCore/Sources/Account.swift @@ -1259,9 +1259,9 @@ public func setupAccount(_ account: Account, fetchCachedResourceRepresentation: account.postbox.mediaBox.preFetchedResourcePath = preFetchedResourcePath account.postbox.mediaBox.fetchResource = { [weak account] resource, intervals, parameters -> Signal in if let strongAccount = account { - if let result = fetchResource(account: strongAccount, resource: resource, intervals: intervals, parameters: parameters) { + if let result = strongAccount.auxiliaryMethods.fetchResource(strongAccount, resource, intervals, parameters) { return result - } else if let result = strongAccount.auxiliaryMethods.fetchResource(strongAccount, resource, intervals, parameters) { + } else if let result = fetchResource(account: strongAccount, resource: resource, intervals: intervals, parameters: parameters) { return result } else { return .never() diff --git a/submodules/TelegramCore/Sources/AccountManager.swift b/submodules/TelegramCore/Sources/AccountManager.swift index d4b987894b..e9da18ff19 100644 --- a/submodules/TelegramCore/Sources/AccountManager.swift +++ b/submodules/TelegramCore/Sources/AccountManager.swift @@ -175,6 +175,7 @@ private var declaredEncodables: Void = { declareEncodable(ExportedInvitation.self, f: { ExportedInvitation(decoder: $0) }) declareEncodable(CachedDisplayAsPeers.self, f: { CachedDisplayAsPeers(decoder: $0) }) declareEncodable(WallpapersState.self, f: { WallpapersState(decoder: $0) }) + declareEncodable(WallpaperDataResource.self, f: { WallpaperDataResource(decoder: $0) }) return }() @@ -189,6 +190,24 @@ public func rootPathForBasePath(_ appGroupPath: String) -> String { public func performAppGroupUpgrades(appGroupPath: String, rootPath: String) { let _ = try? FileManager.default.createDirectory(at: URL(fileURLWithPath: rootPath), withIntermediateDirectories: true, attributes: nil) + + if let items = FileManager.default.enumerator(at: URL(fileURLWithPath: appGroupPath), includingPropertiesForKeys: [.isDirectoryKey], options: [.skipsHiddenFiles, .skipsSubdirectoryDescendants], errorHandler: nil) { + let allowedDirectories: [String] = [ + "telegram-data", + "Library" + ] + + for url in items { + guard let url = url as? URL else { + continue + } + if let isDirectory = try? url.resourceValues(forKeys: [.isDirectoryKey]).isDirectory, isDirectory { + if !allowedDirectories.contains(url.lastPathComponent) { + let _ = try? FileManager.default.removeItem(at: url) + } + } + } + } do { var resourceValues = URLResourceValues() diff --git a/submodules/TelegramCore/Sources/ApiUtils/Wallpaper.swift b/submodules/TelegramCore/Sources/ApiUtils/Wallpaper.swift index 179a20ef14..f339182184 100644 --- a/submodules/TelegramCore/Sources/ApiUtils/Wallpaper.swift +++ b/submodules/TelegramCore/Sources/ApiUtils/Wallpaper.swift @@ -77,7 +77,7 @@ extension TelegramWallpaper { //assertionFailure() self = .color(0xffffff) } - case let .wallPaperNoFile(_, settings): + case let .wallPaperNoFile(_, _, settings): if let settings = settings, case let .wallPaperSettings(_, backgroundColor, secondBackgroundColor, thirdBackgroundColor, fourthBackgroundColor, _, rotation) = settings { let colors: [UInt32] = ([backgroundColor, secondBackgroundColor, thirdBackgroundColor, fourthBackgroundColor] as [Int32?]).compactMap({ color -> UInt32? in return color.flatMap(UInt32.init(bitPattern:)) @@ -103,9 +103,9 @@ extension TelegramWallpaper { case let .file(_, _, _, _, _, _, slug, _, settings): return (.inputWallPaperSlug(slug: slug), apiWallpaperSettings(settings)) case let .color(color): - return (.inputWallPaperNoFile, apiWallpaperSettings(WallpaperSettings(colors: [color]))) + return (.inputWallPaperNoFile(id: 0), apiWallpaperSettings(WallpaperSettings(colors: [color]))) case let .gradient(colors, settings): - return (.inputWallPaperNoFile, apiWallpaperSettings(WallpaperSettings(colors: colors, rotation: settings.rotation))) + return (.inputWallPaperNoFile(id: 0), apiWallpaperSettings(WallpaperSettings(colors: colors, rotation: settings.rotation))) default: return nil } diff --git a/submodules/TelegramCore/Sources/GroupCalls.swift b/submodules/TelegramCore/Sources/GroupCalls.swift index 4842b8b4b4..b0c965babe 100644 --- a/submodules/TelegramCore/Sources/GroupCalls.swift +++ b/submodules/TelegramCore/Sources/GroupCalls.swift @@ -142,29 +142,17 @@ public func getCurrentGroupCall(account: Account, callId: Int64, accessHash: Int } else if mutedByYou { muteState = GroupCallParticipantsContext.Participant.MuteState(canUnmute: false, mutedByYou: mutedByYou) } - var videoJsonDescription: String? = nil - var presentationJsonDescription: String? = nil - if let video = video { - switch video { - case let .dataJSON(data): - videoJsonDescription = data - } - } - if let presentation = presentation { - switch presentation { - case let .dataJSON(data): - presentationJsonDescription = data - } - } + var videoDescription = video.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) + var presentationDescription = presentation.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) if muteState?.canUnmute == false { - videoJsonDescription = nil - presentationJsonDescription = nil + videoDescription = nil + presentationDescription = nil } parsedParticipants.append(GroupCallParticipantsContext.Participant( peer: peer, ssrc: ssrc, - videoJsonDescription: videoJsonDescription, - presentationJsonDescription: presentationJsonDescription, + videoDescription: videoDescription, + presentationDescription: presentationDescription, joinTimestamp: date, raiseHandRating: raiseHandRating, hasRaiseHand: raiseHandRating != nil, @@ -471,29 +459,17 @@ public func getGroupCallParticipants(account: Account, callId: Int64, accessHash } else if mutedByYou { muteState = GroupCallParticipantsContext.Participant.MuteState(canUnmute: false, mutedByYou: mutedByYou) } - var videoJsonDescription: String? = nil - var presentationJsonDescription: String? = nil - if let video = video { - switch video { - case let .dataJSON(data): - videoJsonDescription = data - } - } - if let presentation = presentation { - switch presentation { - case let .dataJSON(data): - presentationJsonDescription = data - } - } + var videoDescription = video.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) + var presentationDescription = presentation.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) if muteState?.canUnmute == false { - videoJsonDescription = nil - presentationJsonDescription = nil + videoDescription = nil + presentationDescription = nil } parsedParticipants.append(GroupCallParticipantsContext.Participant( peer: peer, ssrc: ssrc, - videoJsonDescription: videoJsonDescription, - presentationJsonDescription: presentationJsonDescription, + videoDescription: videoDescription, + presentationDescription: presentationDescription, joinTimestamp: date, raiseHandRating: raiseHandRating, hasRaiseHand: raiseHandRating != nil, @@ -735,30 +711,18 @@ public func joinGroupCall(account: Account, peerId: PeerId, joinAs: PeerId?, cal } else if mutedByYou { muteState = GroupCallParticipantsContext.Participant.MuteState(canUnmute: false, mutedByYou: mutedByYou) } - var videoJsonDescription: String? = nil - var presentationJsonDescription: String? = nil - if let video = video { - switch video { - case let .dataJSON(data): - videoJsonDescription = data - } - } - if let presentation = presentation { - switch presentation { - case let .dataJSON(data): - presentationJsonDescription = data - } - } + var videoDescription = video.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) + var presentationDescription = presentation.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) if muteState?.canUnmute == false { - videoJsonDescription = nil - presentationJsonDescription = nil + videoDescription = nil + presentationDescription = nil } if !state.participants.contains(where: { $0.peer.id == peer.id }) { state.participants.append(GroupCallParticipantsContext.Participant( peer: peer, ssrc: ssrc, - videoJsonDescription: videoJsonDescription, - presentationJsonDescription: presentationJsonDescription, + videoDescription: videoDescription, + presentationDescription: presentationDescription, joinTimestamp: date, raiseHandRating: raiseHandRating, hasRaiseHand: raiseHandRating != nil, @@ -960,11 +924,22 @@ public final class GroupCallParticipantsContext { self.mutedByYou = mutedByYou } } + + public struct VideoDescription: Equatable { + public struct SsrcGroup: Equatable { + public var semantics: String + public var ssrcs: [UInt32] + } + + public var endpointId: String + public var ssrcGroups: [SsrcGroup] + public var isPaused: Bool + } public var peer: Peer public var ssrc: UInt32? - public var videoJsonDescription: String? - public var presentationJsonDescription: String? + public var videoDescription: VideoDescription? + public var presentationDescription: VideoDescription? public var joinTimestamp: Int32 public var raiseHandRating: Int64? public var hasRaiseHand: Bool @@ -977,8 +952,8 @@ public final class GroupCallParticipantsContext { public init( peer: Peer, ssrc: UInt32?, - videoJsonDescription: String?, - presentationJsonDescription: String?, + videoDescription: VideoDescription?, + presentationDescription: VideoDescription?, joinTimestamp: Int32, raiseHandRating: Int64?, hasRaiseHand: Bool, @@ -990,8 +965,8 @@ public final class GroupCallParticipantsContext { ) { self.peer = peer self.ssrc = ssrc - self.videoJsonDescription = videoJsonDescription - self.presentationJsonDescription = presentationJsonDescription + self.videoDescription = videoDescription + self.presentationDescription = presentationDescription self.joinTimestamp = joinTimestamp self.raiseHandRating = raiseHandRating self.hasRaiseHand = hasRaiseHand @@ -1020,10 +995,10 @@ public final class GroupCallParticipantsContext { if lhs.ssrc != rhs.ssrc { return false } - if lhs.videoJsonDescription != rhs.videoJsonDescription { + if lhs.videoDescription != rhs.videoDescription { return false } - if lhs.presentationJsonDescription != rhs.presentationJsonDescription { + if lhs.presentationDescription != rhs.presentationDescription { return false } if lhs.joinTimestamp != rhs.joinTimestamp { @@ -1225,8 +1200,8 @@ public final class GroupCallParticipantsContext { public var peerId: PeerId public var ssrc: UInt32? - public var videoJsonDescription: String? - public var presentationJsonDescription: String? + public var videoDescription: GroupCallParticipantsContext.Participant.VideoDescription? + public var presentationDescription: GroupCallParticipantsContext.Participant.VideoDescription? public var joinTimestamp: Int32 public var activityTimestamp: Double? public var raiseHandRating: Int64? @@ -1239,8 +1214,8 @@ public final class GroupCallParticipantsContext { init( peerId: PeerId, ssrc: UInt32?, - videoJsonDescription: String?, - presentationJsonDescription: String?, + videoDescription: GroupCallParticipantsContext.Participant.VideoDescription?, + presentationDescription: GroupCallParticipantsContext.Participant.VideoDescription?, joinTimestamp: Int32, activityTimestamp: Double?, raiseHandRating: Int64?, @@ -1252,8 +1227,8 @@ public final class GroupCallParticipantsContext { ) { self.peerId = peerId self.ssrc = ssrc - self.videoJsonDescription = videoJsonDescription - self.presentationJsonDescription = presentationJsonDescription + self.videoDescription = videoDescription + self.presentationDescription = presentationDescription self.joinTimestamp = joinTimestamp self.activityTimestamp = activityTimestamp self.raiseHandRating = raiseHandRating @@ -1381,6 +1356,9 @@ public final class GroupCallParticipantsContext { private let resetInviteLinksDisposable = MetaDisposable() private let updateShouldBeRecordingDisposable = MetaDisposable() + private var localVideoIsMuted: Bool = true + private var localIsVideoPaused: Bool = true + public struct ServiceState { fileprivate var nextActivityRank: Int = 0 } @@ -1791,8 +1769,8 @@ public final class GroupCallParticipantsContext { let participant = Participant( peer: peer, ssrc: participantUpdate.ssrc, - videoJsonDescription: participantUpdate.videoJsonDescription, - presentationJsonDescription: participantUpdate.presentationJsonDescription, + videoDescription: participantUpdate.videoDescription, + presentationDescription: participantUpdate.presentationDescription, joinTimestamp: previousJoinTimestamp ?? participantUpdate.joinTimestamp, raiseHandRating: participantUpdate.raiseHandRating, hasRaiseHand: participantUpdate.raiseHandRating != nil, @@ -1938,7 +1916,7 @@ public final class GroupCallParticipantsContext { raiseHandApi = nil } - return account.network.request(Api.functions.phone.editGroupCallParticipant(flags: flags, call: .inputGroupCall(id: id, accessHash: accessHash), participant: inputPeer, muted: muted, volume: volume, raiseHand: raiseHandApi, videoMuted: nil)) + return account.network.request(Api.functions.phone.editGroupCallParticipant(flags: flags, call: .inputGroupCall(id: id, accessHash: accessHash), participant: inputPeer, muted: muted, volume: volume, raiseHand: raiseHandApi, videoStopped: nil, videoPaused: nil, presentationPaused: nil)) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -1978,7 +1956,13 @@ public final class GroupCallParticipantsContext { })) } - public func updateVideoState(peerId: PeerId, isVideoMuted: Bool) { + public func updateVideoState(peerId: PeerId, isVideoMuted: Bool, isVideoPaused: Bool) { + if self.localVideoIsMuted == isVideoMuted && self.localIsVideoPaused == isVideoPaused { + return + } + self.localVideoIsMuted = isVideoMuted + self.localIsVideoPaused = isVideoPaused + let disposable = MetaDisposable() let account = self.account @@ -1998,7 +1982,13 @@ public final class GroupCallParticipantsContext { videoMuted = isVideoMuted ? .boolTrue : .boolFalse flags |= 1 << 3 - return account.network.request(Api.functions.phone.editGroupCallParticipant(flags: flags, call: .inputGroupCall(id: id, accessHash: accessHash), participant: inputPeer, muted: nil, volume: nil, raiseHand: nil, videoMuted: videoMuted)) + var videoPaused: Api.Bool? + if !isVideoMuted { + videoPaused = isVideoPaused ? .boolTrue : .boolFalse + flags |= 1 << 4 + } + + return account.network.request(Api.functions.phone.editGroupCallParticipant(flags: flags, call: .inputGroupCall(id: id, accessHash: accessHash), participant: inputPeer, muted: nil, volume: nil, raiseHand: nil, videoStopped: videoMuted, videoPaused: videoPaused, presentationPaused: nil)) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -2148,29 +2138,17 @@ extension GroupCallParticipantsContext.Update.StateUpdate.ParticipantUpdate { participationStatusChange = .none } - var videoJsonDescription: String? = nil - var presentationJsonDescription: String? = nil - if let video = video { - switch video { - case let .dataJSON(data): - videoJsonDescription = data - } - } - if let presentation = presentation { - switch presentation { - case let .dataJSON(data): - presentationJsonDescription = data - } - } + var videoDescription = video.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) + var presentationDescription = presentation.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) if muteState?.canUnmute == false { - videoJsonDescription = nil - presentationJsonDescription = nil + videoDescription = nil + presentationDescription = nil } self.init( peerId: peerId, ssrc: ssrc, - videoJsonDescription: videoJsonDescription, - presentationJsonDescription: presentationJsonDescription, + videoDescription: videoDescription, + presentationDescription: presentationDescription, joinTimestamp: date, activityTimestamp: activeDate.flatMap(Double.init), raiseHandRating: raiseHandRating, @@ -2214,29 +2192,17 @@ extension GroupCallParticipantsContext.Update.StateUpdate { participationStatusChange = .none } - var videoJsonDescription: String? = nil - var presentationJsonDescription: String? = nil - if let video = video { - switch video { - case let .dataJSON(data): - videoJsonDescription = data - } - } - if let presentation = presentation { - switch presentation { - case let .dataJSON(data): - presentationJsonDescription = data - } - } + var videoDescription = video.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) + var presentationDescription = presentation.flatMap(GroupCallParticipantsContext.Participant.VideoDescription.init) if muteState?.canUnmute == false { - videoJsonDescription = nil - presentationJsonDescription = nil + videoDescription = nil + presentationDescription = nil } participantUpdates.append(GroupCallParticipantsContext.Update.StateUpdate.ParticipantUpdate( peerId: peerId, ssrc: ssrc, - videoJsonDescription: videoJsonDescription, - presentationJsonDescription: presentationJsonDescription, + videoDescription: videoDescription, + presentationDescription: presentationDescription, joinTimestamp: date, activityTimestamp: activeDate.flatMap(Double.init), raiseHandRating: raiseHandRating, @@ -2584,3 +2550,20 @@ public func getAudioBroadcastPart(dataSource: AudioBroadcastDataSource, callId: } } } + +private extension GroupCallParticipantsContext.Participant.VideoDescription { + init(_ apiVideo: Api.GroupCallParticipantVideo) { + switch apiVideo { + case let .groupCallParticipantVideo(flags, endpoint, sourceGroups): + var parsedSsrcGroups: [SsrcGroup] = [] + for group in sourceGroups { + switch group { + case let .groupCallParticipantVideoSourceGroup(semantics, sources): + parsedSsrcGroups.append(SsrcGroup(semantics: semantics, ssrcs: sources.map(UInt32.init(bitPattern:)))) + } + } + let isPaused = (flags & (1 << 0)) != 0 + self.init(endpointId: endpoint, ssrcGroups: parsedSsrcGroups, isPaused: isPaused) + } + } +} diff --git a/submodules/TelegramCore/Sources/SecretChats/UpdateSecretChat.swift b/submodules/TelegramCore/Sources/SecretChats/UpdateSecretChat.swift index 17a937f8f1..b3bcc86e9f 100644 --- a/submodules/TelegramCore/Sources/SecretChats/UpdateSecretChat.swift +++ b/submodules/TelegramCore/Sources/SecretChats/UpdateSecretChat.swift @@ -50,7 +50,7 @@ func updateSecretChat(encryptionProvider: EncryptionProvider, accountPeerId: Pee var updatedState = currentState updatedState = updatedState.withUpdatedKeychain(SecretChatKeychain(keys: [SecretChatKey(fingerprint: keyFingerprint, key: MemoryBuffer(data: key), validity: .indefinite, useCount: 0)])) - updatedState = updatedState.withUpdatedEmbeddedState(.sequenceBasedLayer(SecretChatSequenceBasedLayerState(layerNegotiationState: SecretChatLayerNegotiationState(activeLayer: .layer46, locallyRequestedLayer: nil, remotelyRequestedLayer: nil), rekeyState: nil, baseIncomingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: currentPeer.id, tag: OperationLogTags.SecretIncomingDecrypted), baseOutgoingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: currentPeer.id, tag: OperationLogTags.SecretOutgoing), topProcessedCanonicalIncomingOperationIndex: nil))) + updatedState = updatedState.withUpdatedEmbeddedState(.sequenceBasedLayer(SecretChatSequenceBasedLayerState(layerNegotiationState: SecretChatLayerNegotiationState(activeLayer: .layer73, locallyRequestedLayer: nil, remotelyRequestedLayer: nil), rekeyState: nil, baseIncomingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: currentPeer.id, tag: OperationLogTags.SecretIncomingDecrypted), baseOutgoingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: currentPeer.id, tag: OperationLogTags.SecretOutgoing), topProcessedCanonicalIncomingOperationIndex: nil))) updatedState = updatedState.withUpdatedKeyFingerprint(SecretChatKeyFingerprint(sha1: SecretChatKeySha1Fingerprint(digest: sha1Digest(key)), sha256: SecretChatKeySha256Fingerprint(digest: sha256Digest(key)))) diff --git a/submodules/TelegramCore/Sources/State/Fetch.swift b/submodules/TelegramCore/Sources/State/Fetch.swift index 34b3a5c0c8..a8a796d242 100644 --- a/submodules/TelegramCore/Sources/State/Fetch.swift +++ b/submodules/TelegramCore/Sources/State/Fetch.swift @@ -63,6 +63,21 @@ func fetchResource(account: Account, resource: MediaResource, intervals: Signal< } else if let httpReference = resource as? HttpReferenceMediaResource { return .single(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: false)) |> then(fetchHttpResource(url: httpReference.url)) + } else if let wallpaperResource = resource as? WallpaperDataResource { + return getWallpaper(network: account.network, slug: wallpaperResource.slug) + |> mapError { _ -> MediaResourceDataFetchError in + return .generic + } + |> mapToSignal { wallpaper -> Signal in + guard case let .file(file) = wallpaper else { + return .fail(.generic) + } + guard let cloudResource = file.file.resource as? TelegramMultipartFetchableResource else { + return .fail(.generic) + } + return .single(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: false)) + |> then(fetchCloudMediaLocation(account: account, resource: cloudResource, datacenterId: cloudResource.datacenterId, size: resource.size == 0 ? nil : resource.size, intervals: intervals, parameters: MediaResourceFetchParameters(tag: nil, info: TelegramCloudMediaResourceFetchInfo(reference: .standalone(resource: file.file.resource), preferBackgroundReferenceRevalidation: false, continueInBackground: false), isRandomAccessAllowed: true))) + } } return nil } diff --git a/submodules/TelegramCore/Sources/State/ManagedSecretChatOutgoingOperations.swift b/submodules/TelegramCore/Sources/State/ManagedSecretChatOutgoingOperations.swift index 4643230e25..56262edfa6 100644 --- a/submodules/TelegramCore/Sources/State/ManagedSecretChatOutgoingOperations.swift +++ b/submodules/TelegramCore/Sources/State/ManagedSecretChatOutgoingOperations.swift @@ -245,7 +245,7 @@ private func initialHandshakeAccept(postbox: Postbox, network: Network, peerId: if let state = transaction.getPeerChatState(peerId) as? SecretChatState { var updatedState = state updatedState = updatedState.withUpdatedKeychain(SecretChatKeychain(keys: [SecretChatKey(fingerprint: keyFingerprint, key: MemoryBuffer(data: key), validity: .indefinite, useCount: 0)])) - updatedState = updatedState.withUpdatedEmbeddedState(.sequenceBasedLayer(SecretChatSequenceBasedLayerState(layerNegotiationState: SecretChatLayerNegotiationState(activeLayer: .layer46, locallyRequestedLayer: nil, remotelyRequestedLayer: nil), rekeyState: nil, baseIncomingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: peerId, tag: OperationLogTags.SecretIncomingDecrypted), baseOutgoingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: peerId, tag: OperationLogTags.SecretOutgoing), topProcessedCanonicalIncomingOperationIndex: nil))) + updatedState = updatedState.withUpdatedEmbeddedState(.sequenceBasedLayer(SecretChatSequenceBasedLayerState(layerNegotiationState: SecretChatLayerNegotiationState(activeLayer: .layer73, locallyRequestedLayer: nil, remotelyRequestedLayer: nil), rekeyState: nil, baseIncomingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: peerId, tag: OperationLogTags.SecretIncomingDecrypted), baseOutgoingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: peerId, tag: OperationLogTags.SecretOutgoing), topProcessedCanonicalIncomingOperationIndex: nil))) updatedState = updatedState.withUpdatedKeyFingerprint(SecretChatKeyFingerprint(sha1: SecretChatKeySha1Fingerprint(digest: sha1Digest(key)), sha256: SecretChatKeySha256Fingerprint(digest: sha256Digest(key)))) var layer: SecretChatLayer? diff --git a/submodules/TelegramCore/Sources/State/ProcessSecretChatIncomingDecryptedOperations.swift b/submodules/TelegramCore/Sources/State/ProcessSecretChatIncomingDecryptedOperations.swift index 0a5eb061d6..d9f28c1f79 100644 --- a/submodules/TelegramCore/Sources/State/ProcessSecretChatIncomingDecryptedOperations.swift +++ b/submodules/TelegramCore/Sources/State/ProcessSecretChatIncomingDecryptedOperations.swift @@ -236,9 +236,9 @@ func processSecretChatIncomingDecryptedOperations(encryptionProvider: Encryption updatedState = updatedState.withUpdatedEmbeddedState(.sequenceBasedLayer(sequenceBasedLayerState)) updatedState = addSecretChatOutgoingOperation(transaction: transaction, peerId: peerId, operation: .reportLayerSupport(layer: .layer73, actionGloballyUniqueId: Int64.random(in: Int64.min ... Int64.max), layerSupport: 101), state: updatedState) } else if layerSupport >= 46 { - let sequenceBasedLayerState = SecretChatSequenceBasedLayerState(layerNegotiationState: SecretChatLayerNegotiationState(activeLayer: .layer46, locallyRequestedLayer: 46, remotelyRequestedLayer: layerSupport), rekeyState: nil, baseIncomingOperationIndex: entry.tagLocalIndex, baseOutgoingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: peerId, tag: OperationLogTags.SecretOutgoing), topProcessedCanonicalIncomingOperationIndex: nil) + let sequenceBasedLayerState = SecretChatSequenceBasedLayerState(layerNegotiationState: SecretChatLayerNegotiationState(activeLayer: .layer73, locallyRequestedLayer: 46, remotelyRequestedLayer: layerSupport), rekeyState: nil, baseIncomingOperationIndex: entry.tagLocalIndex, baseOutgoingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: peerId, tag: OperationLogTags.SecretOutgoing), topProcessedCanonicalIncomingOperationIndex: nil) updatedState = updatedState.withUpdatedEmbeddedState(.sequenceBasedLayer(sequenceBasedLayerState)) - updatedState = addSecretChatOutgoingOperation(transaction: transaction, peerId: peerId, operation: .reportLayerSupport(layer: .layer46, actionGloballyUniqueId: Int64.random(in: Int64.min ... Int64.max), layerSupport: 101), state: updatedState) + updatedState = addSecretChatOutgoingOperation(transaction: transaction, peerId: peerId, operation: .reportLayerSupport(layer: .layer73, actionGloballyUniqueId: Int64.random(in: Int64.min ... Int64.max), layerSupport: 101), state: updatedState) } else { throw MessageParsingError.contentParsingError } diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index 91fd8b5abe..af4691d8d7 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -3,8 +3,9 @@ import UIKit import TelegramCore import SyncCore import TelegramUIPreferences +import Postbox -public let defaultServiceBackgroundColor = UIColor(rgb: 0x000000, alpha: 0.3) +public let defaultServiceBackgroundColor = UIColor(rgb: 0x000000, alpha: 0.2) public let defaultPresentationTheme = makeDefaultDayPresentationTheme(serviceBackgroundColor: defaultServiceBackgroundColor, day: false, preview: false) public let defaultDayAccentColor = UIColor(rgb: 0x007ee5) @@ -30,7 +31,7 @@ public func customizeDefaultDayTheme(theme: PresentationTheme, editing: Bool, ti let accentColor = accentColor ?? defaultDayAccentColor bubbleColors = (accentColor.withMultiplied(hue: 0.966, saturation: 0.61, brightness: 0.98), accentColor) } else { - if let accentColor = accentColor { + if let accentColor = accentColor, !accentColor.alpha.isZero { let hsb = accentColor.hsb bubbleColors = (UIColor(hue: hsb.0, saturation: (hsb.1 > 0.0 && hsb.2 > 0.0) ? 0.14 : 0.0, brightness: 0.79 + hsb.2 * 0.21, alpha: 1.0), nil) if accentColor.lightness > 0.705 { @@ -38,10 +39,8 @@ public func customizeDefaultDayTheme(theme: PresentationTheme, editing: Bool, ti } else { outgoingAccent = accentColor } - - let topColor = accentColor.withMultiplied(hue: 1.010, saturation: 0.414, brightness: 0.957) - let bottomColor = accentColor.withMultiplied(hue: 1.019, saturation: 0.867, brightness: 0.965) - suggestedWallpaper = .gradient([topColor.argb, bottomColor.argb], WallpaperSettings()) + + suggestedWallpaper = .gradient(defaultBuiltinWallpaperGradientColors.map(\.rgb), WallpaperSettings()) } else { bubbleColors = (UIColor(rgb: 0xe1ffc7), nil) suggestedWallpaper = .gradient(defaultBuiltinWallpaperGradientColors.map(\.rgb), WallpaperSettings()) @@ -639,7 +638,7 @@ public func makeDefaultDayPresentationTheme(extendingThemeReference: Presentatio ) let serviceMessage = PresentationThemeServiceMessage( - components: PresentationThemeServiceMessageColor(withDefaultWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0x939fab, alpha: 0.5), primaryText: UIColor(rgb: 0xffffff), linkHighlight: UIColor(rgb: 0x748391, alpha: 0.25), scam: UIColor(rgb: 0xffffff), dateFillStatic: UIColor(rgb: 0x748391, alpha: 0.45), dateFillFloating: UIColor(rgb: 0x939fab, alpha: 0.5)), withCustomWallpaper: PresentationThemeServiceMessageColorComponents(fill: serviceBackgroundColor, primaryText: UIColor(rgb: 0xffffff), linkHighlight: UIColor(rgb: 0x748391, alpha: 0.25), scam: UIColor(rgb: 0xffffff), dateFillStatic: serviceBackgroundColor, dateFillFloating: serviceBackgroundColor.withAlphaComponent(serviceBackgroundColor.alpha * 0.6667))), + components: PresentationThemeServiceMessageColor(withDefaultWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0x939fab, alpha: 0.5), primaryText: UIColor(rgb: 0xffffff), linkHighlight: UIColor(rgb: 0x748391, alpha: 0.25), scam: UIColor(rgb: 0xffffff), dateFillStatic: UIColor(rgb: 0x000000, alpha: 0.2), dateFillFloating: UIColor(rgb: 0x939fab, alpha: 0.5)), withCustomWallpaper: PresentationThemeServiceMessageColorComponents(fill: serviceBackgroundColor, primaryText: UIColor(rgb: 0xffffff), linkHighlight: UIColor(rgb: 0x748391, alpha: 0.25), scam: UIColor(rgb: 0xffffff), dateFillStatic: serviceBackgroundColor, dateFillFloating: serviceBackgroundColor.withAlphaComponent(serviceBackgroundColor.alpha * 0.6667))), unreadBarFillColor: UIColor(white: 1.0, alpha: 0.9), unreadBarStrokeColor: UIColor(white: 0.0, alpha: 0.2), unreadBarTextColor: UIColor(rgb: 0x86868d), @@ -712,9 +711,11 @@ public func makeDefaultDayPresentationTheme(extendingThemeReference: Presentatio badgeStrokeColor: UIColor(rgb: 0x007ee5), badgeTextColor: UIColor(rgb: 0xffffff) ) - + + let defaultPatternWallpaper: TelegramWallpaper = .file(id: 0, accessHash: 0, isCreator: false, isDefault: true, isPattern: true, isDark: false, slug: "fqv01SQemVIBAAAApND8LDRUhRU", file: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 36542425), partialReference: nil, resource: WallpaperDataResource(slug: "fqv01SQemVIBAAAApND8LDRUhRU"), previewRepresentations: [TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 600, height: 800), resource: WallpaperDataResource(slug: "fqv01SQemVIBAAAApND8LDRUhRU"), progressiveSizes: [], immediateThumbnailData: nil)], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "image/tgv", size: nil, attributes: []), settings: WallpaperSettings(colors: defaultBuiltinWallpaperGradientColors.map(\.rgb), intensity: 50)) + let chat = PresentationThemeChat( - defaultWallpaper: day ? .color(0xffffff) : .gradient(defaultBuiltinWallpaperGradientColors.map(\.rgb), WallpaperSettings()), + defaultWallpaper: day ? .color(0xffffff) : defaultPatternWallpaper, message: day ? messageDay : message, serviceMessage: day ? serviceMessageDay : serviceMessage, inputPanel: inputPanel, @@ -809,8 +810,8 @@ public func makeDefaultDayPresentationTheme(extendingThemeReference: Presentatio } public let defaultBuiltinWallpaperGradientColors: [UIColor] = [ - UIColor(rgb: 0x7FA381), - UIColor(rgb: 0xFFF5C5), - UIColor(rgb: 0x336F55), - UIColor(rgb: 0xFBE37D) + UIColor(rgb: 0xdbddbb), + UIColor(rgb: 0x6ba587), + UIColor(rgb: 0xd5d88d), + UIColor(rgb: 0x88b884) ] diff --git a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift index 584e2c7416..14c87044bc 100644 --- a/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/MakePresentationTheme.swift @@ -31,8 +31,6 @@ public func customizePresentationTheme(_ theme: PresentationTheme, editing: Bool case .nightAccent: return customizeDefaultDarkTintedPresentationTheme(theme: theme, editing: editing, title: title, accentColor: accentColor, backgroundColors: backgroundColors, bubbleColors: bubbleColors, wallpaper: wallpaper) } - - return theme } public func makePresentationTheme(settings: TelegramThemeSettings, title: String? = nil, serviceBackgroundColor: UIColor? = nil) -> PresentationTheme? { diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index f0f376cdb2..b29d2e5b23 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -837,5629 +837,5639 @@ public final class PresentationStrings: Equatable { return formatWithArgumentRanges(self._s[589]!, self._r[589]!, [_1, _2, _3]) } public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[590]! } - public var SocksProxySetup_ShareLink: String { return self._s[593]! } - public var AuthSessions_OtherDevices: String { return self._s[594]! } - public var IntentsSettings_SuggestedChatsGroups: String { return self._s[595]! } - public var Watch_MessageView_Reply: String { return self._s[596]! } - public var Camera_FlashOn: String { return self._s[598]! } + public var VoiceChat_OpenGroup: String { return self._s[592]! } + public var SocksProxySetup_ShareLink: String { return self._s[594]! } + public var AuthSessions_OtherDevices: String { return self._s[595]! } + public var IntentsSettings_SuggestedChatsGroups: String { return self._s[596]! } + public var Watch_MessageView_Reply: String { return self._s[597]! } + public var Camera_FlashOn: String { return self._s[599]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[599]!, self._r[599]!, [_1, _2]) + return formatWithArgumentRanges(self._s[600]!, self._r[600]!, [_1, _2]) } - public var Conversation_ContextMenuBlock: String { return self._s[600]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[602]! } - public var Privacy_Calls_NeverAllow: String { return self._s[603]! } - public var BroadcastGroups_Cancel: String { return self._s[604]! } - public var SharedMedia_CategoryLinks: String { return self._s[605]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[608]! } - public var Passport_Identity_ScansHelp: String { return self._s[610]! } - public var ShareMenu_CopyShareLink: String { return self._s[611]! } - public var StickerSettings_MaskContextInfo: String { return self._s[612]! } - public var InviteLink_Create_EditTitle: String { return self._s[613]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[614]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[617]! } - public var ChatImportActivity_Success: String { return self._s[619]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[620]! } - public var NotificationsSound_Popcorn: String { return self._s[621]! } - public var FeatureDisabled_Oops: String { return self._s[622]! } + public var Conversation_ContextMenuBlock: String { return self._s[601]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[603]! } + public var Privacy_Calls_NeverAllow: String { return self._s[604]! } + public var BroadcastGroups_Cancel: String { return self._s[605]! } + public var SharedMedia_CategoryLinks: String { return self._s[606]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[609]! } + public var Passport_Identity_ScansHelp: String { return self._s[611]! } + public var ShareMenu_CopyShareLink: String { return self._s[612]! } + public var StickerSettings_MaskContextInfo: String { return self._s[613]! } + public var InviteLink_Create_EditTitle: String { return self._s[614]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[615]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[618]! } + public var ChatImportActivity_Success: String { return self._s[620]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[621]! } + public var NotificationsSound_Popcorn: String { return self._s[622]! } + public var FeatureDisabled_Oops: String { return self._s[623]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[623]!, self._r[623]!, [_0]) + return formatWithArgumentRanges(self._s[624]!, self._r[624]!, [_0]) } - public var Notification_PinnedMessage: String { return self._s[624]! } - public var Tour_Title4: String { return self._s[625]! } + public var Notification_PinnedMessage: String { return self._s[625]! } + public var Tour_Title4: String { return self._s[626]! } public func Notification_VoiceChatInvitationForYou(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[626]!, self._r[626]!, [_1]) + return formatWithArgumentRanges(self._s[627]!, self._r[627]!, [_1]) } - public var Watch_Suggestion_OK: String { return self._s[627]! } - public var Compose_TokenListPlaceholder: String { return self._s[628]! } - public var InviteLink_PermanentLink: String { return self._s[629]! } - public var EditTheme_Edit_TopInfo: String { return self._s[630]! } - public var Gif_NoGifsFound: String { return self._s[631]! } - public var Login_InvalidCountryCode: String { return self._s[632]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[633]! } - public var Call_VoiceOver_VideoCallMissed: String { return self._s[634]! } - public var VoiceChat_ChangeNameTitle: String { return self._s[636]! } + public var Watch_Suggestion_OK: String { return self._s[628]! } + public var Compose_TokenListPlaceholder: String { return self._s[629]! } + public var InviteLink_PermanentLink: String { return self._s[630]! } + public var EditTheme_Edit_TopInfo: String { return self._s[631]! } + public var Gif_NoGifsFound: String { return self._s[632]! } + public var Login_InvalidCountryCode: String { return self._s[633]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[634]! } + public var Call_VoiceOver_VideoCallMissed: String { return self._s[635]! } + public var VoiceChat_ChangeNameTitle: String { return self._s[637]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[637]!, self._r[637]!, [_1]) + return formatWithArgumentRanges(self._s[638]!, self._r[638]!, [_1]) } - public var Profile_CreateNewContact: String { return self._s[638]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[639]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[640]! } - public var Group_Setup_TypePublic: String { return self._s[641]! } - public var Weekday_ShortSaturday: String { return self._s[642]! } + public var Profile_CreateNewContact: String { return self._s[639]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[640]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[641]! } + public var Group_Setup_TypePublic: String { return self._s[642]! } + public var Weekday_ShortSaturday: String { return self._s[643]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[643]!, self._r[643]!, [_0]) + return formatWithArgumentRanges(self._s[644]!, self._r[644]!, [_0]) } - public var LiveLocation_MenuStopAll: String { return self._s[644]! } + public var LiveLocation_MenuStopAll: String { return self._s[645]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[645]!, self._r[645]!, [_0]) + return formatWithArgumentRanges(self._s[646]!, self._r[646]!, [_0]) } - public var ChatListFolder_NamePlaceholder: String { return self._s[646]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[647]! } + public var ChatListFolder_NamePlaceholder: String { return self._s[647]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[648]! } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[648]!, self._r[648]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[649]!, self._r[649]!, [_1, _2, _3]) } - public var VoiceChat_ChatFullAlertText: String { return self._s[649]! } - public var Chat_GenericPsaTooltip: String { return self._s[651]! } - public var ChannelInfo_CreateVoiceChat: String { return self._s[652]! } + public var VoiceChat_ChatFullAlertText: String { return self._s[650]! } + public var Chat_GenericPsaTooltip: String { return self._s[652]! } + public var ChannelInfo_CreateVoiceChat: String { return self._s[653]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[653]!, self._r[653]!, [_0]) + return formatWithArgumentRanges(self._s[654]!, self._r[654]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[654]! } - public var Login_PhoneAndCountryHelp: String { return self._s[655]! } - public var SaveIncomingPhotosSettings_From: String { return self._s[657]! } - public var Conversation_JumpToDate: String { return self._s[658]! } - public var AuthSessions_AddDevice: String { return self._s[659]! } - public var Settings_FAQ: String { return self._s[661]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[655]! } + public var Login_PhoneAndCountryHelp: String { return self._s[656]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[658]! } + public var Conversation_JumpToDate: String { return self._s[659]! } + public var AuthSessions_AddDevice: String { return self._s[660]! } + public var Settings_FAQ: String { return self._s[662]! } public func ChatImport_CreateGroupAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[662]!, self._r[662]!, [_0]) + return formatWithArgumentRanges(self._s[663]!, self._r[663]!, [_0]) } - public var Username_Title: String { return self._s[663]! } - public var DialogList_Read: String { return self._s[664]! } - public var Conversation_InstantPagePreview: String { return self._s[665]! } - public var Report_Succeed: String { return self._s[667]! } - public var Login_ResetAccountProtected_Title: String { return self._s[668]! } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[669]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[670]! } + public var Username_Title: String { return self._s[664]! } + public var DialogList_Read: String { return self._s[665]! } + public var Conversation_InstantPagePreview: String { return self._s[666]! } + public var Report_Succeed: String { return self._s[668]! } + public var Login_ResetAccountProtected_Title: String { return self._s[669]! } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[670]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[671]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[671]!, self._r[671]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[672]!, self._r[672]!, [_1, _2, _3]) } - public var WallpaperPreview_PreviewBottomText: String { return self._s[673]! } - public var Privacy_SecretChatsTitle: String { return self._s[676]! } + public var WallpaperPreview_PreviewBottomText: String { return self._s[674]! } + public var Privacy_SecretChatsTitle: String { return self._s[677]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[677]!, self._r[677]!, [_1, _2]) + return formatWithArgumentRanges(self._s[678]!, self._r[678]!, [_1, _2]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[678]! } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[679]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[680]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[681]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[679]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[680]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[681]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[682]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[682]!, self._r[682]!, [_0]) + return formatWithArgumentRanges(self._s[683]!, self._r[683]!, [_0]) } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[684]! } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[685]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[686]! } - public var CallFeedback_ReasonDropped: String { return self._s[687]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[685]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[686]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[687]! } + public var CallFeedback_ReasonDropped: String { return self._s[688]! } public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[688]!, self._r[688]!, [_0]) + return formatWithArgumentRanges(self._s[689]!, self._r[689]!, [_0]) } - public var WebSearch_Images: String { return self._s[689]! } - public var Passport_Identity_Surname: String { return self._s[690]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[691]! } - public var TwoFactorSetup_Email_Title: String { return self._s[692]! } - public var Cache_ClearEmpty: String { return self._s[693]! } - public var AuthSessions_AddDeviceIntro_Action: String { return self._s[694]! } - public var Theme_Context_Apply: String { return self._s[695]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[696]! } - public var CallList_DeleteAllForEveryone: String { return self._s[697]! } + public var WebSearch_Images: String { return self._s[690]! } + public var Passport_Identity_Surname: String { return self._s[691]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[692]! } + public var TwoFactorSetup_Email_Title: String { return self._s[693]! } + public var Cache_ClearEmpty: String { return self._s[694]! } + public var AuthSessions_AddDeviceIntro_Action: String { return self._s[695]! } + public var Theme_Context_Apply: String { return self._s[696]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[697]! } + public var CallList_DeleteAllForEveryone: String { return self._s[698]! } public func BroadcastGroups_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[698]!, self._r[698]!, [_0]) + return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_0]) } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[699]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[700]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[700]!, self._r[700]!, [_0]) + return formatWithArgumentRanges(self._s[701]!, self._r[701]!, [_0]) } - public var Call_StatusRinging: String { return self._s[701]! } + public var Call_StatusRinging: String { return self._s[702]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_0]) - } - public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[703]!, self._r[703]!, [_0]) } - public var Cache_ClearNone: String { return self._s[704]! } - public var PrivacyPolicy_Accept: String { return self._s[705]! } - public var Contacts_PhoneNumber: String { return self._s[706]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[707]! } - public var PhotoEditor_HighlightsTint: String { return self._s[709]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[710]! } - public var Checkout_PaymentMethod_Title: String { return self._s[713]! } - public var Month_GenAugust: String { return self._s[715]! } - public var DialogList_Draft: String { return self._s[716]! } - public var ChatList_EmptyChatListFilterText: String { return self._s[717]! } - public var PeopleNearby_Description: String { return self._s[718]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[719]! } - public var VoiceChat_InviteLink_CopyListenerLink: String { return self._s[720]! } - public var VoiceChat_EditTitleRemoveSuccess: String { return self._s[721]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[723]! } - public var Watch_Message_ForwardedFrom: String { return self._s[724]! } - public var Notification_Mute1h: String { return self._s[725]! } - public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[726]! } - public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[728]! } - public var Channel_Edit_LinkItem: String { return self._s[729]! } - public var Presence_online: String { return self._s[730]! } - public var AutoDownloadSettings_Title: String { return self._s[731]! } - public var Conversation_MessageDialogRetry: String { return self._s[732]! } - public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[734]! } - public var Channel_About_Placeholder: String { return self._s[736]! } - public var Passport_Language_sl: String { return self._s[737]! } - public var AppleWatch_Title: String { return self._s[739]! } - public var RepliesChat_DescriptionText: String { return self._s[741]! } - public var Stats_Message_PrivateShares: String { return self._s[742]! } - public var Settings_ViewPhoto: String { return self._s[743]! } - public var Conversation_ForwardTooltip_SavedMessages_One: String { return self._s[744]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[745]! } - public var Cache_ClearProgress: String { return self._s[746]! } - public var Cache_Music: String { return self._s[747]! } - public var Conversation_ContextMenuShare: String { return self._s[749]! } - public var AutoDownloadSettings_Unlimited: String { return self._s[750]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[751]! } - public var Contacts_PermissionsAllow: String { return self._s[752]! } - public var Passport_Language_vi: String { return self._s[754]! } + public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[704]!, self._r[704]!, [_0]) + } + public var Cache_ClearNone: String { return self._s[705]! } + public var PrivacyPolicy_Accept: String { return self._s[706]! } + public var Contacts_PhoneNumber: String { return self._s[707]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[708]! } + public var PhotoEditor_HighlightsTint: String { return self._s[710]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[711]! } + public var Checkout_PaymentMethod_Title: String { return self._s[714]! } + public var Month_GenAugust: String { return self._s[716]! } + public var DialogList_Draft: String { return self._s[717]! } + public var ChatList_EmptyChatListFilterText: String { return self._s[718]! } + public var PeopleNearby_Description: String { return self._s[719]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[720]! } + public var VoiceChat_InviteLink_CopyListenerLink: String { return self._s[721]! } + public var VoiceChat_EditTitleRemoveSuccess: String { return self._s[722]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[724]! } + public var Watch_Message_ForwardedFrom: String { return self._s[725]! } + public var Notification_Mute1h: String { return self._s[726]! } + public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[727]! } + public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[729]! } + public var Channel_Edit_LinkItem: String { return self._s[730]! } + public var Presence_online: String { return self._s[731]! } + public var AutoDownloadSettings_Title: String { return self._s[732]! } + public var Conversation_MessageDialogRetry: String { return self._s[733]! } + public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[735]! } + public var Channel_About_Placeholder: String { return self._s[737]! } + public var Passport_Language_sl: String { return self._s[738]! } + public var AppleWatch_Title: String { return self._s[740]! } + public var RepliesChat_DescriptionText: String { return self._s[742]! } + public var Stats_Message_PrivateShares: String { return self._s[743]! } + public var Settings_ViewPhoto: String { return self._s[744]! } + public var Conversation_ForwardTooltip_SavedMessages_One: String { return self._s[745]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[746]! } + public var Cache_ClearProgress: String { return self._s[747]! } + public var Cache_Music: String { return self._s[748]! } + public var Conversation_ContextMenuShare: String { return self._s[750]! } + public var AutoDownloadSettings_Unlimited: String { return self._s[751]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[752]! } + public var Contacts_PermissionsAllow: String { return self._s[753]! } + public var Passport_Language_vi: String { return self._s[755]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[757]!, self._r[757]!, [_1, _2]) + return formatWithArgumentRanges(self._s[758]!, self._r[758]!, [_1, _2]) } - public var Passport_Language_de: String { return self._s[758]! } - public var Notifications_PermissionsText: String { return self._s[760]! } - public var GroupRemoved_AddToGroup: String { return self._s[761]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[762]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[763]! } - public var Login_TermsOfServiceAgree: String { return self._s[764]! } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[765]! } + public var Passport_Language_de: String { return self._s[759]! } + public var Notifications_PermissionsText: String { return self._s[761]! } + public var GroupRemoved_AddToGroup: String { return self._s[762]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[763]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[764]! } + public var Login_TermsOfServiceAgree: String { return self._s[765]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[766]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[766]!, self._r[766]!, [_1, _2]) + return formatWithArgumentRanges(self._s[767]!, self._r[767]!, [_1, _2]) } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[768]! } - public var VoiceChat_VideoPreviewStopScreenSharing: String { return self._s[769]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[769]! } + public var VoiceChat_VideoPreviewStopScreenSharing: String { return self._s[770]! } public func PUSH_CHAT_VOICECHAT_START(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[770]!, self._r[770]!, [_1, _2]) + return formatWithArgumentRanges(self._s[771]!, self._r[771]!, [_1, _2]) } - public var ChatListFolder_NameGroups: String { return self._s[771]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[772]! } - public var VoiceChat_EditDescriptionSave: String { return self._s[773]! } + public var ChatListFolder_NameGroups: String { return self._s[772]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[773]! } + public var VoiceChat_EditDescriptionSave: String { return self._s[774]! } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[774]!, self._r[774]!, [_1, _2]) + return formatWithArgumentRanges(self._s[775]!, self._r[775]!, [_1, _2]) } - public var Watch_Suggestion_TalkLater: String { return self._s[775]! } - public var Checkout_ShippingOption_Title: String { return self._s[776]! } - public var Conversation_TitleRepliesEmpty: String { return self._s[777]! } - public var CreatePoll_TextHeader: String { return self._s[778]! } - public var VoiceOver_Chat_Message: String { return self._s[780]! } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[781]! } - public var ContactInfo_Note: String { return self._s[783]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[784]! } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[785]! } - public var AutoDownloadSettings_Photos: String { return self._s[786]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[787]! } + public var Watch_Suggestion_TalkLater: String { return self._s[776]! } + public var Checkout_ShippingOption_Title: String { return self._s[777]! } + public var Conversation_TitleRepliesEmpty: String { return self._s[778]! } + public var CreatePoll_TextHeader: String { return self._s[779]! } + public var VoiceOver_Chat_Message: String { return self._s[781]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[782]! } + public var ContactInfo_Note: String { return self._s[784]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[785]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[786]! } + public var AutoDownloadSettings_Photos: String { return self._s[787]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[788]! } public func Conversation_ForwardTooltip_Chat_One(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[788]!, self._r[788]!, [_0]) + return formatWithArgumentRanges(self._s[789]!, self._r[789]!, [_0]) } - public var Channel_Info_Subscribers: String { return self._s[789]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[790]! } - public var ChatListFolderSettings_FoldersSection: String { return self._s[791]! } - public var ChannelInfo_ScheduleVoiceChat: String { return self._s[792]! } - public var VoiceOver_ChatList_OutgoingMessage: String { return self._s[793]! } + public var Channel_Info_Subscribers: String { return self._s[790]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[791]! } + public var ChatListFolderSettings_FoldersSection: String { return self._s[792]! } + public var ChannelInfo_ScheduleVoiceChat: String { return self._s[793]! } + public var VoiceOver_ChatList_OutgoingMessage: String { return self._s[794]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[797]!, self._r[797]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[798]!, self._r[798]!, [_1, _2, _3]) } - public var AutoNightTheme_System: String { return self._s[798]! } - public var Call_StatusWaiting: String { return self._s[799]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[800]! } + public var AutoNightTheme_System: String { return self._s[799]! } + public var Call_StatusWaiting: String { return self._s[800]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[801]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[801]!, self._r[801]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[802]!, self._r[802]!, [_1, _2, _3]) } - public var Conversation_ContextMenuCopy: String { return self._s[803]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[804]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[805]! } + public var Conversation_ContextMenuCopy: String { return self._s[804]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[805]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[806]! } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[806]!, self._r[806]!, [_0]) + return formatWithArgumentRanges(self._s[807]!, self._r[807]!, [_0]) } - public var Group_Status: String { return self._s[808]! } - public var Group_Setup_HistoryVisible: String { return self._s[809]! } - public var Conversation_UploadFileTooLarge: String { return self._s[810]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[811]! } - public var Paint_Edit: String { return self._s[812]! } - public var PeerInfo_AutoremoveMessages: String { return self._s[813]! } + public var Group_Status: String { return self._s[809]! } + public var Group_Setup_HistoryVisible: String { return self._s[810]! } + public var Conversation_UploadFileTooLarge: String { return self._s[811]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[812]! } + public var Paint_Edit: String { return self._s[813]! } + public var PeerInfo_AutoremoveMessages: String { return self._s[814]! } public func ChatImport_SelectionConfirmationGroupWithoutTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) + return formatWithArgumentRanges(self._s[816]!, self._r[816]!, [_0]) } - public var Channel_EditAdmin_CannotEdit: String { return self._s[816]! } - public var Username_InvalidTooShort: String { return self._s[817]! } - public var ClearCache_StorageOtherApps: String { return self._s[819]! } - public var Conversation_ViewMessage: String { return self._s[820]! } - public var GroupInfo_PublicLinkAdd: String { return self._s[822]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[817]! } + public var Username_InvalidTooShort: String { return self._s[818]! } + public var ClearCache_StorageOtherApps: String { return self._s[820]! } + public var Conversation_ViewMessage: String { return self._s[821]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[823]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[823]!, self._r[823]!, [_0]) + return formatWithArgumentRanges(self._s[824]!, self._r[824]!, [_0]) } - public var CallSettings_Title: String { return self._s[824]! } + public var CallSettings_Title: String { return self._s[825]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[825]!, self._r[825]!, [_0]) + return formatWithArgumentRanges(self._s[826]!, self._r[826]!, [_0]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[828]!, self._r[828]!, [_0]) + return formatWithArgumentRanges(self._s[829]!, self._r[829]!, [_0]) } - public var PUSH_SENDER_YOU: String { return self._s[831]! } + public var PUSH_SENDER_YOU: String { return self._s[832]! } public func Conversation_DeletedFromContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[832]!, self._r[832]!, [_0]) + return formatWithArgumentRanges(self._s[833]!, self._r[833]!, [_0]) } - public var Profile_ShareContactButton: String { return self._s[833]! } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[834]! } + public var Profile_ShareContactButton: String { return self._s[834]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[835]! } public func VoiceOver_Chat_StickerFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[835]!, self._r[835]!, [_0]) + return formatWithArgumentRanges(self._s[836]!, self._r[836]!, [_0]) } - public var Map_ShareLiveLocation: String { return self._s[836]! } - public var ChatListFolder_TitleEdit: String { return self._s[837]! } + public var Map_ShareLiveLocation: String { return self._s[837]! } + public var ChatListFolder_TitleEdit: String { return self._s[838]! } public func VoiceOver_Chat_AnimatedStickerFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[838]!, self._r[838]!, [_0]) + return formatWithArgumentRanges(self._s[839]!, self._r[839]!, [_0]) } - public var Passport_Address_Address: String { return self._s[840]! } - public var LastSeen_JustNow: String { return self._s[842]! } + public var Passport_Address_Address: String { return self._s[841]! } + public var LastSeen_JustNow: String { return self._s[843]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[843]!, self._r[843]!, [_0]) + return formatWithArgumentRanges(self._s[844]!, self._r[844]!, [_0]) } - public var ContactInfo_PhoneLabelOther: String { return self._s[844]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[845]! } - public var Weekday_Today: String { return self._s[848]! } - public var DialogList_Title: String { return self._s[849]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[850]! } - public var Cache_ClearCache: String { return self._s[851]! } - public var CreatePoll_ExplanationInfo: String { return self._s[852]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[854]! } - public var Stats_MessageTitle: String { return self._s[855]! } - public var Passport_Address_Street: String { return self._s[857]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[845]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[846]! } + public var Weekday_Today: String { return self._s[849]! } + public var DialogList_Title: String { return self._s[850]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[851]! } + public var Cache_ClearCache: String { return self._s[852]! } + public var CreatePoll_ExplanationInfo: String { return self._s[853]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[855]! } + public var Stats_MessageTitle: String { return self._s[856]! } + public var Passport_Address_Street: String { return self._s[858]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_0]) + return formatWithArgumentRanges(self._s[859]!, self._r[859]!, [_0]) } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[859]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[860]! } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_0]) + return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_0]) } - public var TwoStepAuth_Email: String { return self._s[862]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[863]! } - public var PrivacySettings_PasscodeOn: String { return self._s[864]! } - public var Camera_SquareMode: String { return self._s[866]! } - public var SocksProxySetup_Port: String { return self._s[867]! } - public var Watch_LastSeen_JustNow: String { return self._s[869]! } + public var TwoStepAuth_Email: String { return self._s[863]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[864]! } + public var PrivacySettings_PasscodeOn: String { return self._s[865]! } + public var Camera_SquareMode: String { return self._s[867]! } + public var SocksProxySetup_Port: String { return self._s[868]! } + public var Watch_LastSeen_JustNow: String { return self._s[870]! } public func Location_ProximityAlertSetText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_1, _2]) - } - public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_1, _2]) } + public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_1, _2]) + } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_0]) + return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_0]) } - public var VoiceChat_CancelVoiceChat: String { return self._s[873]! } - public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[874]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[875]! } - public var Watch_Suggestion_HoldOn: String { return self._s[878]! } + public var VoiceChat_CancelVoiceChat: String { return self._s[874]! } + public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[875]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[876]! } + public var Watch_Suggestion_HoldOn: String { return self._s[879]! } public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[879]!, self._r[879]!, [_1]) + return formatWithArgumentRanges(self._s[880]!, self._r[880]!, [_1]) } - public var CallSettings_TabIcon: String { return self._s[880]! } - public var ScheduledMessages_SendNow: String { return self._s[881]! } - public var Stats_GroupTopWeekdaysTitle: String { return self._s[882]! } - public var UserInfo_PhoneCall: String { return self._s[883]! } - public var Month_GenMarch: String { return self._s[884]! } - public var Camera_Discard: String { return self._s[885]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[886]! } - public var Passport_RequestedInformation: String { return self._s[887]! } - public var VoiceChat_RecordingTitlePlaceholder: String { return self._s[889]! } + public var CallSettings_TabIcon: String { return self._s[881]! } + public var ScheduledMessages_SendNow: String { return self._s[882]! } + public var Stats_GroupTopWeekdaysTitle: String { return self._s[883]! } + public var UserInfo_PhoneCall: String { return self._s[884]! } + public var Month_GenMarch: String { return self._s[885]! } + public var Camera_Discard: String { return self._s[886]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[887]! } + public var Passport_RequestedInformation: String { return self._s[888]! } + public var VoiceChat_RecordingTitlePlaceholder: String { return self._s[890]! } public func Notification_ProximityYouReached(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[890]!, self._r[890]!, [_1, _2]) + return formatWithArgumentRanges(self._s[891]!, self._r[891]!, [_1, _2]) } - public var Passport_Language_ro: String { return self._s[891]! } + public var Passport_Language_ro: String { return self._s[892]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[892]!, self._r[892]!, [_1, _2]) + return formatWithArgumentRanges(self._s[893]!, self._r[893]!, [_1, _2]) } - public var AutoDownloadSettings_ResetHelp: String { return self._s[893]! } - public var Passport_Identity_DocumentDetails: String { return self._s[895]! } - public var Passport_Address_ScansHelp: String { return self._s[896]! } - public var Location_LiveLocationRequired_Title: String { return self._s[897]! } - public var ClearCache_StorageCache: String { return self._s[898]! } - public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[899]! } - public var Conversation_RestrictedText: String { return self._s[900]! } - public var Notifications_MessageNotifications: String { return self._s[902]! } - public var Passport_Scans: String { return self._s[903]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[894]! } + public var Passport_Identity_DocumentDetails: String { return self._s[896]! } + public var Passport_Address_ScansHelp: String { return self._s[897]! } + public var Location_LiveLocationRequired_Title: String { return self._s[898]! } + public var ClearCache_StorageCache: String { return self._s[899]! } + public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[900]! } + public var Conversation_RestrictedText: String { return self._s[901]! } + public var Notifications_MessageNotifications: String { return self._s[903]! } + public var Passport_Scans: String { return self._s[904]! } public func VoiceChat_StatusStartsIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[905]!, self._r[905]!, [_0]) + return formatWithArgumentRanges(self._s[906]!, self._r[906]!, [_0]) } - public var TwoStepAuth_SetupHintTitle: String { return self._s[906]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[907]! } - public var Passport_Identity_SelfieHelp: String { return self._s[908]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[909]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[910]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[911]! } - public var PeerInfo_ButtonSearch: String { return self._s[912]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[907]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[908]! } + public var Passport_Identity_SelfieHelp: String { return self._s[909]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[910]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[911]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[912]! } + public var PeerInfo_ButtonSearch: String { return self._s[913]! } public func Notification_ProximityReachedYou(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[915]!, self._r[915]!, [_1, _2]) + return formatWithArgumentRanges(self._s[916]!, self._r[916]!, [_1, _2]) } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[916]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[918]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[919]! } - public var Month_GenSeptember: String { return self._s[920]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[917]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[919]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[920]! } + public var Month_GenSeptember: String { return self._s[921]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[922]!, self._r[922]!, [_1, _2]) + return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_1, _2]) } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[923]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[924]! } public func Notification_VoiceChatInvitation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[925]!, self._r[925]!, [_1, _2]) + return formatWithArgumentRanges(self._s[926]!, self._r[926]!, [_1, _2]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[926]!, self._r[926]!, [_0]) + return formatWithArgumentRanges(self._s[927]!, self._r[927]!, [_0]) } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[928]!, self._r[928]!, [_1, _2]) - } - public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[929]!, self._r[929]!, [_1, _2]) } - public var Calls_NotNow: String { return self._s[931]! } - public var Settings_ChatFolders: String { return self._s[936]! } - public var Login_PadPhoneHelpTitle: String { return self._s[937]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[938]! } - public var Widget_MessageAutoremoveTimerRemoved: String { return self._s[939]! } - public var VoiceChat_RecordingSaved: String { return self._s[940]! } - public var Settings_ChatBackground: String { return self._s[941]! } + public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[930]!, self._r[930]!, [_1, _2]) + } + public var Calls_NotNow: String { return self._s[932]! } + public var Settings_ChatFolders: String { return self._s[937]! } + public var Login_PadPhoneHelpTitle: String { return self._s[938]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[939]! } + public var Widget_MessageAutoremoveTimerRemoved: String { return self._s[940]! } + public var VoiceChat_RecordingSaved: String { return self._s[941]! } + public var Settings_ChatBackground: String { return self._s[942]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[943]!, self._r[943]!, [_1, _2]) + return formatWithArgumentRanges(self._s[944]!, self._r[944]!, [_1, _2]) } - public var ProxyServer_VoiceOver_Active: String { return self._s[944]! } - public var Call_StatusBusy: String { return self._s[945]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[946]! } - public var Login_NetworkError: String { return self._s[948]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[949]! } - public var Privacy_Calls_Integration: String { return self._s[950]! } - public var DialogList_SearchSectionMessages: String { return self._s[951]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[952]! } - public var Preview_DeletePhoto: String { return self._s[953]! } - public var VoiceChat_Video: String { return self._s[954]! } - public var PrivacySettings_PhoneNumber: String { return self._s[956]! } - public var Forward_ErrorDisabledForChat: String { return self._s[957]! } - public var Watch_Compose_CurrentLocation: String { return self._s[958]! } - public var Settings_CallSettings: String { return self._s[959]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[960]! } - public var Conversation_StickerRemovedFromFavorites: String { return self._s[961]! } - public var ChatList_Context_MarkAllAsRead: String { return self._s[962]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[963]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[964]! } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[965]! } - public var Map_LiveLocationFor1Hour: String { return self._s[966]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[945]! } + public var Call_StatusBusy: String { return self._s[946]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[947]! } + public var Login_NetworkError: String { return self._s[949]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[950]! } + public var Privacy_Calls_Integration: String { return self._s[951]! } + public var DialogList_SearchSectionMessages: String { return self._s[952]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[953]! } + public var Preview_DeletePhoto: String { return self._s[954]! } + public var VoiceChat_Video: String { return self._s[955]! } + public var PrivacySettings_PhoneNumber: String { return self._s[957]! } + public var Forward_ErrorDisabledForChat: String { return self._s[958]! } + public var Watch_Compose_CurrentLocation: String { return self._s[959]! } + public var Settings_CallSettings: String { return self._s[960]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[961]! } + public var Conversation_StickerRemovedFromFavorites: String { return self._s[962]! } + public var ChatList_Context_MarkAllAsRead: String { return self._s[963]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[964]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[965]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[966]! } + public var Map_LiveLocationFor1Hour: String { return self._s[967]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[967]!, self._r[967]!, [_0, _1]) + return formatWithArgumentRanges(self._s[968]!, self._r[968]!, [_0, _1]) } - public var VoiceChat_MutedByAdmin: String { return self._s[968]! } + public var VoiceChat_MutedByAdmin: String { return self._s[969]! } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[969]!, self._r[969]!, [_0]) + return formatWithArgumentRanges(self._s[970]!, self._r[970]!, [_0]) } - public var Conversation_UnvotePoll: String { return self._s[970]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[971]! } + public var Conversation_UnvotePoll: String { return self._s[971]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[972]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[972]!, self._r[972]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[973]!, self._r[973]!, [_1, "\(_2)"]) } - public var Passport_InfoTitle: String { return self._s[973]! } + public var Passport_InfoTitle: String { return self._s[974]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[974]!, self._r[974]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[975]!, self._r[975]!, ["\(_0)"]) } - public var AccentColor_Title: String { return self._s[975]! } + public var AccentColor_Title: String { return self._s[976]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[976]!, self._r[976]!, [_1, _2]) + return formatWithArgumentRanges(self._s[977]!, self._r[977]!, [_1, _2]) } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[979]!, self._r[979]!, [_0]) + return formatWithArgumentRanges(self._s[980]!, self._r[980]!, [_0]) } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[980]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[981]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[982]! } - public var VoiceOver_Editing_ClearText: String { return self._s[983]! } - public var Conversation_Unarchive: String { return self._s[984]! } - public var Notification_CallOutgoing: String { return self._s[985]! } - public var Channel_Setup_PublicNoLink: String { return self._s[986]! } - public var Passport_Identity_GenderPlaceholder: String { return self._s[987]! } - public var Message_Animation: String { return self._s[988]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[989]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[990]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[981]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[982]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[983]! } + public var VoiceOver_Editing_ClearText: String { return self._s[984]! } + public var Conversation_Unarchive: String { return self._s[985]! } + public var Notification_CallOutgoing: String { return self._s[986]! } + public var Channel_Setup_PublicNoLink: String { return self._s[987]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[988]! } + public var Message_Animation: String { return self._s[989]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[990]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[991]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[991]!, self._r[991]!, [_1, _2]) + return formatWithArgumentRanges(self._s[992]!, self._r[992]!, [_1, _2]) } public func VoiceChat_StatusSpeakingVolume(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[992]!, self._r[992]!, [_0]) + return formatWithArgumentRanges(self._s[993]!, self._r[993]!, [_0]) } - public var Notification_CallBack: String { return self._s[993]! } - public var Appearance_Title: String { return self._s[996]! } - public var NotificationsSound_Glass: String { return self._s[998]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[1000]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[1002]! } - public var ChatSearch_SearchPlaceholder: String { return self._s[1003]! } - public var Passport_Identity_AddPassport: String { return self._s[1004]! } - public var GroupPermission_NoAddMembers: String { return self._s[1006]! } - public var ContactList_Context_SendMessage: String { return self._s[1007]! } - public var PhotoEditor_GrainTool: String { return self._s[1008]! } - public var Settings_CopyPhoneNumber: String { return self._s[1009]! } - public var Passport_Address_City: String { return self._s[1010]! } - public var VoiceChat_LeaveAndCancelVoiceChat: String { return self._s[1011]! } - public var ChannelRemoved_RemoveInfo: String { return self._s[1012]! } - public var SocksProxySetup_Password: String { return self._s[1014]! } - public var Settings_Passport: String { return self._s[1015]! } - public var Channel_MessagePhotoUpdated: String { return self._s[1017]! } - public var Stats_LanguagesTitle: String { return self._s[1018]! } - public var ChatList_PeerTypeGroup: String { return self._s[1019]! } - public var Privacy_Calls_P2PHelp: String { return self._s[1020]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[1021]! } - public var Embed_PlayingInPIP: String { return self._s[1022]! } - public var BlockedUsers_BlockUser: String { return self._s[1025]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1026]! } + public var Notification_CallBack: String { return self._s[994]! } + public var Appearance_Title: String { return self._s[997]! } + public var NotificationsSound_Glass: String { return self._s[999]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[1001]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[1003]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[1004]! } + public var Passport_Identity_AddPassport: String { return self._s[1005]! } + public var GroupPermission_NoAddMembers: String { return self._s[1007]! } + public var ContactList_Context_SendMessage: String { return self._s[1008]! } + public var PhotoEditor_GrainTool: String { return self._s[1009]! } + public var Settings_CopyPhoneNumber: String { return self._s[1010]! } + public var Passport_Address_City: String { return self._s[1011]! } + public var VoiceChat_LeaveAndCancelVoiceChat: String { return self._s[1012]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[1013]! } + public var SocksProxySetup_Password: String { return self._s[1015]! } + public var Settings_Passport: String { return self._s[1016]! } + public var Channel_MessagePhotoUpdated: String { return self._s[1018]! } + public var Stats_LanguagesTitle: String { return self._s[1019]! } + public var ChatList_PeerTypeGroup: String { return self._s[1020]! } + public var Privacy_Calls_P2PHelp: String { return self._s[1021]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[1022]! } + public var Embed_PlayingInPIP: String { return self._s[1023]! } + public var BlockedUsers_BlockUser: String { return self._s[1026]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1027]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1027]!, self._r[1027]!, [_1]) + return formatWithArgumentRanges(self._s[1028]!, self._r[1028]!, [_1]) } - public var AuthSessions_LoggedIn: String { return self._s[1028]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[1029]! } - public var Activity_UploadingDocument: String { return self._s[1030]! } - public var PeopleNearby_NoMembers: String { return self._s[1031]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1034]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1035]! } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[1036]! } - public var InstantPage_VoiceOver_IncreaseFontSize: String { return self._s[1037]! } - public var Settings_ViewVideo: String { return self._s[1038]! } - public var Map_ShowPlaces: String { return self._s[1040]! } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1041]! } - public var InviteLink_Create_Title: String { return self._s[1042]! } - public var Notification_CreatedGroup: String { return self._s[1043]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[1044]! } + public var AuthSessions_LoggedIn: String { return self._s[1029]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[1030]! } + public var Activity_UploadingDocument: String { return self._s[1031]! } + public var PeopleNearby_NoMembers: String { return self._s[1032]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1035]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1036]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[1037]! } + public var InstantPage_VoiceOver_IncreaseFontSize: String { return self._s[1038]! } + public var Settings_ViewVideo: String { return self._s[1039]! } + public var Map_ShowPlaces: String { return self._s[1041]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1042]! } + public var InviteLink_Create_Title: String { return self._s[1043]! } + public var Notification_CreatedGroup: String { return self._s[1044]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[1045]! } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1045]!, self._r[1045]!, [_0]) + return formatWithArgumentRanges(self._s[1046]!, self._r[1046]!, [_0]) } - public var Conversation_StatusLeftGroup: String { return self._s[1046]! } - public var Theme_Colors_Messages: String { return self._s[1047]! } - public var AuthSessions_EmptyText: String { return self._s[1048]! } + public var Conversation_StatusLeftGroup: String { return self._s[1047]! } + public var Theme_Colors_Messages: String { return self._s[1048]! } + public var AuthSessions_EmptyText: String { return self._s[1049]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1049]!, self._r[1049]!, [_1]) + return formatWithArgumentRanges(self._s[1050]!, self._r[1050]!, [_1]) } - public var UserInfo_StartSecretChat: String { return self._s[1050]! } - public var ChatListFolderSettings_EditFoldersInfo: String { return self._s[1051]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[1052]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1053]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1055]! } - public var PeerInfo_PaneFiles: String { return self._s[1056]! } - public var VoiceChat_DisplayAs: String { return self._s[1057]! } - public var PrivacySettings_AutoArchive: String { return self._s[1058]! } - public var Camera_VideoMode: String { return self._s[1059]! } - public var NotificationsSound_Alert: String { return self._s[1060]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1061]! } - public var Appearance_AutoNightTheme: String { return self._s[1062]! } - public var Passport_Language_he: String { return self._s[1063]! } - public var Passport_InvalidPasswordError: String { return self._s[1064]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1065]! } - public var UserInfo_InviteBotToGroup: String { return self._s[1066]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[1067]! } - public var Common_TakePhoto: String { return self._s[1068]! } + public var UserInfo_StartSecretChat: String { return self._s[1051]! } + public var ChatListFolderSettings_EditFoldersInfo: String { return self._s[1052]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[1053]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1054]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1056]! } + public var PeerInfo_PaneFiles: String { return self._s[1057]! } + public var VoiceChat_DisplayAs: String { return self._s[1058]! } + public var PrivacySettings_AutoArchive: String { return self._s[1059]! } + public var Camera_VideoMode: String { return self._s[1060]! } + public var NotificationsSound_Alert: String { return self._s[1061]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1062]! } + public var Appearance_AutoNightTheme: String { return self._s[1063]! } + public var Passport_Language_he: String { return self._s[1064]! } + public var Passport_InvalidPasswordError: String { return self._s[1065]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1066]! } + public var UserInfo_InviteBotToGroup: String { return self._s[1067]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[1068]! } + public var Common_TakePhoto: String { return self._s[1069]! } public func Channel_AdminLog_RevokedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1069]!, self._r[1069]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1070]!, self._r[1070]!, [_1, _2]) } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[1070]! } - public var ChatList_Context_JoinChannel: String { return self._s[1071]! } - public var MediaPlayer_UnknownArtist: String { return self._s[1072]! } - public var VoiceChat_EditDescriptionText: String { return self._s[1073]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[1076]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1077]! } - public var EditTheme_UploadEditedTheme: String { return self._s[1078]! } - public var Settings_SetProfilePhotoOrVideo: String { return self._s[1080]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[1081]! } - public var MessagePoll_ViewResults: String { return self._s[1082]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[1083]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[1071]! } + public var ChatList_Context_JoinChannel: String { return self._s[1072]! } + public var MediaPlayer_UnknownArtist: String { return self._s[1073]! } + public var VoiceChat_EditDescriptionText: String { return self._s[1074]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[1077]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1078]! } + public var EditTheme_UploadEditedTheme: String { return self._s[1079]! } + public var Settings_SetProfilePhotoOrVideo: String { return self._s[1081]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[1082]! } + public var MessagePoll_ViewResults: String { return self._s[1083]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[1084]! } public func UserInfo_ContactForwardTooltip_Chat_One(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1084]!, self._r[1084]!, [_0]) + return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_0]) } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1085]! } - public var Privacy_PaymentsClear_ShippingInfoCleared: String { return self._s[1086]! } - public var ChatList_Search_ShowLess: String { return self._s[1087]! } - public var InviteLink_Create_UsersLimitNoLimit: String { return self._s[1088]! } - public var UserInfo_ShareBot: String { return self._s[1089]! } - public var Privacy_Calls_P2P: String { return self._s[1091]! } - public var WebBrowser_InAppSafari: String { return self._s[1092]! } - public var SharedMedia_EmptyFilesText: String { return self._s[1095]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[1096]! } - public var GroupInfo_SetSound: String { return self._s[1097]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1098]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1086]! } + public var Privacy_PaymentsClear_ShippingInfoCleared: String { return self._s[1087]! } + public var ChatList_Search_ShowLess: String { return self._s[1088]! } + public var InviteLink_Create_UsersLimitNoLimit: String { return self._s[1089]! } + public var UserInfo_ShareBot: String { return self._s[1090]! } + public var Privacy_Calls_P2P: String { return self._s[1092]! } + public var WebBrowser_InAppSafari: String { return self._s[1093]! } + public var SharedMedia_EmptyFilesText: String { return self._s[1096]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[1097]! } + public var GroupInfo_SetSound: String { return self._s[1098]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1099]! } public func Conversation_AutoremoveRemainingTime(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1099]!, self._r[1099]!, [_0]) + return formatWithArgumentRanges(self._s[1100]!, self._r[1100]!, [_0]) } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1100]! } - public var Channel_AdminLogFilter_EventsAll: String { return self._s[1101]! } - public var CallSettings_UseLessData: String { return self._s[1102]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[1103]! } - public var NotificationsSound_Chord: String { return self._s[1104]! } - public var PhotoEditor_CurvesTool: String { return self._s[1105]! } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1106]! } - public var Resolve_ErrorNotFound: String { return self._s[1107]! } - public var Activity_PlayingGame: String { return self._s[1108]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1101]! } + public var Channel_AdminLogFilter_EventsAll: String { return self._s[1102]! } + public var CallSettings_UseLessData: String { return self._s[1103]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[1104]! } + public var NotificationsSound_Chord: String { return self._s[1105]! } + public var PhotoEditor_CurvesTool: String { return self._s[1106]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1107]! } + public var Resolve_ErrorNotFound: String { return self._s[1108]! } + public var Activity_PlayingGame: String { return self._s[1109]! } public func VoiceChat_InvitedPeerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1112]!, self._r[1112]!, [_0]) + return formatWithArgumentRanges(self._s[1113]!, self._r[1113]!, [_0]) } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1113]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1114]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1114]!, self._r[1114]!, [_1]) + return formatWithArgumentRanges(self._s[1115]!, self._r[1115]!, [_1]) } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[1115]! } - public var Notification_CallIncoming: String { return self._s[1116]! } - public var Stats_EnabledNotifications: String { return self._s[1117]! } - public var Notification_VoiceChatStartedChannel: String { return self._s[1118]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1119]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1120]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[1116]! } + public var Notification_CallIncoming: String { return self._s[1117]! } + public var Stats_EnabledNotifications: String { return self._s[1118]! } + public var Notification_VoiceChatStartedChannel: String { return self._s[1119]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1120]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1121]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1121]!, self._r[1121]!, [_0]) + return formatWithArgumentRanges(self._s[1122]!, self._r[1122]!, [_0]) } - public var VoiceChat_StatusMutedYou: String { return self._s[1122]! } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[1123]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[1124]! } - public var StickerPacksSettings_Title: String { return self._s[1125]! } + public var VoiceChat_StatusMutedYou: String { return self._s[1123]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[1124]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[1125]! } + public var StickerPacksSettings_Title: String { return self._s[1126]! } public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1126]!, self._r[1126]!, [_0]) + return formatWithArgumentRanges(self._s[1127]!, self._r[1127]!, [_0]) } - public var Watch_NoConnection: String { return self._s[1127]! } - public var EncryptionKey_Title: String { return self._s[1128]! } - public var Widget_AuthRequired: String { return self._s[1129]! } + public var Watch_NoConnection: String { return self._s[1128]! } + public var EncryptionKey_Title: String { return self._s[1129]! } + public var Widget_AuthRequired: String { return self._s[1130]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1130]!, self._r[1130]!, [_1]) + return formatWithArgumentRanges(self._s[1131]!, self._r[1131]!, [_1]) } - public var Notifications_ExceptionsTitle: String { return self._s[1131]! } - public var EditTheme_Expand_TopInfo: String { return self._s[1132]! } + public var Notifications_ExceptionsTitle: String { return self._s[1132]! } + public var EditTheme_Expand_TopInfo: String { return self._s[1133]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1133]!, self._r[1133]!, [_0]) + return formatWithArgumentRanges(self._s[1134]!, self._r[1134]!, [_0]) } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[1135]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1136]! } - public var VoiceChat_SpeakPermissionAdmin: String { return self._s[1137]! } - public var Passport_Email_EnterOtherEmail: String { return self._s[1138]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[1136]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1137]! } + public var VoiceChat_SpeakPermissionAdmin: String { return self._s[1138]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1139]! } public func VoiceChat_RemovePeerConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1141]!, self._r[1141]!, [_0]) + return formatWithArgumentRanges(self._s[1142]!, self._r[1142]!, [_0]) } - public var Conversation_AddToContacts: String { return self._s[1142]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[1143]! } - public var AuthSessions_LogOutApplications: String { return self._s[1145]! } - public var VoiceChat_LeaveVoiceChat: String { return self._s[1146]! } - public var ChatList_Context_Unpin: String { return self._s[1147]! } - public var PeopleNearby_DiscoverDescription: String { return self._s[1148]! } - public var UserInfo_FakeBotWarning: String { return self._s[1149]! } - public var Notification_MessageLifetime1d: String { return self._s[1150]! } - public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[1151]! } - public var ChatListFolder_CategoryChannels: String { return self._s[1152]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[1153]! } - public var Notifications_PermissionsAllow: String { return self._s[1154]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[1155]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1157]! } - public var VoiceChat_ImproveYourProfileText: String { return self._s[1158]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1159]! } - public var ChatImportActivity_ErrorInvalidChatType: String { return self._s[1160]! } + public var Conversation_AddToContacts: String { return self._s[1143]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[1144]! } + public var AuthSessions_LogOutApplications: String { return self._s[1146]! } + public var VoiceChat_LeaveVoiceChat: String { return self._s[1147]! } + public var ChatList_Context_Unpin: String { return self._s[1148]! } + public var PeopleNearby_DiscoverDescription: String { return self._s[1149]! } + public var UserInfo_FakeBotWarning: String { return self._s[1150]! } + public var Notification_MessageLifetime1d: String { return self._s[1151]! } + public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[1152]! } + public var ChatListFolder_CategoryChannels: String { return self._s[1153]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[1154]! } + public var Notifications_PermissionsAllow: String { return self._s[1155]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[1156]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1158]! } + public var VoiceChat_ImproveYourProfileText: String { return self._s[1159]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1160]! } + public var ChatImportActivity_ErrorInvalidChatType: String { return self._s[1161]! } public func Conversation_ScheduledVoiceChatStartsToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1161]!, self._r[1161]!, [_0]) - } - public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1162]!, self._r[1162]!, [_0]) } - public var Conversation_AutoremoveTimerRemovedChannel: String { return self._s[1164]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[1166]! } - public var WallpaperSearch_ColorPink: String { return self._s[1167]! } - public var ContactInfo_PhoneNumberHidden: String { return self._s[1168]! } - public var Passport_Identity_IssueDate: String { return self._s[1170]! } + public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1163]!, self._r[1163]!, [_0]) + } + public var Conversation_AutoremoveTimerRemovedChannel: String { return self._s[1165]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[1167]! } + public var WallpaperSearch_ColorPink: String { return self._s[1168]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[1169]! } + public var Passport_Identity_IssueDate: String { return self._s[1171]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1171]!, self._r[1171]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1172]!, self._r[1172]!, [_1, _2]) } - public var ChatList_DeleteForAllSubscribersConfirmationText: String { return self._s[1172]! } - public var Channel_Info_Description: String { return self._s[1173]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1174]! } - public var Weekday_ShortTuesday: String { return self._s[1175]! } - public var Common_Back: String { return self._s[1176]! } - public var Chat_PinnedMessagesHiddenTitle: String { return self._s[1178]! } - public var ChatListFolder_AddChats: String { return self._s[1179]! } - public var Common_Close: String { return self._s[1181]! } - public var Map_OpenIn: String { return self._s[1182]! } - public var Group_Setup_HistoryTitle: String { return self._s[1183]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[1184]! } - public var Notification_MessageLifetime1h: String { return self._s[1185]! } + public var ChatList_DeleteForAllSubscribersConfirmationText: String { return self._s[1173]! } + public var Channel_Info_Description: String { return self._s[1174]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1175]! } + public var Weekday_ShortTuesday: String { return self._s[1176]! } + public var Common_Back: String { return self._s[1177]! } + public var Chat_PinnedMessagesHiddenTitle: String { return self._s[1179]! } + public var ChatListFolder_AddChats: String { return self._s[1180]! } + public var Common_Close: String { return self._s[1182]! } + public var Map_OpenIn: String { return self._s[1183]! } + public var Group_Setup_HistoryTitle: String { return self._s[1184]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[1185]! } + public var Notification_MessageLifetime1h: String { return self._s[1186]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1186]!, self._r[1186]!, [_0]) + return formatWithArgumentRanges(self._s[1187]!, self._r[1187]!, [_0]) } - public var Watch_Contacts_NoResults: String { return self._s[1188]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1189]! } - public var Checkout_Phone: String { return self._s[1190]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[1191]! } + public var Watch_Contacts_NoResults: String { return self._s[1189]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1190]! } + public var Checkout_Phone: String { return self._s[1191]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[1192]! } public func Channel_CommentsGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1192]!, self._r[1192]!, [_0]) + return formatWithArgumentRanges(self._s[1193]!, self._r[1193]!, [_0]) } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1193]!, self._r[1193]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1194]!, self._r[1194]!, ["\(_0)"]) } - public var Conversation_AudioRateTooltipSpeedUp: String { return self._s[1194]! } - public var ChatAdmins_Title: String { return self._s[1195]! } - public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[1196]! } + public var Conversation_AudioRateTooltipSpeedUp: String { return self._s[1195]! } + public var ChatAdmins_Title: String { return self._s[1196]! } + public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[1197]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1197]!, self._r[1197]!, [_1]) + return formatWithArgumentRanges(self._s[1198]!, self._r[1198]!, [_1]) } - public var Common_Done: String { return self._s[1198]! } - public var ChatList_HeaderImportIntoAnExistingGroup: String { return self._s[1199]! } - public var Appearance_ThemeCarouselNight: String { return self._s[1202]! } + public var Common_Done: String { return self._s[1199]! } + public var ChatList_HeaderImportIntoAnExistingGroup: String { return self._s[1200]! } + public var Appearance_AppIconNew2: String { return self._s[1201]! } public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, [_1]) + return formatWithArgumentRanges(self._s[1205]!, self._r[1205]!, [_1]) } - public var InviteLink_Expired: String { return self._s[1206]! } - public var Preview_OpenInInstagram: String { return self._s[1207]! } - public var Wallpaper_SetColor: String { return self._s[1212]! } - public var VoiceOver_Media_PlaybackRate: String { return self._s[1213]! } - public var ChatSettings_Groups: String { return self._s[1214]! } + public var Appearance_ThemeCarouselNight: String { return self._s[1206]! } + public var InviteLink_Expired: String { return self._s[1208]! } + public var Preview_OpenInInstagram: String { return self._s[1209]! } + public var Wallpaper_SetColor: String { return self._s[1214]! } + public var VoiceOver_Media_PlaybackRate: String { return self._s[1215]! } + public var ChatSettings_Groups: String { return self._s[1216]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1215]!, self._r[1215]!, [_0]) + return formatWithArgumentRanges(self._s[1217]!, self._r[1217]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[1216]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1217]! } - public var Channel_Management_LabelCreator: String { return self._s[1218]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1219]! } + public var Contacts_SortedByName: String { return self._s[1218]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1219]! } + public var Channel_Management_LabelCreator: String { return self._s[1220]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1221]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1220]!, self._r[1220]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1222]!, self._r[1222]!, [_0, _1]) } - public var Group_GroupMembersHeader: String { return self._s[1221]! } - public var Group_PublicLink_Title: String { return self._s[1222]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1223]! } - public var VoiceOver_Chat_Photo: String { return self._s[1224]! } - public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[1225]! } - public var IntentsSettings_SuggestBy: String { return self._s[1226]! } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[1227]! } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1228]! } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1229]! } - public var LogoutOptions_SetPasscodeText: String { return self._s[1230]! } - public var Map_OpenInMaps: String { return self._s[1231]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[1232]! } - public var BlockedUsers_Unblock: String { return self._s[1233]! } + public var Group_GroupMembersHeader: String { return self._s[1223]! } + public var Group_PublicLink_Title: String { return self._s[1224]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1225]! } + public var VoiceOver_Chat_Photo: String { return self._s[1226]! } + public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[1227]! } + public var IntentsSettings_SuggestBy: String { return self._s[1228]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[1229]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1230]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1231]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1232]! } + public var Map_OpenInMaps: String { return self._s[1233]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[1234]! } + public var BlockedUsers_Unblock: String { return self._s[1235]! } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1234]!, self._r[1234]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1236]!, self._r[1236]!, [_1, _2]) } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1235]!, self._r[1235]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1237]!, self._r[1237]!, [_1, _2]) } - public var ChatImport_CreateGroupAlertTitle: String { return self._s[1237]! } - public var Conversation_Block: String { return self._s[1238]! } - public var VoiceChat_PersonalAccount: String { return self._s[1239]! } - public var Passport_Scans_UploadNew: String { return self._s[1240]! } - public var Share_Title: String { return self._s[1241]! } - public var Conversation_ApplyLocalization: String { return self._s[1242]! } - public var SharedMedia_EmptyLinksText: String { return self._s[1243]! } - public var Settings_NotificationsAndSounds: String { return self._s[1244]! } - public var Stats_ViewsByHoursTitle: String { return self._s[1245]! } - public var PhotoEditor_QualityMedium: String { return self._s[1246]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[1247]! } + public var ChatImport_CreateGroupAlertTitle: String { return self._s[1239]! } + public var Conversation_Block: String { return self._s[1240]! } + public var VoiceChat_PersonalAccount: String { return self._s[1241]! } + public var Passport_Scans_UploadNew: String { return self._s[1242]! } + public var Share_Title: String { return self._s[1243]! } + public var Conversation_ApplyLocalization: String { return self._s[1244]! } + public var SharedMedia_EmptyLinksText: String { return self._s[1245]! } + public var Settings_NotificationsAndSounds: String { return self._s[1246]! } + public var Stats_ViewsByHoursTitle: String { return self._s[1247]! } + public var PhotoEditor_QualityMedium: String { return self._s[1248]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[1249]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1248]!, self._r[1248]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1250]!, self._r[1250]!, [_1, _2]) } - public var Conversation_RestrictedInline: String { return self._s[1249]! } - public var Passport_Language_tr: String { return self._s[1250]! } - public var Call_Mute: String { return self._s[1251]! } + public var Conversation_RestrictedInline: String { return self._s[1251]! } + public var Passport_Language_tr: String { return self._s[1252]! } + public var Call_Mute: String { return self._s[1253]! } public func Conversation_NoticeInvitedByInGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1252]!, self._r[1252]!, [_0]) + return formatWithArgumentRanges(self._s[1254]!, self._r[1254]!, [_0]) } - public var Passport_Language_bn: String { return self._s[1253]! } - public var Common_Save: String { return self._s[1255]! } - public var AccessDenied_LocationTracking: String { return self._s[1257]! } - public var Month_ShortOctober: String { return self._s[1258]! } - public var AutoDownloadSettings_WiFi: String { return self._s[1259]! } - public var ProfilePhoto_SetMainPhoto: String { return self._s[1261]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[1262]! } + public var Passport_Language_bn: String { return self._s[1255]! } + public var Common_Save: String { return self._s[1257]! } + public var AccessDenied_LocationTracking: String { return self._s[1259]! } + public var Month_ShortOctober: String { return self._s[1260]! } + public var AutoDownloadSettings_WiFi: String { return self._s[1261]! } + public var ProfilePhoto_SetMainPhoto: String { return self._s[1263]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[1264]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1263]!, self._r[1263]!, [_0]) + return formatWithArgumentRanges(self._s[1265]!, self._r[1265]!, [_0]) } - public var Watch_ChannelInfo_Title: String { return self._s[1264]! } - public var State_Updating: String { return self._s[1265]! } - public var Conversation_UnblockUser: String { return self._s[1266]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1267]! } - public var Map_GetDirections: String { return self._s[1268]! } - public var Watch_Compose_AddContact: String { return self._s[1270]! } - public var Conversation_Dice_u26BD: String { return self._s[1271]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1272]! } + public var Watch_ChannelInfo_Title: String { return self._s[1266]! } + public var State_Updating: String { return self._s[1267]! } + public var Conversation_UnblockUser: String { return self._s[1268]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1269]! } + public var Map_GetDirections: String { return self._s[1270]! } + public var Watch_Compose_AddContact: String { return self._s[1272]! } + public var Conversation_Dice_u26BD: String { return self._s[1273]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1274]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1273]!, self._r[1273]!, [_1]) + return formatWithArgumentRanges(self._s[1275]!, self._r[1275]!, [_1]) } - public var Map_LoadError: String { return self._s[1275]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[1276]! } - public var PhotoEditor_CropAuto: String { return self._s[1277]! } + public var Map_LoadError: String { return self._s[1277]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[1278]! } + public var PhotoEditor_CropAuto: String { return self._s[1279]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1280]!, self._r[1280]!, [_0]) + return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_0]) } - public var Username_TooManyPublicUsernamesError: String { return self._s[1282]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[1284]! } public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1283]!, self._r[1283]!, [_1]) - } - public var Settings_PhoneNumber: String { return self._s[1284]! } - public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_1]) } - public var Month_GenJune: String { return self._s[1287]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[1288]! } - public var ChatListFolder_CategoryRead: String { return self._s[1289]! } - public var LoginPassword_ResetAccount: String { return self._s[1290]! } + public var Settings_PhoneNumber: String { return self._s[1286]! } + public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1]) + } + public var Month_GenJune: String { return self._s[1289]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[1290]! } + public var ChatListFolder_CategoryRead: String { return self._s[1291]! } + public var LoginPassword_ResetAccount: String { return self._s[1292]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1291]!, self._r[1291]!, [_0]) + return formatWithArgumentRanges(self._s[1293]!, self._r[1293]!, [_0]) } - public var Call_CameraConfirmationConfirm: String { return self._s[1292]! } - public var Notification_RenamedChannel: String { return self._s[1293]! } + public var Call_CameraConfirmationConfirm: String { return self._s[1294]! } + public var Notification_RenamedChannel: String { return self._s[1295]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1294]!, self._r[1294]!, [_0]) + return formatWithArgumentRanges(self._s[1296]!, self._r[1296]!, [_0]) } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[1295]! } - public var IntentsSettings_Title: String { return self._s[1297]! } - public var CallList_DeleteAllForMe: String { return self._s[1298]! } - public var Settings_AppleWatch: String { return self._s[1299]! } - public var Conversation_LinkCopied: String { return self._s[1300]! } - public var DialogList_NoMessagesText: String { return self._s[1301]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[1297]! } + public var IntentsSettings_Title: String { return self._s[1299]! } + public var CallList_DeleteAllForMe: String { return self._s[1300]! } + public var Settings_AppleWatch: String { return self._s[1301]! } + public var Conversation_LinkCopied: String { return self._s[1302]! } + public var DialogList_NoMessagesText: String { return self._s[1303]! } public func VoiceChat_SendPublicLinkText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1302]!, self._r[1302]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1304]!, self._r[1304]!, [_1, _2]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1303]! } - public var Channel_ErrorAccessDenied: String { return self._s[1305]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1306]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1305]! } + public var Channel_ErrorAccessDenied: String { return self._s[1307]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1308]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1307]!, self._r[1307]!, [_0]) + return formatWithArgumentRanges(self._s[1309]!, self._r[1309]!, [_0]) } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1308]! } - public var StickerPacksSettings_AnimatedStickers: String { return self._s[1309]! } - public var Month_ShortJanuary: String { return self._s[1310]! } - public var Conversation_UnreadMessages: String { return self._s[1311]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[1313]! } - public var Call_VoiceOver_VideoCallCanceled: String { return self._s[1314]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[1316]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1317]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1310]! } + public var StickerPacksSettings_AnimatedStickers: String { return self._s[1311]! } + public var Month_ShortJanuary: String { return self._s[1312]! } + public var Conversation_UnreadMessages: String { return self._s[1313]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[1315]! } + public var Call_VoiceOver_VideoCallCanceled: String { return self._s[1316]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[1318]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1319]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1321]!, self._r[1321]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1323]!, self._r[1323]!, [_1, _2]) } - public var Widget_ApplicationLocked: String { return self._s[1322]! } + public var Widget_ApplicationLocked: String { return self._s[1324]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1323]!, self._r[1323]!, [_0]) + return formatWithArgumentRanges(self._s[1325]!, self._r[1325]!, [_0]) } - public var Common_TakePhotoOrVideo: String { return self._s[1324]! } - public var Passport_Language_ru: String { return self._s[1326]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[1327]! } - public var EditTheme_ErrorLinkTaken: String { return self._s[1328]! } + public var Common_TakePhotoOrVideo: String { return self._s[1326]! } + public var Passport_Language_ru: String { return self._s[1328]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[1329]! } + public var EditTheme_ErrorLinkTaken: String { return self._s[1330]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1330]!, self._r[1330]!, [_0]) + return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_0]) } - public var VoiceChat_ShareShort: String { return self._s[1331]! } - public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[1332]! } - public var Conversation_Owner: String { return self._s[1334]! } - public var Settings_FAQ_Intro: String { return self._s[1335]! } - public var PhotoEditor_QualityLow: String { return self._s[1337]! } - public var Widget_GalleryTitle: String { return self._s[1338]! } - public var Call_End: String { return self._s[1339]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1341]! } - public var Privacy_ContactsSyncHelp: String { return self._s[1342]! } - public var OldChannels_NoticeUpgradeText: String { return self._s[1346]! } - public var Conversation_Call: String { return self._s[1348]! } - public var Watch_MessageView_Title: String { return self._s[1349]! } + public var VoiceChat_ShareShort: String { return self._s[1333]! } + public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[1334]! } + public var Conversation_Owner: String { return self._s[1336]! } + public var Settings_FAQ_Intro: String { return self._s[1337]! } + public var PhotoEditor_QualityLow: String { return self._s[1339]! } + public var Widget_GalleryTitle: String { return self._s[1340]! } + public var Call_End: String { return self._s[1341]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1343]! } + public var Privacy_ContactsSyncHelp: String { return self._s[1344]! } + public var OldChannels_NoticeUpgradeText: String { return self._s[1348]! } + public var Conversation_Call: String { return self._s[1350]! } + public var Watch_MessageView_Title: String { return self._s[1351]! } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_0]) - } - public var Passport_PasswordCompleteSetup: String { return self._s[1351]! } - public func Notification_ChangedGroupVideo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1352]!, self._r[1352]!, [_0]) } - public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Passport_PasswordCompleteSetup: String { return self._s[1353]! } + public func Notification_ChangedGroupVideo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_0]) } - public var Map_Location: String { return self._s[1355]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1356]! } - public var Login_CountryCode: String { return self._s[1357]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[1359]! } - public var ChatState_ConnectingToProxy: String { return self._s[1360]! } - public var Login_CallRequestState3: String { return self._s[1361]! } - public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[1364]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1365]! } - public var Widget_ChatsGalleryDescription: String { return self._s[1367]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[1369]! } - public var InstantPage_FontSanFrancisco: String { return self._s[1370]! } - public var Call_StatusEnded: String { return self._s[1371]! } + public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1356]!, self._r[1356]!, [_0]) + } + public var Map_Location: String { return self._s[1357]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1358]! } + public var Login_CountryCode: String { return self._s[1359]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[1361]! } + public var ChatState_ConnectingToProxy: String { return self._s[1362]! } + public var Login_CallRequestState3: String { return self._s[1363]! } + public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[1366]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1367]! } + public var Widget_ChatsGalleryDescription: String { return self._s[1369]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[1371]! } + public var InstantPage_FontSanFrancisco: String { return self._s[1372]! } + public var Call_StatusEnded: String { return self._s[1373]! } public func Checkout_SuccessfulTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1374]!, self._r[1374]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_1, _2]) } - public var MusicPlayer_VoiceNote: String { return self._s[1375]! } - public var ChatImportActivity_ErrorUserBlocked: String { return self._s[1376]! } + public var MusicPlayer_VoiceNote: String { return self._s[1377]! } + public var ChatImportActivity_ErrorUserBlocked: String { return self._s[1378]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1377]!, self._r[1377]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1379]!, self._r[1379]!, [_1, _2]) } - public var VoiceOver_MessageContextShare: String { return self._s[1378]! } - public var ProfilePhoto_SearchWeb: String { return self._s[1379]! } - public var EditProfile_Title: String { return self._s[1380]! } + public var VoiceOver_MessageContextShare: String { return self._s[1380]! } + public var ProfilePhoto_SearchWeb: String { return self._s[1381]! } + public var EditProfile_Title: String { return self._s[1382]! } public func Notification_PinnedQuizMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1381]!, self._r[1381]!, [_0]) + return formatWithArgumentRanges(self._s[1383]!, self._r[1383]!, [_0]) } - public var VoiceChat_Unmute: String { return self._s[1382]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[1383]! } - public var NetworkUsageSettings_ResetStats: String { return self._s[1385]! } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[1386]! } - public var StickerPackActionInfo_AddedTitle: String { return self._s[1387]! } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[1388]! } + public var VoiceChat_Unmute: String { return self._s[1384]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[1385]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1387]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[1388]! } + public var StickerPackActionInfo_AddedTitle: String { return self._s[1389]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[1390]! } public func Call_ParticipantVideoVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1389]!, self._r[1389]!, [_0]) + return formatWithArgumentRanges(self._s[1391]!, self._r[1391]!, [_0]) } - public var Location_ProximityNotification_Title: String { return self._s[1390]! } - public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[1391]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1394]! } - public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[1395]! } - public var Stats_GroupMembersTitle: String { return self._s[1396]! } - public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[1397]! } - public var InviteLink_InviteLinkRevoked: String { return self._s[1398]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1399]! } - public var OpenFile_PotentiallyDangerousContentAlert: String { return self._s[1400]! } - public var Settings_SetUsername: String { return self._s[1401]! } - public var GroupInfo_ActionRestrict: String { return self._s[1402]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1403]! } + public var Location_ProximityNotification_Title: String { return self._s[1392]! } + public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[1393]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1396]! } + public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[1397]! } + public var Stats_GroupMembersTitle: String { return self._s[1398]! } + public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[1399]! } + public var InviteLink_InviteLinkRevoked: String { return self._s[1400]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1401]! } + public var OpenFile_PotentiallyDangerousContentAlert: String { return self._s[1402]! } + public var Settings_SetUsername: String { return self._s[1403]! } + public var GroupInfo_ActionRestrict: String { return self._s[1404]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1405]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1404]!, self._r[1404]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1406]!, self._r[1406]!, [_1, _2, _3]) } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1406]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1407]! } - public var Conversation_ContextMenuDelete: String { return self._s[1408]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[1409]! } - public var ChatList_PsaAlert_covid: String { return self._s[1412]! } - public var VoiceOver_SilentPostOn: String { return self._s[1413]! } - public var DialogList_Pin: String { return self._s[1414]! } - public var Channel_AdminLog_CanInviteUsersViaLink: String { return self._s[1415]! } - public var PrivacySettings_SecurityTitle: String { return self._s[1416]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[1417]! } - public var PeopleNearby_Groups: String { return self._s[1418]! } - public var Message_File: String { return self._s[1419]! } - public var Calls_NoCallsPlaceholder: String { return self._s[1420]! } - public var ChatList_GenericPsaLabel: String { return self._s[1423]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[1424]! } - public var IntentsSettings_Reset: String { return self._s[1426]! } - public var Call_ConnectionErrorTitle: String { return self._s[1427]! } - public var PhotoEditor_SaturationTool: String { return self._s[1428]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[1429]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1430]! } - public var Conversation_SearchNoResults: String { return self._s[1431]! } - public var Channel_DiscussionGroup_PrivateChannel: String { return self._s[1432]! } - public var Map_OpenInWaze: String { return self._s[1433]! } - public var InviteLink_PeopleJoinedNone: String { return self._s[1434]! } - public var WallpaperPreview_Title: String { return self._s[1435]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1408]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1409]! } + public var Conversation_ContextMenuDelete: String { return self._s[1410]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[1411]! } + public var ChatList_PsaAlert_covid: String { return self._s[1414]! } + public var VoiceOver_SilentPostOn: String { return self._s[1415]! } + public var DialogList_Pin: String { return self._s[1416]! } + public var Channel_AdminLog_CanInviteUsersViaLink: String { return self._s[1417]! } + public var PrivacySettings_SecurityTitle: String { return self._s[1418]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[1419]! } + public var PeopleNearby_Groups: String { return self._s[1420]! } + public var Message_File: String { return self._s[1421]! } + public var Calls_NoCallsPlaceholder: String { return self._s[1422]! } + public var ChatList_GenericPsaLabel: String { return self._s[1425]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[1426]! } + public var IntentsSettings_Reset: String { return self._s[1428]! } + public var Call_ConnectionErrorTitle: String { return self._s[1429]! } + public var PhotoEditor_SaturationTool: String { return self._s[1430]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[1431]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1432]! } + public var Conversation_SearchNoResults: String { return self._s[1433]! } + public var Channel_DiscussionGroup_PrivateChannel: String { return self._s[1434]! } + public var Map_OpenInWaze: String { return self._s[1435]! } + public var InviteLink_PeopleJoinedNone: String { return self._s[1436]! } + public var WallpaperPreview_Title: String { return self._s[1437]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1437]!, self._r[1437]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1439]!, self._r[1439]!, [_1, _2]) } - public var AuthSessions_AddDeviceIntro_Title: String { return self._s[1438]! } - public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[1439]! } - public var VoiceOver_Chat_ChannelInfo: String { return self._s[1440]! } - public var Conversation_ImageCopied: String { return self._s[1441]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[1442]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[1444]! } - public var Stats_Total: String { return self._s[1447]! } - public var Stats_GroupMessages: String { return self._s[1448]! } - public var TwoFactorSetup_Email_SkipAction: String { return self._s[1449]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[1450]! } - public var VoiceChat_You: String { return self._s[1451]! } - public var VoiceChat_DisplayAsInfoGroup: String { return self._s[1452]! } - public var Passport_Identity_Translation: String { return self._s[1453]! } - public var Notifications_TextTone: String { return self._s[1456]! } - public var Settings_RemoveConfirmation: String { return self._s[1458]! } - public var ScheduledMessages_Delete: String { return self._s[1459]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[1460]! } - public var Passport_PasswordNext: String { return self._s[1461]! } + public var AuthSessions_AddDeviceIntro_Title: String { return self._s[1440]! } + public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[1441]! } + public var VoiceOver_Chat_ChannelInfo: String { return self._s[1442]! } + public var Conversation_ImageCopied: String { return self._s[1443]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[1444]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[1446]! } + public var Stats_Total: String { return self._s[1449]! } + public var Stats_GroupMessages: String { return self._s[1450]! } + public var TwoFactorSetup_Email_SkipAction: String { return self._s[1451]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[1452]! } + public var VoiceChat_You: String { return self._s[1453]! } + public var VoiceChat_DisplayAsInfoGroup: String { return self._s[1454]! } + public var Passport_Identity_Translation: String { return self._s[1455]! } + public var Notifications_TextTone: String { return self._s[1458]! } + public var Settings_RemoveConfirmation: String { return self._s[1460]! } + public var ScheduledMessages_Delete: String { return self._s[1461]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[1462]! } + public var Passport_PasswordNext: String { return self._s[1463]! } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1462]!, self._r[1462]!, [_1]) + return formatWithArgumentRanges(self._s[1464]!, self._r[1464]!, [_1]) } - public var Passport_Address_EditBankStatement: String { return self._s[1463]! } - public var PhotoEditor_ShadowsTool: String { return self._s[1464]! } - public var Notification_VideoCallMissed: String { return self._s[1465]! } - public var AccessDenied_CameraDisabled: String { return self._s[1467]! } - public var AuthSessions_AddDevice_ScanInfo: String { return self._s[1468]! } - public var Notifications_ExceptionsMuted: String { return self._s[1469]! } - public var VoiceChat_TapToViewScreenVideo: String { return self._s[1470]! } - public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[1471]! } - public var Channel_BlackList_Title: String { return self._s[1472]! } - public var PasscodeSettings_4DigitCode: String { return self._s[1473]! } - public var NotificationsSound_Bamboo: String { return self._s[1474]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[1475]! } - public var Passport_Address_TypeUtilityBill: String { return self._s[1476]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[1477]! } - public var GroupPermission_SectionTitle: String { return self._s[1478]! } - public var InviteLink_ContextRevoke: String { return self._s[1479]! } + public var Passport_Address_EditBankStatement: String { return self._s[1465]! } + public var PhotoEditor_ShadowsTool: String { return self._s[1466]! } + public var Notification_VideoCallMissed: String { return self._s[1467]! } + public var AccessDenied_CameraDisabled: String { return self._s[1469]! } + public var AuthSessions_AddDevice_ScanInfo: String { return self._s[1470]! } + public var Notifications_ExceptionsMuted: String { return self._s[1471]! } + public var VoiceChat_TapToViewScreenVideo: String { return self._s[1472]! } + public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[1473]! } + public var Channel_BlackList_Title: String { return self._s[1474]! } + public var PasscodeSettings_4DigitCode: String { return self._s[1475]! } + public var NotificationsSound_Bamboo: String { return self._s[1476]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[1477]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[1478]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[1479]! } + public var GroupPermission_SectionTitle: String { return self._s[1480]! } + public var InviteLink_ContextRevoke: String { return self._s[1481]! } public func Notification_InvitedMultiple(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1482]!, self._r[1482]!, [_0, _1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1481]! } - public var Channel_LeaveChannel: String { return self._s[1482]! } - public var Watch_Notification_Joined: String { return self._s[1483]! } - public var PeerInfo_ButtonMore: String { return self._s[1484]! } - public var Passport_FieldEmailHelp: String { return self._s[1485]! } - public var ChatList_Context_Pin: String { return self._s[1486]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1483]! } + public var Channel_LeaveChannel: String { return self._s[1484]! } + public var Watch_Notification_Joined: String { return self._s[1485]! } + public var PeerInfo_ButtonMore: String { return self._s[1486]! } + public var Passport_FieldEmailHelp: String { return self._s[1487]! } + public var ChatList_Context_Pin: String { return self._s[1488]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1487]!, self._r[1487]!, [_0]) + return formatWithArgumentRanges(self._s[1489]!, self._r[1489]!, [_0]) } - public var Group_Location_CreateInThisPlace: String { return self._s[1488]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[1489]! } - public var Tour_Title5: String { return self._s[1490]! } + public var Group_Location_CreateInThisPlace: String { return self._s[1490]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[1491]! } + public var Tour_Title5: String { return self._s[1492]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1491]!, self._r[1491]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1493]!, self._r[1493]!, [_1, _2]) } - public var Passport_Language_en: String { return self._s[1492]! } - public var Checkout_Name: String { return self._s[1493]! } - public var ChatImport_Title: String { return self._s[1494]! } + public var Passport_Language_en: String { return self._s[1494]! } + public var Checkout_Name: String { return self._s[1495]! } + public var ChatImport_Title: String { return self._s[1496]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1495]!, self._r[1495]!, [_0]) + return formatWithArgumentRanges(self._s[1497]!, self._r[1497]!, [_0]) } - public var PhotoEditor_EnhanceTool: String { return self._s[1496]! } + public var PhotoEditor_EnhanceTool: String { return self._s[1498]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1497]!, self._r[1497]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1499]!, self._r[1499]!, [_1, _2]) } public func VoiceChat_UserCanNowSpeak(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1498]!, self._r[1498]!, [_0]) - } - public var PeerInfo_CustomizeNotifications: String { return self._s[1499]! } - public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0]) } - public var Group_ErrorSendRestrictedMedia: String { return self._s[1501]! } - public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { + public var PeerInfo_CustomizeNotifications: String { return self._s[1501]! } + public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_0]) } - public var Login_UnknownError: String { return self._s[1503]! } - public var Conversation_ImportedMessageHint: String { return self._s[1505]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[1503]! } + public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_0]) + } + public var Login_UnknownError: String { return self._s[1505]! } + public var Conversation_ImportedMessageHint: String { return self._s[1507]! } public func VoiceChat_ForwardTooltip_Chat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1506]!, self._r[1506]!, [_0]) + return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1508]! } - public var ChatList_AutoarchiveSuggestion_Title: String { return self._s[1509]! } - public var Watch_PhotoView_Title: String { return self._s[1510]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[1511]! } - public var Checkout_TotalAmount: String { return self._s[1512]! } - public var ChatList_RemoveFolderAction: String { return self._s[1513]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1510]! } + public var ChatList_AutoarchiveSuggestion_Title: String { return self._s[1511]! } + public var Watch_PhotoView_Title: String { return self._s[1512]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[1513]! } + public var Checkout_TotalAmount: String { return self._s[1514]! } + public var ChatList_RemoveFolderAction: String { return self._s[1515]! } public func GroupInfo_Permissions_BroadcastConvertInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1514]!, self._r[1514]!, [_0]) + return formatWithArgumentRanges(self._s[1516]!, self._r[1516]!, [_0]) } - public var GroupInfo_SetGroupPhoto: String { return self._s[1515]! } - public var Watch_AppName: String { return self._s[1516]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1517]! } + public var Watch_AppName: String { return self._s[1518]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1517]!, self._r[1517]!, [_1]) + return formatWithArgumentRanges(self._s[1519]!, self._r[1519]!, [_1]) } - public var Channel_Username_CheckingUsername: String { return self._s[1518]! } - public var ContactList_Context_Call: String { return self._s[1519]! } - public var ChatList_ReorderTabs: String { return self._s[1520]! } - public var Watch_ChatList_Compose: String { return self._s[1521]! } + public var Channel_Username_CheckingUsername: String { return self._s[1520]! } + public var ContactList_Context_Call: String { return self._s[1521]! } + public var ChatList_ReorderTabs: String { return self._s[1522]! } + public var Watch_ChatList_Compose: String { return self._s[1523]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1522]!, self._r[1522]!, [_0]) + return formatWithArgumentRanges(self._s[1524]!, self._r[1524]!, [_0]) } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[1523]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1524]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[1525]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1526]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1525]!, self._r[1525]!, [_1]) + return formatWithArgumentRanges(self._s[1527]!, self._r[1527]!, [_1]) } - public var Call_StatusRequesting: String { return self._s[1527]! } - public var Checkout_TotalPaidAmount: String { return self._s[1528]! } - public var Weekday_Friday: String { return self._s[1530]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[1531]! } + public var Call_StatusRequesting: String { return self._s[1529]! } + public var Checkout_TotalPaidAmount: String { return self._s[1530]! } + public var Weekday_Friday: String { return self._s[1532]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[1533]! } public func ChatImport_SelectionConfirmationUserWithoutTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1532]!, self._r[1532]!, [_0]) + return formatWithArgumentRanges(self._s[1534]!, self._r[1534]!, [_0]) } - public var Watch_ChatList_NoConversationsText: String { return self._s[1533]! } - public var Group_Members_AddMembersHelp: String { return self._s[1534]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[1535]! } + public var Group_Members_AddMembersHelp: String { return self._s[1536]! } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_0]) + return formatWithArgumentRanges(self._s[1537]!, self._r[1537]!, [_0]) } - public var SecretVideo_Title: String { return self._s[1536]! } + public var SecretVideo_Title: String { return self._s[1538]! } public func Notification_PinnedStickerMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1539]!, self._r[1539]!, [_0]) + return formatWithArgumentRanges(self._s[1541]!, self._r[1541]!, [_0]) } - public var Undo_Undo: String { return self._s[1540]! } - public var Watch_Microphone_Access: String { return self._s[1541]! } + public var Undo_Undo: String { return self._s[1542]! } + public var Watch_Microphone_Access: String { return self._s[1543]! } public func ChatImport_SelectionConfirmationGroupWithTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1542]!, self._r[1542]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1544]!, self._r[1544]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1543]!, self._r[1543]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_1, _2]) } public func ChatList_Search_NoResultsQueryDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1544]!, self._r[1544]!, [_0]) + return formatWithArgumentRanges(self._s[1546]!, self._r[1546]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[1546]! } - public var TwoFactorSetup_Intro_Action: String { return self._s[1547]! } - public var Passport_Language_ne: String { return self._s[1548]! } - public var TwoStepAuth_EmailHelp: String { return self._s[1550]! } - public var Profile_MessageLifetime2s: String { return self._s[1551]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[1548]! } + public var TwoFactorSetup_Intro_Action: String { return self._s[1549]! } + public var Passport_Language_ne: String { return self._s[1550]! } + public var TwoStepAuth_EmailHelp: String { return self._s[1552]! } + public var Profile_MessageLifetime2s: String { return self._s[1553]! } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1553]!, self._r[1553]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, ["\(_1)"]) } public func Items_NOfM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1554]!, self._r[1554]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1556]!, self._r[1556]!, [_1, _2]) } - public var VoiceChat_SendPublicLinkSend: String { return self._s[1555]! } - public var Media_LimitedAccessText: String { return self._s[1556]! } + public var VoiceChat_SendPublicLinkSend: String { return self._s[1557]! } + public var Media_LimitedAccessText: String { return self._s[1558]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1557]!, self._r[1557]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_1, _2]) } - public var GroupPermission_NoPinMessages: String { return self._s[1558]! } + public var GroupPermission_NoPinMessages: String { return self._s[1560]! } public func Notification_VoiceChatStarted(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_1]) + return formatWithArgumentRanges(self._s[1561]!, self._r[1561]!, [_1]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1560]!, self._r[1560]!, [_0]) + return formatWithArgumentRanges(self._s[1562]!, self._r[1562]!, [_0]) } - public var FastTwoStepSetup_HintHelp: String { return self._s[1561]! } - public var VoiceOver_SilentPostOff: String { return self._s[1562]! } - public var WallpaperSearch_ColorRed: String { return self._s[1563]! } - public var Watch_ConnectionDescription: String { return self._s[1564]! } - public var Notification_Exceptions_AddException: String { return self._s[1565]! } - public var LocalGroup_IrrelevantWarning: String { return self._s[1566]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1567]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1568]! } - public var Passport_PasswordPlaceholder: String { return self._s[1569]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[1570]! } - public var Stats_MessageInteractionsTitle: String { return self._s[1571]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[1572]! } - public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1574]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1575]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[1577]! } - public var Watch_Message_Game: String { return self._s[1578]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1579]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[1580]! } - public var EditTheme_FileReadError: String { return self._s[1581]! } - public var Group_ErrorAddBlocked: String { return self._s[1582]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1583]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[1563]! } + public var VoiceOver_SilentPostOff: String { return self._s[1564]! } + public var WallpaperSearch_ColorRed: String { return self._s[1565]! } + public var Watch_ConnectionDescription: String { return self._s[1566]! } + public var Notification_Exceptions_AddException: String { return self._s[1567]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[1568]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1569]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1570]! } + public var Passport_PasswordPlaceholder: String { return self._s[1571]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[1572]! } + public var Stats_MessageInteractionsTitle: String { return self._s[1573]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[1574]! } + public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1576]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1577]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[1579]! } + public var Watch_Message_Game: String { return self._s[1580]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1581]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[1582]! } + public var EditTheme_FileReadError: String { return self._s[1583]! } + public var Group_ErrorAddBlocked: String { return self._s[1584]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1585]! } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1585]!, self._r[1585]!, [_1]) + return formatWithArgumentRanges(self._s[1587]!, self._r[1587]!, [_1]) } - public var GroupRemoved_ViewChannelInfo: String { return self._s[1586]! } + public var GroupRemoved_ViewChannelInfo: String { return self._s[1588]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1587]!, self._r[1587]!, [_0]) + return formatWithArgumentRanges(self._s[1589]!, self._r[1589]!, [_0]) } - public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[1588]! } - public var TwoFactorSetup_EmailVerification_Action: String { return self._s[1589]! } + public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[1590]! } + public var TwoFactorSetup_EmailVerification_Action: String { return self._s[1591]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1590]!, self._r[1590]!, [_0]) + return formatWithArgumentRanges(self._s[1592]!, self._r[1592]!, [_0]) } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[1591]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[1592]! } - public var PhotoEditor_CurvesRed: String { return self._s[1593]! } - public var InstantPage_TapToOpenLink: String { return self._s[1594]! } - public var InviteLink_PeopleJoinedShortNoneExpired: String { return self._s[1595]! } - public var FastTwoStepSetup_PasswordHelp: String { return self._s[1596]! } - public var Conversation_DiscussionNotStarted: String { return self._s[1597]! } - public var Notification_CallMissedShort: String { return self._s[1598]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[1593]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[1594]! } + public var PhotoEditor_CurvesRed: String { return self._s[1595]! } + public var InstantPage_TapToOpenLink: String { return self._s[1596]! } + public var InviteLink_PeopleJoinedShortNoneExpired: String { return self._s[1597]! } + public var FastTwoStepSetup_PasswordHelp: String { return self._s[1598]! } + public var Conversation_DiscussionNotStarted: String { return self._s[1599]! } + public var Notification_CallMissedShort: String { return self._s[1600]! } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1599]!, self._r[1599]!, [_0]) + return formatWithArgumentRanges(self._s[1601]!, self._r[1601]!, [_0]) } - public var Conversation_DeleteMessagesForEveryone: String { return self._s[1600]! } - public var VoiceChat_UnpinVideo: String { return self._s[1601]! } - public var Permissions_SiriTitle_v0: String { return self._s[1602]! } - public var GroupInfo_AddUserLeftError: String { return self._s[1603]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[1604]! } - public var Paint_Duplicate: String { return self._s[1605]! } - public var AttachmentMenu_WebSearch: String { return self._s[1606]! } - public var Bot_Stop: String { return self._s[1608]! } - public var Conversation_PrivateChannelTimeLimitedAlertTitle: String { return self._s[1609]! } - public var ReportGroupLocation_Report: String { return self._s[1610]! } - public var Compose_Create: String { return self._s[1611]! } - public var Stats_GroupViewers: String { return self._s[1612]! } - public var AutoDownloadSettings_Channels: String { return self._s[1613]! } - public var PhotoEditor_QualityHigh: String { return self._s[1614]! } - public var VoiceChat_Leave: String { return self._s[1615]! } - public var Call_Speaker: String { return self._s[1616]! } + public var Conversation_DeleteMessagesForEveryone: String { return self._s[1602]! } + public var VoiceChat_UnpinVideo: String { return self._s[1603]! } + public var Permissions_SiriTitle_v0: String { return self._s[1604]! } + public var GroupInfo_AddUserLeftError: String { return self._s[1605]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[1606]! } + public var Paint_Duplicate: String { return self._s[1607]! } + public var AttachmentMenu_WebSearch: String { return self._s[1608]! } + public var Bot_Stop: String { return self._s[1610]! } + public var Conversation_PrivateChannelTimeLimitedAlertTitle: String { return self._s[1611]! } + public var ReportGroupLocation_Report: String { return self._s[1612]! } + public var Compose_Create: String { return self._s[1613]! } + public var Stats_GroupViewers: String { return self._s[1614]! } + public var AutoDownloadSettings_Channels: String { return self._s[1615]! } + public var PhotoEditor_QualityHigh: String { return self._s[1616]! } + public var VoiceChat_Leave: String { return self._s[1617]! } + public var Call_Speaker: String { return self._s[1618]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1617]!, self._r[1617]!, [_0]) + return formatWithArgumentRanges(self._s[1619]!, self._r[1619]!, [_0]) } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[1618]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1619]! } - public var ChatList_Context_AddToFolder: String { return self._s[1620]! } - public var InviteLink_QRCode_Info: String { return self._s[1621]! } - public var AutoremoveSetup_Title: String { return self._s[1622]! } - public var ChatList_DeleteForAllMembersConfirmationText: String { return self._s[1623]! } - public var Conversation_Unblock: String { return self._s[1624]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[1625]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[1620]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1621]! } + public var ChatList_Context_AddToFolder: String { return self._s[1622]! } + public var InviteLink_QRCode_Info: String { return self._s[1623]! } + public var AutoremoveSetup_Title: String { return self._s[1624]! } + public var ChatList_DeleteForAllMembersConfirmationText: String { return self._s[1625]! } + public var Conversation_Unblock: String { return self._s[1626]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[1627]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1626]!, self._r[1626]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1628]!, self._r[1628]!, [_1, _2, _3]) } - public var Conversation_ContextMenuReply: String { return self._s[1627]! } - public var Contacts_SearchLabel: String { return self._s[1628]! } - public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[1629]! } - public var Stats_GroupMessagesTitle: String { return self._s[1631]! } - public var Notification_CallCanceled: String { return self._s[1632]! } - public var VoiceOver_Chat_Selected: String { return self._s[1633]! } - public var NotificationsSound_Tremolo: String { return self._s[1635]! } - public var VoiceOver_AuthSessions_CurrentSession: String { return self._s[1636]! } - public var ChatList_Search_NoResultsDescription: String { return self._s[1637]! } - public var AccessDenied_PhotosAndVideos: String { return self._s[1638]! } - public var LogoutOptions_ClearCacheText: String { return self._s[1639]! } + public var Conversation_ContextMenuReply: String { return self._s[1629]! } + public var Contacts_SearchLabel: String { return self._s[1630]! } + public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[1631]! } + public var Stats_GroupMessagesTitle: String { return self._s[1633]! } + public var VoiceChat_NoiseSuppression: String { return self._s[1634]! } + public var Notification_CallCanceled: String { return self._s[1635]! } + public var VoiceOver_Chat_Selected: String { return self._s[1636]! } + public var NotificationsSound_Tremolo: String { return self._s[1638]! } + public var VoiceOver_AuthSessions_CurrentSession: String { return self._s[1639]! } + public var ChatList_Search_NoResultsDescription: String { return self._s[1640]! } + public var AccessDenied_PhotosAndVideos: String { return self._s[1641]! } + public var LogoutOptions_ClearCacheText: String { return self._s[1642]! } public func VoiceChat_DisplayAsSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1641]!, self._r[1641]!, [_0]) + return formatWithArgumentRanges(self._s[1644]!, self._r[1644]!, [_0]) } - public var VoiceOver_Chat_Sticker: String { return self._s[1642]! } - public var ChatListFolder_NameUnread: String { return self._s[1643]! } - public var PeerInfo_ButtonMessage: String { return self._s[1645]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[1646]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[1647]! } - public var ChatSettings_Other: String { return self._s[1648]! } - public var UserInfo_NotificationsEnabled: String { return self._s[1649]! } - public var CreatePoll_OptionsHeader: String { return self._s[1650]! } - public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1653]! } - public var Channel_Moderator_Title: String { return self._s[1654]! } + public var VoiceOver_Chat_Sticker: String { return self._s[1645]! } + public var ChatListFolder_NameUnread: String { return self._s[1646]! } + public var PeerInfo_ButtonMessage: String { return self._s[1648]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[1649]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[1650]! } + public var ChatSettings_Other: String { return self._s[1651]! } + public var UserInfo_NotificationsEnabled: String { return self._s[1652]! } + public var CreatePoll_OptionsHeader: String { return self._s[1653]! } + public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1656]! } + public var Channel_Moderator_Title: String { return self._s[1657]! } public func Conversation_ForwardTooltip_Chat_Many(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1655]!, self._r[1655]!, [_0]) + return formatWithArgumentRanges(self._s[1658]!, self._r[1658]!, [_0]) } public func UserInfo_ContactForwardTooltip_ManyChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1656]!, self._r[1656]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1659]!, self._r[1659]!, [_0, _1]) } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[1657]! } - public var WallpaperColors_Title: String { return self._s[1658]! } - public var InviteLink_InviteLink: String { return self._s[1660]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[1661]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[1662]! } - public var Your_card_was_declined: String { return self._s[1663]! } - public var SettingsSearch_FAQ: String { return self._s[1665]! } - public var EditTheme_Expand_Preview_IncomingReplyName: String { return self._s[1666]! } - public var Conversation_ReportSpamConfirmation: String { return self._s[1667]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[1669]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1670]! } - public var Settings_About_Help: String { return self._s[1671]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[1660]! } + public var WallpaperColors_Title: String { return self._s[1661]! } + public var InviteLink_InviteLink: String { return self._s[1663]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[1664]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[1665]! } + public var Your_card_was_declined: String { return self._s[1666]! } + public var SettingsSearch_FAQ: String { return self._s[1668]! } + public var EditTheme_Expand_Preview_IncomingReplyName: String { return self._s[1669]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[1670]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[1672]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1673]! } + public var Settings_About_Help: String { return self._s[1674]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1672]!, self._r[1672]!, [_0]) + return formatWithArgumentRanges(self._s[1675]!, self._r[1675]!, [_0]) } - public var Settings_Proxy: String { return self._s[1673]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1674]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[1676]! } - public var NotificationsSound_Bell: String { return self._s[1677]! } - public var PrivacySettings_Title: String { return self._s[1679]! } - public var PrivacySettings_DataSettings: String { return self._s[1680]! } - public var ConversationMedia_Title: String { return self._s[1681]! } + public var Settings_Proxy: String { return self._s[1676]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1677]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[1679]! } + public var NotificationsSound_Bell: String { return self._s[1680]! } + public var PrivacySettings_Title: String { return self._s[1682]! } + public var PrivacySettings_DataSettings: String { return self._s[1683]! } + public var ConversationMedia_Title: String { return self._s[1684]! } public func Channel_AdminLog_MessageAddedAdminName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1682]!, self._r[1682]!, [_1]) + return formatWithArgumentRanges(self._s[1685]!, self._r[1685]!, [_1]) } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1683]!, self._r[1683]!, [_0]) + return formatWithArgumentRanges(self._s[1686]!, self._r[1686]!, [_0]) } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[1684]! } - public var ReportPeer_ReasonPornography: String { return self._s[1686]! } - public var Privacy_Calls: String { return self._s[1688]! } - public var TwoFactorSetup_Email_Text: String { return self._s[1689]! } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1690]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[1687]! } + public var ReportPeer_ReasonPornography: String { return self._s[1689]! } + public var Privacy_Calls: String { return self._s[1691]! } + public var TwoFactorSetup_Email_Text: String { return self._s[1692]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1693]! } public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1691]!, self._r[1691]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1694]!, self._r[1694]!, [_1, _2]) } - public var Passport_Identity_FrontSideHelp: String { return self._s[1692]! } - public var InstantPage_VoiceOver_DecreaseFontSize: String { return self._s[1693]! } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1695]! } - public var ContactList_Context_VideoCall: String { return self._s[1696]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1697]! } - public var Passport_Identity_MiddleName: String { return self._s[1698]! } - public var MessagePoll_QuizNoUsers: String { return self._s[1699]! } + public var Passport_Identity_FrontSideHelp: String { return self._s[1695]! } + public var InstantPage_VoiceOver_DecreaseFontSize: String { return self._s[1696]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1698]! } + public var ContactList_Context_VideoCall: String { return self._s[1699]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1700]! } + public var Passport_Identity_MiddleName: String { return self._s[1701]! } + public var MessagePoll_QuizNoUsers: String { return self._s[1702]! } public func Channel_AdminLog_MutedParticipant(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1700]!, self._r[1700]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1703]!, self._r[1703]!, [_1, _2]) } - public var OldChannels_ChannelFormat: String { return self._s[1701]! } - public var Watch_Message_Call: String { return self._s[1702]! } - public var VoiceChat_OpenChannel: String { return self._s[1703]! } - public var Wallpaper_Title: String { return self._s[1704]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[1705]! } - public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1706]! } - public var ReportGroupLocation_Text: String { return self._s[1707]! } - public var InviteText_URL: String { return self._s[1708]! } - public var ClearCache_StorageServiceFiles: String { return self._s[1709]! } - public var MessageTimer_Custom: String { return self._s[1710]! } - public var Message_PinnedLocationMessage: String { return self._s[1711]! } + public var OldChannels_ChannelFormat: String { return self._s[1704]! } + public var Watch_Message_Call: String { return self._s[1705]! } + public var VoiceChat_OpenChannel: String { return self._s[1706]! } + public var Wallpaper_Title: String { return self._s[1707]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[1708]! } + public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1709]! } + public var ReportGroupLocation_Text: String { return self._s[1710]! } + public var InviteText_URL: String { return self._s[1711]! } + public var ClearCache_StorageServiceFiles: String { return self._s[1712]! } + public var MessageTimer_Custom: String { return self._s[1713]! } + public var Message_PinnedLocationMessage: String { return self._s[1714]! } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1712]!, self._r[1712]!, [_0]) + return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_0]) } - public var EditTheme_UploadNewTheme: String { return self._s[1713]! } - public var ChatImportActivity_ErrorLimitExceeded: String { return self._s[1716]! } + public var EditTheme_UploadNewTheme: String { return self._s[1716]! } + public var ChatImportActivity_ErrorLimitExceeded: String { return self._s[1719]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1717]!, self._r[1717]!, [_0]) + return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_0]) } - public var Login_CodeSentCall: String { return self._s[1719]! } + public var Login_CodeSentCall: String { return self._s[1722]! } public func Conversation_AutoremoveTimerSetUser(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1723]!, self._r[1723]!, [_1, _2]) } - public var Conversation_Report: String { return self._s[1721]! } - public var NotificationSettings_ContactJoined: String { return self._s[1722]! } + public var Conversation_Report: String { return self._s[1724]! } + public var NotificationSettings_ContactJoined: String { return self._s[1725]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1723]!, self._r[1723]!, [_1]) + return formatWithArgumentRanges(self._s[1726]!, self._r[1726]!, [_1]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[1724]! } - public var BroadcastGroups_IntroText: String { return self._s[1725]! } - public var IntentsSettings_SuggestByAll: String { return self._s[1727]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[1728]! } - public var AuthSessions_Title: String { return self._s[1729]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[1727]! } + public var BroadcastGroups_IntroText: String { return self._s[1728]! } + public var IntentsSettings_SuggestByAll: String { return self._s[1730]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[1731]! } + public var AuthSessions_Title: String { return self._s[1732]! } public func Notification_VoiceChatEnded(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1730]!, self._r[1730]!, [_0]) + return formatWithArgumentRanges(self._s[1733]!, self._r[1733]!, [_0]) } - public var Settings_Tips: String { return self._s[1731]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1732]! } - public var WallpaperPreview_WallpaperColors: String { return self._s[1733]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1734]! } - public var VoiceChat_YouCanNowSpeak: String { return self._s[1737]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[1739]! } + public var Settings_Tips: String { return self._s[1734]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1735]! } + public var WallpaperPreview_WallpaperColors: String { return self._s[1736]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1737]! } + public var VoiceChat_YouCanNowSpeak: String { return self._s[1740]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[1742]! } public func UserInfo_LinkForwardTooltip_ManyChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1740]!, self._r[1740]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1743]!, self._r[1743]!, [_0, _1]) } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[1741]! } - public var ExplicitContent_AlertTitle: String { return self._s[1742]! } - public var Channel_UpdatePhotoItem: String { return self._s[1744]! } - public var ChatList_AutoarchiveSuggestion_Text: String { return self._s[1746]! } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[1747]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[1744]! } + public var ExplicitContent_AlertTitle: String { return self._s[1745]! } + public var Channel_UpdatePhotoItem: String { return self._s[1747]! } + public var ChatList_AutoarchiveSuggestion_Text: String { return self._s[1749]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[1750]! } public func Call_BatteryLow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1748]!, self._r[1748]!, [_0]) + return formatWithArgumentRanges(self._s[1751]!, self._r[1751]!, [_0]) } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[1749]! } - public var WallpaperPreview_PatternPaternApply: String { return self._s[1750]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1751]! } - public var CommentsGroup_ErrorAccessDenied: String { return self._s[1752]! } - public var Appearance_AccentColor: String { return self._s[1754]! } - public var GroupInfo_SharedMedia: String { return self._s[1755]! } - public var Login_PhonePlaceholder: String { return self._s[1756]! } - public var Appearance_TextSize_Automatic: String { return self._s[1757]! } - public var EmptyGroupInfo_Line2: String { return self._s[1758]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[1752]! } + public var WallpaperPreview_PatternPaternApply: String { return self._s[1753]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1754]! } + public var CommentsGroup_ErrorAccessDenied: String { return self._s[1755]! } + public var Appearance_AccentColor: String { return self._s[1757]! } + public var GroupInfo_SharedMedia: String { return self._s[1758]! } + public var Login_PhonePlaceholder: String { return self._s[1759]! } + public var Appearance_TextSize_Automatic: String { return self._s[1760]! } + public var EmptyGroupInfo_Line2: String { return self._s[1761]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1759]!, self._r[1759]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1762]!, self._r[1762]!, [_1, _2]) } - public var VoiceChat_TapToAddPhotoOrBio: String { return self._s[1760]! } - public var Conversation_ClearChannel: String { return self._s[1761]! } - public var Appearance_AppIconDefaultX: String { return self._s[1763]! } - public var EditProfile_NameAndPhotoOrVideoHelp: String { return self._s[1764]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[1765]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1766]! } + public var VoiceChat_TapToAddPhotoOrBio: String { return self._s[1763]! } + public var Conversation_ClearChannel: String { return self._s[1764]! } + public var Appearance_AppIconDefaultX: String { return self._s[1766]! } + public var EditProfile_NameAndPhotoOrVideoHelp: String { return self._s[1767]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[1768]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1769]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1767]!, self._r[1767]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1770]!, self._r[1770]!, [_1, _2]) } - public var ChatList_EmptyChatListEditFilter: String { return self._s[1768]! } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[1771]! } - public var Chat_PinnedMessagesHiddenText: String { return self._s[1772]! } + public var ChatList_EmptyChatListEditFilter: String { return self._s[1771]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[1774]! } + public var Chat_PinnedMessagesHiddenText: String { return self._s[1775]! } public func Message_PinnedGenericMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_0]) + return formatWithArgumentRanges(self._s[1776]!, self._r[1776]!, [_0]) } public func Location_ProximityTip(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, [_0]) + return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_0]) } - public var UserInfo_NotificationsEnable: String { return self._s[1775]! } - public var Checkout_PayWithTouchId: String { return self._s[1776]! } - public var SharedMedia_ViewInChat: String { return self._s[1777]! } + public var UserInfo_NotificationsEnable: String { return self._s[1778]! } + public var Checkout_PayWithTouchId: String { return self._s[1779]! } + public var SharedMedia_ViewInChat: String { return self._s[1780]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1781]!, self._r[1781]!, [_0, _1]) } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1779]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1782]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1780]!, self._r[1780]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1783]!, self._r[1783]!, [_1, _2]) } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_0]) + return formatWithArgumentRanges(self._s[1785]!, self._r[1785]!, [_0]) } - public var Conversation_PeerNearbyText: String { return self._s[1784]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[1785]! } - public var PhotoEditor_Skip: String { return self._s[1786]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[1787]! } - public var ChatList_EmptyChatList: String { return self._s[1788]! } - public var Channel_BanUser_Unban: String { return self._s[1789]! } + public var Conversation_PeerNearbyText: String { return self._s[1787]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[1788]! } + public var PhotoEditor_Skip: String { return self._s[1789]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[1790]! } + public var ChatList_EmptyChatList: String { return self._s[1791]! } + public var Channel_BanUser_Unban: String { return self._s[1792]! } public func Message_GenericForwardedPsa(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1790]!, self._r[1790]!, [_0]) + return formatWithArgumentRanges(self._s[1793]!, self._r[1793]!, [_0]) } - public var Appearance_TextSize_Apply: String { return self._s[1791]! } + public var Appearance_TextSize_Apply: String { return self._s[1794]! } public func Conversation_MessageViewCommentsFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1792]!, self._r[1792]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1795]!, self._r[1795]!, [_1, _2]) } - public var Login_InfoFirstNamePlaceholder: String { return self._s[1793]! } - public var VoiceOver_Chat_YourSticker: String { return self._s[1794]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1795]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1797]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1798]! } - public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[1799]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[1796]! } + public var VoiceOver_Chat_YourSticker: String { return self._s[1797]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1798]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1800]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1801]! } + public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[1802]! } public func PUSH_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_1]) + return formatWithArgumentRanges(self._s[1803]!, self._r[1803]!, [_1]) } - public var VoiceOver_Chat_GoToOriginalMessage: String { return self._s[1802]! } - public var State_WaitingForNetwork: String { return self._s[1803]! } - public var AccessDenied_CameraRestricted: String { return self._s[1804]! } - public var ChatSettings_Appearance: String { return self._s[1805]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[1806]! } - public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[1807]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1808]! } - public var Conversation_SelectMessages: String { return self._s[1810]! } - public var Map_NoPlacesNearby: String { return self._s[1811]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1812]! } - public var GroupRemoved_Title: String { return self._s[1813]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1815]! } - public var VoiceChat_Mute: String { return self._s[1816]! } - public var Paint_Marker: String { return self._s[1817]! } - public var Widget_ChatsGalleryTitle: String { return self._s[1818]! } + public var VoiceOver_Chat_GoToOriginalMessage: String { return self._s[1805]! } + public var State_WaitingForNetwork: String { return self._s[1806]! } + public var AccessDenied_CameraRestricted: String { return self._s[1807]! } + public var ChatSettings_Appearance: String { return self._s[1808]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[1809]! } + public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[1810]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1811]! } + public var Conversation_SelectMessages: String { return self._s[1813]! } + public var Map_NoPlacesNearby: String { return self._s[1814]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1815]! } + public var GroupRemoved_Title: String { return self._s[1816]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1818]! } + public var VoiceChat_Mute: String { return self._s[1819]! } + public var Paint_Marker: String { return self._s[1820]! } + public var Widget_ChatsGalleryTitle: String { return self._s[1821]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1819]!, self._r[1819]!, [_1]) + return formatWithArgumentRanges(self._s[1822]!, self._r[1822]!, [_1]) } - public var SocksProxySetup_ShareProxyList: String { return self._s[1820]! } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[1821]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1823]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[1824]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1822]!, self._r[1822]!, [_0]) + return formatWithArgumentRanges(self._s[1825]!, self._r[1825]!, [_0]) } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[1823]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[1824]! } - public var Notifications_GroupNotificationsAlert: String { return self._s[1825]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[1826]! } - public var Compose_NewGroup: String { return self._s[1827]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[1826]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[1827]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[1828]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[1829]! } + public var Compose_NewGroup: String { return self._s[1830]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1828]!, self._r[1828]!, [_0]) + return formatWithArgumentRanges(self._s[1831]!, self._r[1831]!, [_0]) } - public var Location_LiveLocationRequired_Description: String { return self._s[1830]! } - public var Conversation_ClearGroupHistory: String { return self._s[1831]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1834]! } - public var VoiceOver_BotKeyboard: String { return self._s[1835]! } - public var Channel_BanUser_BlockFor: String { return self._s[1836]! } - public var Bot_Start: String { return self._s[1837]! } - public var Your_card_has_expired: String { return self._s[1838]! } - public var Channel_About_Title: String { return self._s[1839]! } - public var VoiceChat_EditTitleTitle: String { return self._s[1840]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1841]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[1843]! } - public var Conversation_FileDropbox: String { return self._s[1844]! } - public var ChatList_Search_NoResultsFitlerMusic: String { return self._s[1845]! } - public var Month_GenNovember: String { return self._s[1846]! } - public var IntentsSettings_SuggestByShare: String { return self._s[1847]! } + public var Location_LiveLocationRequired_Description: String { return self._s[1833]! } + public var Conversation_ClearGroupHistory: String { return self._s[1834]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1837]! } + public var VoiceOver_BotKeyboard: String { return self._s[1838]! } + public var Channel_BanUser_BlockFor: String { return self._s[1839]! } + public var Bot_Start: String { return self._s[1840]! } + public var Your_card_has_expired: String { return self._s[1841]! } + public var Channel_About_Title: String { return self._s[1842]! } + public var VoiceChat_EditTitleTitle: String { return self._s[1843]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1844]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[1846]! } + public var Conversation_FileDropbox: String { return self._s[1847]! } + public var ChatList_Search_NoResultsFitlerMusic: String { return self._s[1848]! } + public var Month_GenNovember: String { return self._s[1849]! } + public var IntentsSettings_SuggestByShare: String { return self._s[1850]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, [_0]) + return formatWithArgumentRanges(self._s[1851]!, self._r[1851]!, [_0]) } - public var StickerPack_Add: String { return self._s[1849]! } - public var Theme_ErrorNotFound: String { return self._s[1850]! } - public var Wallpaper_SearchShort: String { return self._s[1852]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1853]! } - public var ConversationProfile_UsersTooMuchError: String { return self._s[1854]! } - public var ChatList_FolderAllChats: String { return self._s[1855]! } - public var VoiceChat_EndConfirmationEnd: String { return self._s[1856]! } - public var Passport_Authorize: String { return self._s[1857]! } + public var StickerPack_Add: String { return self._s[1852]! } + public var Theme_ErrorNotFound: String { return self._s[1853]! } + public var Wallpaper_SearchShort: String { return self._s[1855]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1856]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[1857]! } + public var ChatList_FolderAllChats: String { return self._s[1858]! } + public var VoiceChat_EndConfirmationEnd: String { return self._s[1859]! } + public var Passport_Authorize: String { return self._s[1860]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1861]!, self._r[1861]!, [_1, _2]) } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1859]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1862]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1860]!, self._r[1860]!, [_1]) + return formatWithArgumentRanges(self._s[1863]!, self._r[1863]!, [_1]) } - public var LocalGroup_ButtonTitle: String { return self._s[1861]! } - public var VoiceOver_Stickers: String { return self._s[1863]! } - public var UserInfo_GroupsInCommon: String { return self._s[1864]! } - public var LoginPassword_Title: String { return self._s[1866]! } - public var Wallpaper_Set: String { return self._s[1867]! } - public var Stats_InteractionsTitle: String { return self._s[1868]! } + public var LocalGroup_ButtonTitle: String { return self._s[1864]! } + public var VoiceOver_Stickers: String { return self._s[1866]! } + public var UserInfo_GroupsInCommon: String { return self._s[1867]! } + public var LoginPassword_Title: String { return self._s[1869]! } + public var Wallpaper_Set: String { return self._s[1870]! } + public var Stats_InteractionsTitle: String { return self._s[1871]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) - } - public var Conversation_MessageDialogEdit: String { return self._s[1871]! } - public var Paint_Outlined: String { return self._s[1872]! } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1873]!, self._r[1873]!, [_0]) } + public var Conversation_MessageDialogEdit: String { return self._s[1874]! } + public var Paint_Outlined: String { return self._s[1875]! } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) + } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1874]!, self._r[1874]!, [_0]) + return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_0]) } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1875]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1876]! } - public var Appearance_ColorThemeNight: String { return self._s[1877]! } - public var ChannelInfo_Stats: String { return self._s[1878]! } - public var Widget_ShortcutsGalleryTitle: String { return self._s[1879]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1880]! } - public var MediaPicker_TimerTooltip: String { return self._s[1881]! } - public var ChatImportActivity_ErrorNotAdmin: String { return self._s[1882]! } - public var Common_ChoosePhoto: String { return self._s[1883]! } - public var Media_LimitedAccessTitle: String { return self._s[1884]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[1885]! } - public var PeerInfo_PaneGroups: String { return self._s[1886]! } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[1888]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1889]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1890]! } - public var OldChannels_ChannelsHeader: String { return self._s[1891]! } - public var MuteFor_Forever: String { return self._s[1892]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1893]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[1895]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1896]! } - public var ContactInfo_Job: String { return self._s[1897]! } - public var Passport_Language_mk: String { return self._s[1898]! } - public var EditTheme_ShortLink: String { return self._s[1899]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1902]! } - public var Month_GenApril: String { return self._s[1904]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[1906]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1907]! } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[1908]! } - public var EditTheme_Title: String { return self._s[1909]! } - public var Conversation_LinkDialogCopy: String { return self._s[1910]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1878]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1879]! } + public var Appearance_ColorThemeNight: String { return self._s[1880]! } + public var ChannelInfo_Stats: String { return self._s[1881]! } + public var Widget_ShortcutsGalleryTitle: String { return self._s[1882]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1883]! } + public var MediaPicker_TimerTooltip: String { return self._s[1884]! } + public var ChatImportActivity_ErrorNotAdmin: String { return self._s[1885]! } + public var Common_ChoosePhoto: String { return self._s[1886]! } + public var Media_LimitedAccessTitle: String { return self._s[1887]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[1888]! } + public var PeerInfo_PaneGroups: String { return self._s[1889]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[1891]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1892]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1893]! } + public var OldChannels_ChannelsHeader: String { return self._s[1894]! } + public var MuteFor_Forever: String { return self._s[1895]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1896]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[1898]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1899]! } + public var ContactInfo_Job: String { return self._s[1900]! } + public var Passport_Language_mk: String { return self._s[1901]! } + public var EditTheme_ShortLink: String { return self._s[1902]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1905]! } + public var Month_GenApril: String { return self._s[1907]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[1909]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1910]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[1911]! } + public var EditTheme_Title: String { return self._s[1912]! } + public var Conversation_LinkDialogCopy: String { return self._s[1913]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1914]!, self._r[1914]!, [_1, _2]) } - public var Passport_ForgottenPassword: String { return self._s[1912]! } - public var WallpaperSearch_Recent: String { return self._s[1913]! } - public var ChatSettings_Title: String { return self._s[1918]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1919]! } + public var Passport_ForgottenPassword: String { return self._s[1915]! } + public var WallpaperSearch_Recent: String { return self._s[1916]! } + public var ChatSettings_Title: String { return self._s[1921]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1922]! } public func StickerPackActionInfo_AddedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0]) + return formatWithArgumentRanges(self._s[1923]!, self._r[1923]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[1921]! } - public var LastSeen_WithinAMonth: String { return self._s[1922]! } - public var VoiceChat_Live: String { return self._s[1923]! } - public var PeerInfo_ButtonCall: String { return self._s[1924]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[1925]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[1926]! } - public var Call_AudioRouteHide: String { return self._s[1927]! } - public var DialogList_SavedMessages: String { return self._s[1928]! } - public var ChatList_Context_Mute: String { return self._s[1929]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[1930]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[1924]! } + public var LastSeen_WithinAMonth: String { return self._s[1925]! } + public var VoiceChat_Live: String { return self._s[1926]! } + public var PeerInfo_ButtonCall: String { return self._s[1927]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[1928]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[1929]! } + public var Call_AudioRouteHide: String { return self._s[1930]! } + public var DialogList_SavedMessages: String { return self._s[1931]! } + public var ChatList_Context_Mute: String { return self._s[1932]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[1933]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1931]!, self._r[1931]!, [_0]) + return formatWithArgumentRanges(self._s[1934]!, self._r[1934]!, [_0]) } - public var VoiceChat_StatusMutedForYou: String { return self._s[1932]! } - public var Passport_Language_et: String { return self._s[1933]! } - public var Conversation_MessageLeaveCommentShort: String { return self._s[1934]! } - public var PhotoEditor_CropReset: String { return self._s[1935]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[1936]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[1937]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[1938]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1941]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1943]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[1944]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[1946]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[1948]! } - public var Map_YouAreHere: String { return self._s[1950]! } - public var Core_ServiceUserStatus: String { return self._s[1951]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1954]! } - public var VoiceChat_StartRecording: String { return self._s[1955]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[1956]! } - public var MediaPicker_Videos: String { return self._s[1958]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[1960]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1961]! } - public var SharedMedia_CategoryMedia: String { return self._s[1962]! } + public var VoiceChat_StatusMutedForYou: String { return self._s[1935]! } + public var Passport_Language_et: String { return self._s[1936]! } + public var Conversation_MessageLeaveCommentShort: String { return self._s[1937]! } + public var PhotoEditor_CropReset: String { return self._s[1938]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[1939]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[1940]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[1941]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1944]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1946]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[1947]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[1949]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[1951]! } + public var Map_YouAreHere: String { return self._s[1953]! } + public var Core_ServiceUserStatus: String { return self._s[1954]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1957]! } + public var VoiceChat_StartRecording: String { return self._s[1958]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[1959]! } + public var MediaPicker_Videos: String { return self._s[1961]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[1963]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1964]! } + public var SharedMedia_CategoryMedia: String { return self._s[1965]! } public func MediaPicker_Nof(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1963]!, self._r[1963]!, [_0]) + return formatWithArgumentRanges(self._s[1966]!, self._r[1966]!, [_0]) } - public var ChatSettings_AutoPlayGifs: String { return self._s[1964]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[1965]! } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[1966]! } - public var Conversation_JoinVoiceChatAsListener: String { return self._s[1967]! } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1968]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[1967]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[1968]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[1969]! } + public var Conversation_JoinVoiceChatAsListener: String { return self._s[1970]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1971]! } public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1969]!, self._r[1969]!, [_0]) + return formatWithArgumentRanges(self._s[1972]!, self._r[1972]!, [_0]) } - public var Web_Error: String { return self._s[1970]! } - public var PhotoEditor_SkinTool: String { return self._s[1971]! } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[1972]! } - public var AutoremoveSetup_TimerInfoChat: String { return self._s[1973]! } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[1975]! } - public var PasscodeSettings_Help: String { return self._s[1976]! } - public var Appearance_ColorTheme: String { return self._s[1977]! } + public var Web_Error: String { return self._s[1973]! } + public var PhotoEditor_SkinTool: String { return self._s[1974]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[1975]! } + public var AutoremoveSetup_TimerInfoChat: String { return self._s[1976]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[1978]! } + public var PasscodeSettings_Help: String { return self._s[1979]! } + public var Appearance_ColorTheme: String { return self._s[1980]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, [_0]) + return formatWithArgumentRanges(self._s[1981]!, self._r[1981]!, [_0]) } - public var InviteLink_DeleteAllRevokedLinks: String { return self._s[1979]! } + public var InviteLink_DeleteAllRevokedLinks: String { return self._s[1982]! } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1980]!, self._r[1980]!, [_1]) + return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, [_1]) } - public var InviteLink_QRCode_Title: String { return self._s[1981]! } - public var GroupInfo_LeftStatus: String { return self._s[1982]! } - public var EditTheme_Preview: String { return self._s[1983]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1984]! } + public var InviteLink_QRCode_Title: String { return self._s[1984]! } + public var GroupInfo_LeftStatus: String { return self._s[1985]! } + public var EditTheme_Preview: String { return self._s[1986]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1987]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1985]!, self._r[1985]!, [_0]) + return formatWithArgumentRanges(self._s[1988]!, self._r[1988]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[1986]! } - public var VoiceChat_StatusWantsToSpeak: String { return self._s[1987]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1988]! } - public var ChatList_Context_MarkAsUnread: String { return self._s[1989]! } - public var DialogList_AdNoticeAlert: String { return self._s[1990]! } - public var UserInfo_Invite: String { return self._s[1991]! } - public var Checkout_Email: String { return self._s[1992]! } - public var Stats_GroupActionsTitle: String { return self._s[1993]! } - public var Coub_TapForSound: String { return self._s[1994]! } - public var Conversation_AutoremoveTimerRemovedUserYou: String { return self._s[1995]! } - public var Theme_ThemeChangedText: String { return self._s[1996]! } - public var Call_ExternalCallInProgressMessage: String { return self._s[1997]! } - public var AutoremoveSetup_TimerInfoChannel: String { return self._s[1998]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[1999]! } - public var ScheduledMessages_ScheduledToday: String { return self._s[2000]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[2001]! } + public var NotificationsSound_Keys: String { return self._s[1989]! } + public var VoiceChat_StatusWantsToSpeak: String { return self._s[1990]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1991]! } + public var ChatList_Context_MarkAsUnread: String { return self._s[1992]! } + public var DialogList_AdNoticeAlert: String { return self._s[1993]! } + public var UserInfo_Invite: String { return self._s[1994]! } + public var Checkout_Email: String { return self._s[1995]! } + public var Stats_GroupActionsTitle: String { return self._s[1996]! } + public var Coub_TapForSound: String { return self._s[1997]! } + public var Conversation_AutoremoveTimerRemovedUserYou: String { return self._s[1998]! } + public var Theme_ThemeChangedText: String { return self._s[1999]! } + public var Call_ExternalCallInProgressMessage: String { return self._s[2000]! } + public var AutoremoveSetup_TimerInfoChannel: String { return self._s[2001]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[2002]! } + public var ScheduledMessages_ScheduledToday: String { return self._s[2003]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[2004]! } public func VoiceChat_InviteMemberToChannelFirstText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2002]!, self._r[2002]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2005]!, self._r[2005]!, [_1, _2]) } - public var Call_ReportIncludeLogDescription: String { return self._s[2003]! } - public var Settings_FrequentlyAskedQuestions: String { return self._s[2005]! } - public var Call_VoiceOver_VoiceCallMissed: String { return self._s[2006]! } - public var Channel_MessagePhotoRemoved: String { return self._s[2007]! } - public var Passport_Email_Delete: String { return self._s[2008]! } + public var Call_ReportIncludeLogDescription: String { return self._s[2006]! } + public var Settings_FrequentlyAskedQuestions: String { return self._s[2008]! } + public var Call_VoiceOver_VoiceCallMissed: String { return self._s[2009]! } + public var Channel_MessagePhotoRemoved: String { return self._s[2010]! } + public var Passport_Email_Delete: String { return self._s[2011]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_1]) + return formatWithArgumentRanges(self._s[2012]!, self._r[2012]!, [_1]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2010]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2013]! } public func Conversation_AutoremoveTimerRemovedUser(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2011]!, self._r[2011]!, [_1]) + return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_1]) } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[2012]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[2014]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[2015]! } - public var Common_of: String { return self._s[2016]! } - public var VoiceChat_CreateNewVoiceChatText: String { return self._s[2017]! } - public var VoiceChat_StartRecordingStart: String { return self._s[2018]! } - public var PeerInfo_ButtonUnmute: String { return self._s[2021]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[2015]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[2017]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[2018]! } + public var Common_of: String { return self._s[2019]! } + public var VoiceChat_CreateNewVoiceChatText: String { return self._s[2020]! } + public var VoiceChat_StartRecordingStart: String { return self._s[2021]! } + public var PeerInfo_ButtonUnmute: String { return self._s[2024]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_0]) + return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_0]) } - public var Privacy_ContactsReset_ContactsDeleted: String { return self._s[2023]! } - public var ChatList_AddChatsToFolder: String { return self._s[2024]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2025]! } - public var Settings_Title: String { return self._s[2027]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2029]! } - public var Appearance_BubbleCornersSetting: String { return self._s[2030]! } - public var InviteLink_OtherAdminsLinks: String { return self._s[2031]! } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2032]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[2034]! } - public var WallpaperPreview_CropBottomText: String { return self._s[2035]! } - public var SecretTimer_VideoDescription: String { return self._s[2036]! } - public var VoiceOver_Chat_AnimatedSticker: String { return self._s[2037]! } - public var WallpaperPreview_Blurred: String { return self._s[2038]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2039]! } - public var ChatListFolder_ExcludedSectionHeader: String { return self._s[2041]! } - public var Conversation_CancelForwardSelectChat: String { return self._s[2042]! } - public var DialogList_PasscodeLockHelp: String { return self._s[2043]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2044]! } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2045]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2046]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[2047]! } - public var SocksProxySetup_Connection: String { return self._s[2048]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[2049]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[2050]! } - public var Conversation_Unpin: String { return self._s[2051]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[2052]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[2053]! } - public var Call_ReportSkip: String { return self._s[2054]! } + public var Privacy_ContactsReset_ContactsDeleted: String { return self._s[2026]! } + public var ChatList_AddChatsToFolder: String { return self._s[2027]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2028]! } + public var Settings_Title: String { return self._s[2030]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2032]! } + public var Appearance_BubbleCornersSetting: String { return self._s[2033]! } + public var InviteLink_OtherAdminsLinks: String { return self._s[2034]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2035]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[2037]! } + public var WallpaperPreview_CropBottomText: String { return self._s[2038]! } + public var SecretTimer_VideoDescription: String { return self._s[2039]! } + public var VoiceOver_Chat_AnimatedSticker: String { return self._s[2040]! } + public var WallpaperPreview_Blurred: String { return self._s[2041]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2042]! } + public var ChatListFolder_ExcludedSectionHeader: String { return self._s[2044]! } + public var Conversation_CancelForwardSelectChat: String { return self._s[2045]! } + public var DialogList_PasscodeLockHelp: String { return self._s[2046]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2047]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2048]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2049]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[2050]! } + public var SocksProxySetup_Connection: String { return self._s[2051]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[2052]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[2053]! } + public var Conversation_Unpin: String { return self._s[2054]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[2055]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[2056]! } + public var Call_ReportSkip: String { return self._s[2057]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_0]) + return formatWithArgumentRanges(self._s[2058]!, self._r[2058]!, [_0]) } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2057]!, self._r[2057]!, [_0]) + return formatWithArgumentRanges(self._s[2060]!, self._r[2060]!, [_0]) } - public var AutoNightTheme_Automatic: String { return self._s[2058]! } - public var Passport_Language_az: String { return self._s[2060]! } + public var AutoNightTheme_Automatic: String { return self._s[2061]! } + public var Passport_Language_az: String { return self._s[2063]! } public func Conversation_AutoremoveChanged(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2061]!, self._r[2061]!, [_0]) + return formatWithArgumentRanges(self._s[2064]!, self._r[2064]!, [_0]) } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[2062]! } - public var Watch_UserInfo_Unmute: String { return self._s[2063]! } - public var Channel_Stickers_YourStickers: String { return self._s[2064]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2065]! } - public var PeerInfo_AutoremoveMessagesDisabled: String { return self._s[2066]! } - public var Tour_Text1: String { return self._s[2067]! } - public var Common_Delete: String { return self._s[2068]! } - public var Settings_EditPhoto: String { return self._s[2069]! } - public var Common_Edit: String { return self._s[2070]! } - public var ShareMenu_ShareTo: String { return self._s[2072]! } - public var Passport_Identity_ExpiryDate: String { return self._s[2073]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[2065]! } + public var Watch_UserInfo_Unmute: String { return self._s[2066]! } + public var Channel_Stickers_YourStickers: String { return self._s[2067]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2068]! } + public var PeerInfo_AutoremoveMessagesDisabled: String { return self._s[2069]! } + public var Tour_Text1: String { return self._s[2070]! } + public var Common_Delete: String { return self._s[2071]! } + public var Settings_EditPhoto: String { return self._s[2072]! } + public var Common_Edit: String { return self._s[2073]! } + public var ShareMenu_ShareTo: String { return self._s[2075]! } + public var Passport_Identity_ExpiryDate: String { return self._s[2076]! } public func Channel_AdminLog_MutedNewMembers(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_1]) + return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_1]) } - public var Preview_DeleteGif: String { return self._s[2075]! } - public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2076]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2077]! } - public var Conversation_ViewReply: String { return self._s[2078]! } - public var Stats_LoadingText: String { return self._s[2079]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[2080]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2081]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2082]! } + public var Preview_DeleteGif: String { return self._s[2078]! } + public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2079]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2080]! } + public var Conversation_ViewReply: String { return self._s[2081]! } + public var Stats_LoadingText: String { return self._s[2082]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[2083]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2084]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2085]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_0]) - } - public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2084]!, self._r[2084]!, [_0]) - } - public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_0]) } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[2087]! } - public var InviteLink_Share: String { return self._s[2089]! } - public func Conversation_ImportProgress(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2091]!, self._r[2091]!, [_0]) + public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, [_0]) } - public var IntentsSettings_MainAccount: String { return self._s[2092]! } - public var Group_MessagePhotoRemoved: String { return self._s[2095]! } - public var Conversation_ContextMenuSelect: String { return self._s[2096]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2098]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2099]! } - public var Contacts_PermissionsEnable: String { return self._s[2100]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[2101]! } - public var Common_NotNow: String { return self._s[2102]! } - public var Notification_CreatedChannel: String { return self._s[2103]! } - public var Stats_ViewsBySourceTitle: String { return self._s[2105]! } - public var InviteLink_ContextShare: String { return self._s[2106]! } - public var Appearance_AppIconClassic: String { return self._s[2107]! } - public var PhotoEditor_QualityTool: String { return self._s[2108]! } - public var ClearCache_ClearCache: String { return self._s[2109]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[2110]! } - public var AutoDownloadSettings_Videos: String { return self._s[2111]! } - public var GroupPermission_Duration: String { return self._s[2112]! } - public var ChatList_Read: String { return self._s[2113]! } + public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_0]) + } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[2090]! } + public var InviteLink_Share: String { return self._s[2092]! } + public func Conversation_ImportProgress(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2094]!, self._r[2094]!, [_0]) + } + public var IntentsSettings_MainAccount: String { return self._s[2095]! } + public var Group_MessagePhotoRemoved: String { return self._s[2098]! } + public var Conversation_ContextMenuSelect: String { return self._s[2099]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2101]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2102]! } + public var Contacts_PermissionsEnable: String { return self._s[2103]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[2104]! } + public var Common_NotNow: String { return self._s[2105]! } + public var Notification_CreatedChannel: String { return self._s[2106]! } + public var Stats_ViewsBySourceTitle: String { return self._s[2108]! } + public var InviteLink_ContextShare: String { return self._s[2109]! } + public var Appearance_AppIconClassic: String { return self._s[2110]! } + public var PhotoEditor_QualityTool: String { return self._s[2111]! } + public var ClearCache_ClearCache: String { return self._s[2112]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[2113]! } + public var AutoDownloadSettings_Videos: String { return self._s[2114]! } + public var GroupPermission_Duration: String { return self._s[2115]! } + public var ChatList_Read: String { return self._s[2116]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2117]!, self._r[2117]!, [_1, _2]) } public func ScheduleVoiceChat_ScheduleTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2115]!, self._r[2115]!, [_0]) + return formatWithArgumentRanges(self._s[2118]!, self._r[2118]!, [_0]) } - public var CallFeedback_Send: String { return self._s[2116]! } - public var Channel_Stickers_Searching: String { return self._s[2117]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[2118]! } - public var FastTwoStepSetup_HintSection: String { return self._s[2119]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2120]! } - public var EditTheme_CreateTitle: String { return self._s[2122]! } - public var Application_Name: String { return self._s[2123]! } - public var Paint_Stickers: String { return self._s[2124]! } - public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[2125]! } - public var Call_StatusFailed: String { return self._s[2126]! } - public var Stickers_FavoriteStickers: String { return self._s[2127]! } - public var ClearCache_Clear: String { return self._s[2128]! } - public var Passport_Language_mn: String { return self._s[2129]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[2130]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2131]! } - public var Call_VoiceOver_VideoCallOutgoing: String { return self._s[2133]! } - public var TwoFactorSetup_Hint_Text: String { return self._s[2135]! } - public var WallpaperPreview_PatternIntensity: String { return self._s[2136]! } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2137]! } - public var Passport_Address_AddBankStatement: String { return self._s[2138]! } + public var CallFeedback_Send: String { return self._s[2119]! } + public var Channel_Stickers_Searching: String { return self._s[2120]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[2121]! } + public var FastTwoStepSetup_HintSection: String { return self._s[2122]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2123]! } + public var EditTheme_CreateTitle: String { return self._s[2125]! } + public var Application_Name: String { return self._s[2126]! } + public var Paint_Stickers: String { return self._s[2127]! } + public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[2128]! } + public var Call_StatusFailed: String { return self._s[2129]! } + public var Stickers_FavoriteStickers: String { return self._s[2130]! } + public var ClearCache_Clear: String { return self._s[2131]! } + public var Passport_Language_mn: String { return self._s[2132]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[2133]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2134]! } + public var Call_VoiceOver_VideoCallOutgoing: String { return self._s[2136]! } + public var TwoFactorSetup_Hint_Text: String { return self._s[2138]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[2139]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2140]! } + public var Passport_Address_AddBankStatement: String { return self._s[2141]! } public func Conversation_TitleRepliesFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2141]!, self._r[2141]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2144]!, self._r[2144]!, [_1, _2]) } - public var ChatListFolderSettings_RecommendedNewFolder: String { return self._s[2142]! } - public var UserInfo_ShareContact: String { return self._s[2143]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[2144]! } - public var Channel_ErrorAdminsTooMuch: String { return self._s[2146]! } - public var Call_RateCall: String { return self._s[2147]! } - public var Contacts_AccessDeniedError: String { return self._s[2148]! } - public var Invite_ChannelsTooMuch: String { return self._s[2149]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[2150]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2151]! } - public var InviteLink_Create_TimeLimitInfo: String { return self._s[2152]! } - public var Cache_NoLimit: String { return self._s[2155]! } - public var Conversation_EmptyPlaceholder: String { return self._s[2156]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2160]! } - public var Notification_Exceptions_MessagePreviewAlwaysOff: String { return self._s[2161]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2162]! } - public var Privacy_PaymentsClear_AllInfoCleared: String { return self._s[2163]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[2164]! } + public var ChatListFolderSettings_RecommendedNewFolder: String { return self._s[2145]! } + public var UserInfo_ShareContact: String { return self._s[2146]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[2147]! } + public var Channel_ErrorAdminsTooMuch: String { return self._s[2149]! } + public var Call_RateCall: String { return self._s[2150]! } + public var Contacts_AccessDeniedError: String { return self._s[2151]! } + public var Invite_ChannelsTooMuch: String { return self._s[2152]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[2153]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2154]! } + public var InviteLink_Create_TimeLimitInfo: String { return self._s[2155]! } + public var Cache_NoLimit: String { return self._s[2158]! } + public var Conversation_EmptyPlaceholder: String { return self._s[2159]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2163]! } + public var Notification_Exceptions_MessagePreviewAlwaysOff: String { return self._s[2164]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2165]! } + public var Privacy_PaymentsClear_AllInfoCleared: String { return self._s[2166]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[2167]! } public func PUSH_VIDEO_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2165]!, self._r[2165]!, [_1]) + return formatWithArgumentRanges(self._s[2168]!, self._r[2168]!, [_1]) } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[2166]! } - public var Theme_ThemeChanged: String { return self._s[2167]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2169]! } - public var AutoDownloadSettings_MediaTypes: String { return self._s[2170]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[2169]! } + public var Theme_ThemeChanged: String { return self._s[2170]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2172]! } + public var AutoDownloadSettings_MediaTypes: String { return self._s[2173]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2171]!, self._r[2171]!, [_0]) + return formatWithArgumentRanges(self._s[2174]!, self._r[2174]!, [_0]) } - public var Channel_AdminLog_InfoPanelTitle: String { return self._s[2172]! } - public var Passport_Language_da: String { return self._s[2174]! } - public var Chat_SlowmodeSendError: String { return self._s[2175]! } - public var Application_Update: String { return self._s[2177]! } - public var SocksProxySetup_SaveProxy: String { return self._s[2178]! } + public var Channel_AdminLog_InfoPanelTitle: String { return self._s[2175]! } + public var Passport_Language_da: String { return self._s[2177]! } + public var Chat_SlowmodeSendError: String { return self._s[2178]! } + public var Application_Update: String { return self._s[2180]! } + public var SocksProxySetup_SaveProxy: String { return self._s[2181]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2182]!, self._r[2182]!, [_1, _2]) } - public var Privacy_AddNewPeer: String { return self._s[2181]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[2183]! } - public var Channel_Members_Title: String { return self._s[2184]! } - public var StickerPacks_ActionDelete: String { return self._s[2185]! } - public var Conversation_ScheduledVoiceChat: String { return self._s[2186]! } - public var Settings_LogoutConfirmationText: String { return self._s[2188]! } - public var Chat_UnsendMyMessages: String { return self._s[2189]! } - public var PeerInfo_ReportProfilePhoto: String { return self._s[2190]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2192]! } - public var ChatListFilter_AddChatsTitle: String { return self._s[2193]! } - public var Passport_FloodError: String { return self._s[2194]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[2195]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2196]! } - public var CallSettings_TabIconDescription: String { return self._s[2197]! } - public var Group_Setup_HistoryHeader: String { return self._s[2199]! } + public var Privacy_AddNewPeer: String { return self._s[2184]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[2186]! } + public var Channel_Members_Title: String { return self._s[2187]! } + public var StickerPacks_ActionDelete: String { return self._s[2188]! } + public var Conversation_ScheduledVoiceChat: String { return self._s[2189]! } + public var Settings_LogoutConfirmationText: String { return self._s[2191]! } + public var Chat_UnsendMyMessages: String { return self._s[2192]! } + public var PeerInfo_ReportProfilePhoto: String { return self._s[2193]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2195]! } + public var ChatListFilter_AddChatsTitle: String { return self._s[2196]! } + public var Passport_FloodError: String { return self._s[2197]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[2198]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2199]! } + public var CallSettings_TabIconDescription: String { return self._s[2200]! } + public var Group_Setup_HistoryHeader: String { return self._s[2202]! } public func Channel_AdminLog_AllowedNewMembersToSpeak(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2200]!, self._r[2200]!, [_1]) + return formatWithArgumentRanges(self._s[2203]!, self._r[2203]!, [_1]) } - public var TwoStepAuth_EmailTitle: String { return self._s[2201]! } - public var GroupInfo_Permissions_Removed: String { return self._s[2202]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[2203]! } - public var Contacts_Title: String { return self._s[2205]! } + public var TwoStepAuth_EmailTitle: String { return self._s[2204]! } + public var GroupInfo_Permissions_Removed: String { return self._s[2205]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[2206]! } + public var Contacts_Title: String { return self._s[2208]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2206]!, self._r[2206]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2209]!, self._r[2209]!, [_0, _1]) } - public var ChatList_PeerTypeBot: String { return self._s[2209]! } + public var ChatList_PeerTypeBot: String { return self._s[2212]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2210]!, self._r[2210]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2213]!, self._r[2213]!, [_1, _2]) } - public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[2211]! } + public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[2214]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2212]!, self._r[2212]!, [_1, _2, _3]) - } - public var Camera_PhotoMode: String { return self._s[2214]! } - public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2215]!, self._r[2215]!, [_1, _2, _3]) } - public var ContactInfo_PhoneLabelPager: String { return self._s[2216]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[2217]! } - public var Call_CallAgain: String { return self._s[2218]! } - public var TwoStepAuth_PasswordSet: String { return self._s[2219]! } - public var VoiceChat_EditDescriptionPlaceholder: String { return self._s[2220]! } + public var Camera_PhotoMode: String { return self._s[2217]! } + public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2218]!, self._r[2218]!, [_1, _2, _3]) + } + public var ContactInfo_PhoneLabelPager: String { return self._s[2219]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[2220]! } + public var Call_CallAgain: String { return self._s[2221]! } + public var TwoStepAuth_PasswordSet: String { return self._s[2222]! } + public var VoiceChat_EditDescriptionPlaceholder: String { return self._s[2223]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2221]!, self._r[2221]!, [_0]) + return formatWithArgumentRanges(self._s[2224]!, self._r[2224]!, [_0]) } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[2222]! } - public var ClearCache_FreeSpaceDescription: String { return self._s[2223]! } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2224]! } - public var Group_LeaveGroup: String { return self._s[2225]! } - public var Channel_Setup_LinkTypePrivate: String { return self._s[2227]! } - public var GroupInfo_LabelAdmin: String { return self._s[2229]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2231]! } - public var Notification_PassportValuePersonalDetails: String { return self._s[2232]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[2225]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[2226]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2227]! } + public var Group_LeaveGroup: String { return self._s[2228]! } + public var Channel_Setup_LinkTypePrivate: String { return self._s[2230]! } + public var GroupInfo_LabelAdmin: String { return self._s[2232]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2234]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[2235]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2233]!, self._r[2233]!, [_0]) + return formatWithArgumentRanges(self._s[2236]!, self._r[2236]!, [_0]) } - public var Stats_GroupNewMembersBySourceTitle: String { return self._s[2234]! } - public var Appearance_Preview: String { return self._s[2235]! } - public var VoiceOver_Chat_Contact: String { return self._s[2236]! } - public var Passport_Language_th: String { return self._s[2237]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2239]! } - public var LastSeen_Offline: String { return self._s[2242]! } - public var Map_OpenInHereMaps: String { return self._s[2243]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[2244]! } - public var InviteLink_ContextEdit: String { return self._s[2246]! } - public var AutoDownloadSettings_Reset: String { return self._s[2247]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[2248]! } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[2249]! } + public var Stats_GroupNewMembersBySourceTitle: String { return self._s[2237]! } + public var Appearance_Preview: String { return self._s[2238]! } + public var VoiceOver_Chat_Contact: String { return self._s[2239]! } + public var Passport_Language_th: String { return self._s[2240]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2242]! } + public var LastSeen_Offline: String { return self._s[2245]! } + public var Map_OpenInHereMaps: String { return self._s[2246]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[2247]! } + public var InviteLink_ContextEdit: String { return self._s[2249]! } + public var AutoDownloadSettings_Reset: String { return self._s[2250]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[2251]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[2252]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2250]!, self._r[2250]!, [_0]) + return formatWithArgumentRanges(self._s[2253]!, self._r[2253]!, [_0]) } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2251]!, self._r[2251]!, [_0]) + return formatWithArgumentRanges(self._s[2254]!, self._r[2254]!, [_0]) } - public var Passport_Identity_EditDriversLicense: String { return self._s[2252]! } - public var ChatListFolder_NameNonMuted: String { return self._s[2253]! } - public var Username_Placeholder: String { return self._s[2254]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[2255]! } + public var ChatListFolder_NameNonMuted: String { return self._s[2256]! } + public var Username_Placeholder: String { return self._s[2257]! } public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2255]!, self._r[2255]!, [_1]) + return formatWithArgumentRanges(self._s[2258]!, self._r[2258]!, [_1]) } - public var Passport_Language_it: String { return self._s[2256]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[2257]! } + public var Passport_Language_it: String { return self._s[2259]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[2260]! } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2258]!, self._r[2258]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2261]!, self._r[2261]!, [_1, _2]) } - public var NotificationsSound_Pulse: String { return self._s[2259]! } - public var VoiceOver_DismissContextMenu: String { return self._s[2261]! } - public var MessagePoll_NoVotes: String { return self._s[2264]! } - public var Message_Wallpaper: String { return self._s[2265]! } - public var Conversation_JoinVoiceChat: String { return self._s[2266]! } - public var Appearance_Other: String { return self._s[2267]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[2269]! } - public var Group_PublicLink_Placeholder: String { return self._s[2273]! } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2274]! } - public var VoiceOver_Recording_StopAndPreview: String { return self._s[2275]! } - public var ChatListFolder_NameBots: String { return self._s[2276]! } - public var Conversation_StopPollConfirmation: String { return self._s[2277]! } - public var UserInfo_DeleteContact: String { return self._s[2278]! } + public var NotificationsSound_Pulse: String { return self._s[2262]! } + public var VoiceOver_DismissContextMenu: String { return self._s[2264]! } + public var MessagePoll_NoVotes: String { return self._s[2267]! } + public var Message_Wallpaper: String { return self._s[2268]! } + public var Conversation_JoinVoiceChat: String { return self._s[2269]! } + public var Appearance_Other: String { return self._s[2270]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[2272]! } + public var Group_PublicLink_Placeholder: String { return self._s[2276]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2277]! } + public var VoiceOver_Recording_StopAndPreview: String { return self._s[2278]! } + public var ChatListFolder_NameBots: String { return self._s[2279]! } + public var Conversation_StopPollConfirmation: String { return self._s[2280]! } + public var UserInfo_DeleteContact: String { return self._s[2281]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2279]!, self._r[2279]!, [_0]) + return formatWithArgumentRanges(self._s[2282]!, self._r[2282]!, [_0]) } - public var Wallpaper_Wallpaper: String { return self._s[2281]! } + public var Wallpaper_Wallpaper: String { return self._s[2284]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2282]!, self._r[2282]!, [_1]) + return formatWithArgumentRanges(self._s[2285]!, self._r[2285]!, [_1]) } - public var LoginPassword_ForgotPassword: String { return self._s[2283]! } - public var FeaturedStickerPacks_Title: String { return self._s[2284]! } - public var Paint_Pen: String { return self._s[2285]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2286]! } - public var ChatListFolderSettings_Info: String { return self._s[2287]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2288]! } - public var PhotoEditor_CurvesAll: String { return self._s[2290]! } + public var LoginPassword_ForgotPassword: String { return self._s[2286]! } + public var FeaturedStickerPacks_Title: String { return self._s[2287]! } + public var Paint_Pen: String { return self._s[2288]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2289]! } + public var ChatListFolderSettings_Info: String { return self._s[2290]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2291]! } + public var PhotoEditor_CurvesAll: String { return self._s[2293]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2292]!, self._r[2292]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2295]!, self._r[2295]!, [_1, _2, _3]) } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2294]! } - public var Message_ImageExpired: String { return self._s[2295]! } - public var Call_ConnectionErrorMessage: String { return self._s[2296]! } - public var SearchImages_NoImagesFound: String { return self._s[2298]! } - public var PeerInfo_PaneGifs: String { return self._s[2299]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2300]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2301]! } - public var PhotoEditor_VignetteTool: String { return self._s[2302]! } - public var Passport_Language_dz: String { return self._s[2303]! } - public var Notifications_ChannelNotificationsHelp: String { return self._s[2304]! } - public var Conversation_BlockUser: String { return self._s[2305]! } - public var GroupPermission_PermissionDisabledByDefault: String { return self._s[2308]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2310]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2297]! } + public var Message_ImageExpired: String { return self._s[2298]! } + public var Call_ConnectionErrorMessage: String { return self._s[2299]! } + public var SearchImages_NoImagesFound: String { return self._s[2301]! } + public var PeerInfo_PaneGifs: String { return self._s[2302]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2303]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2304]! } + public var PhotoEditor_VignetteTool: String { return self._s[2305]! } + public var Passport_Language_dz: String { return self._s[2306]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[2307]! } + public var Conversation_BlockUser: String { return self._s[2308]! } + public var GroupPermission_PermissionDisabledByDefault: String { return self._s[2311]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2313]! } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2311]!, self._r[2311]!, [_0]) + return formatWithArgumentRanges(self._s[2314]!, self._r[2314]!, [_0]) } - public var KeyCommand_NewMessage: String { return self._s[2312]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[2315]! } + public var KeyCommand_NewMessage: String { return self._s[2315]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[2318]! } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2317]!, self._r[2317]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2320]!, self._r[2320]!, [_1, _2]) } - public var ContactList_Context_StartSecretChat: String { return self._s[2318]! } - public var VoiceOver_Chat_File: String { return self._s[2319]! } - public var ChatList_EditFolder: String { return self._s[2321]! } - public var Appearance_BubbleCorners_Title: String { return self._s[2322]! } - public var PeerInfo_PaneAudio: String { return self._s[2323]! } - public var ChatListFolder_CategoryContacts: String { return self._s[2325]! } - public var VoiceOver_ScheduledMessages: String { return self._s[2326]! } + public var ContactList_Context_StartSecretChat: String { return self._s[2321]! } + public var VoiceOver_Chat_File: String { return self._s[2322]! } + public var ChatList_EditFolder: String { return self._s[2324]! } + public var Appearance_BubbleCorners_Title: String { return self._s[2325]! } + public var PeerInfo_PaneAudio: String { return self._s[2326]! } + public var ChatListFolder_CategoryContacts: String { return self._s[2328]! } + public var VoiceOver_ScheduledMessages: String { return self._s[2329]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2327]!, self._r[2327]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[2330]!, self._r[2330]!, [_1, _2, _3, _4, _5]) } - public var ChatList_PeerTypeChannel: String { return self._s[2328]! } - public var VoiceOver_Navigation_Search: String { return self._s[2329]! } - public var Settings_Search: String { return self._s[2330]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2331]! } - public var Login_PhoneBannedError: String { return self._s[2332]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2333]! } - public var Passport_Language_fa: String { return self._s[2334]! } - public var Settings_About: String { return self._s[2335]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2336]! } - public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[2337]! } - public var AutoDownloadSettings_DataUsageHigh: String { return self._s[2338]! } + public var ChatList_PeerTypeChannel: String { return self._s[2331]! } + public var VoiceOver_Navigation_Search: String { return self._s[2332]! } + public var Settings_Search: String { return self._s[2333]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2334]! } + public var Login_PhoneBannedError: String { return self._s[2335]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2336]! } + public var Passport_Language_fa: String { return self._s[2337]! } + public var Settings_About: String { return self._s[2338]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2339]! } + public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[2340]! } + public var AutoDownloadSettings_DataUsageHigh: String { return self._s[2341]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2339]!, self._r[2339]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2342]!, self._r[2342]!, [_1, _2, _3]) } - public var Common_OK: String { return self._s[2340]! } - public var Contacts_SortBy: String { return self._s[2341]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[2342]! } + public var Common_OK: String { return self._s[2343]! } + public var Contacts_SortBy: String { return self._s[2344]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[2345]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2344]!, self._r[2344]!, [_0]) + return formatWithArgumentRanges(self._s[2347]!, self._r[2347]!, [_0]) } - public var CallFeedback_IncludeLogs: String { return self._s[2347]! } + public var CallFeedback_IncludeLogs: String { return self._s[2350]! } public func External_OpenIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2348]!, self._r[2348]!, [_0]) + return formatWithArgumentRanges(self._s[2351]!, self._r[2351]!, [_0]) } - public var Passcode_AppLockedAlert: String { return self._s[2350]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2351]! } - public var Channel_NotificationLoading: String { return self._s[2353]! } - public var Passport_Identity_DocumentNumber: String { return self._s[2354]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2355]! } - public var VoiceOver_Chat_OpenHint: String { return self._s[2356]! } - public var Weekday_ShortFriday: String { return self._s[2357]! } - public var Conversation_TitleMute: String { return self._s[2358]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2359]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[2360]! } - public var DialogList_LanguageTooltip: String { return self._s[2362]! } - public var BroadcastGroups_IntroTitle: String { return self._s[2363]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[2364]! } + public var Passcode_AppLockedAlert: String { return self._s[2353]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2354]! } + public var Channel_NotificationLoading: String { return self._s[2356]! } + public var Passport_Identity_DocumentNumber: String { return self._s[2357]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2358]! } + public var VoiceOver_Chat_OpenHint: String { return self._s[2359]! } + public var Weekday_ShortFriday: String { return self._s[2360]! } + public var Conversation_TitleMute: String { return self._s[2361]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2362]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[2363]! } + public var DialogList_LanguageTooltip: String { return self._s[2365]! } + public var BroadcastGroups_IntroTitle: String { return self._s[2366]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[2367]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2365]!, self._r[2365]!, [_0]) + return formatWithArgumentRanges(self._s[2368]!, self._r[2368]!, [_0]) } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[2367]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[2368]! } - public var Settings_EditVideo: String { return self._s[2369]! } - public var VoiceOver_Common_Off: String { return self._s[2370]! } - public var Stickers_FrequentlyUsed: String { return self._s[2371]! } - public var GroupPermission_Title: String { return self._s[2372]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2373]! } - public var Appearance_ThemeCarouselDay: String { return self._s[2374]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[2370]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[2371]! } + public var Settings_EditVideo: String { return self._s[2372]! } + public var VoiceOver_Common_Off: String { return self._s[2373]! } + public var Stickers_FrequentlyUsed: String { return self._s[2374]! } + public var GroupPermission_Title: String { return self._s[2375]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2376]! } + public var Appearance_ThemeCarouselDay: String { return self._s[2377]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2375]!, self._r[2375]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2378]!, self._r[2378]!, [_1, _2]) } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2376]! } - public var Tour_Title6: String { return self._s[2377]! } - public var EmptyGroupInfo_Title: String { return self._s[2378]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2379]! } + public var Tour_Title6: String { return self._s[2380]! } + public var EmptyGroupInfo_Title: String { return self._s[2381]! } public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2379]!, self._r[2379]!, [_0]) + return formatWithArgumentRanges(self._s[2382]!, self._r[2382]!, [_0]) } - public var Passport_Language_sk: String { return self._s[2380]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[2381]! } - public var Preview_SaveToCameraRoll: String { return self._s[2382]! } + public var Passport_Language_sk: String { return self._s[2383]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[2384]! } + public var Preview_SaveToCameraRoll: String { return self._s[2385]! } public func VoiceChat_YouCanNowSpeakIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2383]!, self._r[2383]!, [_0]) + return formatWithArgumentRanges(self._s[2386]!, self._r[2386]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[2384]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2385]! } - public var Conversation_ContextMenuMore: String { return self._s[2386]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2387]! } - public var Channel_AdminLog_CanBeAnonymous: String { return self._s[2388]! } - public var CallFeedback_ReasonSilentLocal: String { return self._s[2390]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[2387]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2388]! } + public var Conversation_ContextMenuMore: String { return self._s[2389]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2390]! } + public var Channel_AdminLog_CanBeAnonymous: String { return self._s[2391]! } + public var CallFeedback_ReasonSilentLocal: String { return self._s[2393]! } public func Channel_AdminLog_UnmutedMutedParticipant(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2391]!, self._r[2391]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2394]!, self._r[2394]!, [_1, _2]) } - public var UserInfo_NotificationsDisable: String { return self._s[2392]! } + public var UserInfo_NotificationsDisable: String { return self._s[2395]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2394]!, self._r[2394]!, [_0]) + return formatWithArgumentRanges(self._s[2397]!, self._r[2397]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[2395]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[2398]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2397]!, self._r[2397]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2400]!, self._r[2400]!, [_1, _2]) } - public var WallpaperSearch_ColorPrefix: String { return self._s[2398]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2401]! } public func Message_ForwardedPsa_covid(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2399]!, self._r[2399]!, [_0]) + return formatWithArgumentRanges(self._s[2402]!, self._r[2402]!, [_0]) } - public var Conversation_RestrictedMedia: String { return self._s[2401]! } - public var Group_MessageVideoUpdated: String { return self._s[2402]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2403]! } - public var GroupInfo_DeleteAndExit: String { return self._s[2404]! } - public var TwoFactorSetup_Email_Action: String { return self._s[2405]! } - public var Media_ShareThisVideo: String { return self._s[2407]! } - public var DialogList_Replies: String { return self._s[2409]! } + public var VoiceChat_NoiseSuppressionDisabled: String { return self._s[2404]! } + public var Conversation_RestrictedMedia: String { return self._s[2405]! } + public var Group_MessageVideoUpdated: String { return self._s[2406]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2407]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2408]! } + public var TwoFactorSetup_Email_Action: String { return self._s[2409]! } + public var Media_ShareThisVideo: String { return self._s[2411]! } + public var DialogList_Replies: String { return self._s[2413]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2410]!, self._r[2410]!, [_0]) + return formatWithArgumentRanges(self._s[2414]!, self._r[2414]!, [_0]) } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2411]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[2412]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2413]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2415]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[2416]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2417]! } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2414]!, self._r[2414]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2418]!, self._r[2418]!, [_1, _2]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2415]!, self._r[2415]!, [_0]) + return formatWithArgumentRanges(self._s[2419]!, self._r[2419]!, [_0]) } - public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[2416]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2417]! } - public var ChatList_Search_NoResultsFitlerMedia: String { return self._s[2418]! } - public var Channel_Members_InviteLink: String { return self._s[2419]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[2420]! } - public var WatchRemote_AlertText: String { return self._s[2421]! } + public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[2420]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2421]! } + public var ChatList_Search_NoResultsFitlerMedia: String { return self._s[2422]! } + public var Channel_Members_InviteLink: String { return self._s[2423]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[2424]! } + public var WatchRemote_AlertText: String { return self._s[2425]! } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2422]!, self._r[2422]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2426]!, self._r[2426]!, [_1, _2]) } - public var Conversation_Pin: String { return self._s[2423]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2424]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2425]! } - public var Conversation_CancelForwardTitle: String { return self._s[2426]! } + public var Conversation_Pin: String { return self._s[2427]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2428]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2429]! } + public var Conversation_CancelForwardTitle: String { return self._s[2430]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2427]!, self._r[2427]!, [_0]) + return formatWithArgumentRanges(self._s[2431]!, self._r[2431]!, [_0]) } - public var Appearance_AppIconFilled: String { return self._s[2428]! } - public var StickerPack_ErrorNotFound: String { return self._s[2429]! } + public var Appearance_AppIconFilled: String { return self._s[2432]! } + public var StickerPack_ErrorNotFound: String { return self._s[2433]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2430]!, self._r[2430]!, [_1]) + return formatWithArgumentRanges(self._s[2434]!, self._r[2434]!, [_1]) } - public var Passport_Identity_AddIdentityCard: String { return self._s[2431]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[2435]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_1]) + return formatWithArgumentRanges(self._s[2437]!, self._r[2437]!, [_1]) } - public var Call_Camera: String { return self._s[2434]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2435]! } - public var Group_Location_Info: String { return self._s[2436]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[2437]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[2438]! } + public var Call_Camera: String { return self._s[2438]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2439]! } + public var Group_Location_Info: String { return self._s[2440]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[2441]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[2442]! } public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2439]!, self._r[2439]!, [_0]) - } - public var Weekday_Yesterday: String { return self._s[2440]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[2441]! } - public var InviteLink_Create_UsersLimit: String { return self._s[2442]! } - public func Notification_VoiceChatScheduledTodayChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2443]!, self._r[2443]!, [_0]) } - public var ArchivedPacksAlert_Title: String { return self._s[2444]! } - public var PeerInfo_PaneMembers: String { return self._s[2445]! } - public var PhotoEditor_SelectCoverFrame: String { return self._s[2446]! } - public func Location_ProximityAlertSetTextGroup(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Weekday_Yesterday: String { return self._s[2444]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[2445]! } + public var InviteLink_Create_UsersLimit: String { return self._s[2446]! } + public func Notification_VoiceChatScheduledTodayChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2447]!, self._r[2447]!, [_0]) } - public var ContactInfo_PhoneLabelMain: String { return self._s[2448]! } + public var ArchivedPacksAlert_Title: String { return self._s[2448]! } + public var PeerInfo_PaneMembers: String { return self._s[2449]! } + public var PhotoEditor_SelectCoverFrame: String { return self._s[2450]! } + public func Location_ProximityAlertSetTextGroup(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0]) + } + public var ContactInfo_PhoneLabelMain: String { return self._s[2452]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2449]!, self._r[2449]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_1, _2, _3]) } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[2450]! } - public var Channel_DiscussionGroup: String { return self._s[2451]! } - public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[2452]! } - public var InviteLink_Create_TimeLimit: String { return self._s[2454]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[2455]! } - public var VoiceOver_MessageContextForward: String { return self._s[2456]! } - public var SocksProxySetup_TypeNone: String { return self._s[2457]! } - public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[2459]! } - public var ProfilePhoto_OpenInEditor: String { return self._s[2461]! } - public var WallpaperSearch_ColorPurple: String { return self._s[2462]! } - public var ChatListFolder_IncludeChatsTitle: String { return self._s[2463]! } - public var Group_Username_InvalidTooShort: String { return self._s[2464]! } - public var Location_ProximityNotification_DistanceM: String { return self._s[2465]! } - public var VoiceChat_EditTitleText: String { return self._s[2466]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[2454]! } + public var Channel_DiscussionGroup: String { return self._s[2455]! } + public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[2456]! } + public var InviteLink_Create_TimeLimit: String { return self._s[2458]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[2459]! } + public var VoiceOver_MessageContextForward: String { return self._s[2460]! } + public var SocksProxySetup_TypeNone: String { return self._s[2461]! } + public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[2463]! } + public var ProfilePhoto_OpenInEditor: String { return self._s[2465]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2466]! } + public var ChatListFolder_IncludeChatsTitle: String { return self._s[2467]! } + public var Group_Username_InvalidTooShort: String { return self._s[2468]! } + public var Location_ProximityNotification_DistanceM: String { return self._s[2469]! } + public var VoiceChat_EditTitleText: String { return self._s[2470]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2467]!, self._r[2467]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2471]!, self._r[2471]!, [_0, _1, _2]) } - public var Passport_Language_tk: String { return self._s[2468]! } - public var ConvertToSupergroup_Title: String { return self._s[2469]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[2470]! } - public var Cache_KeepMediaHelp: String { return self._s[2471]! } - public var Channel_Management_Title: String { return self._s[2472]! } + public var Passport_Language_tk: String { return self._s[2472]! } + public var ConvertToSupergroup_Title: String { return self._s[2473]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[2474]! } + public var Cache_KeepMediaHelp: String { return self._s[2475]! } + public var Channel_Management_Title: String { return self._s[2476]! } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_1]) + return formatWithArgumentRanges(self._s[2477]!, self._r[2477]!, [_1]) } - public var Conversation_ForwardChats: String { return self._s[2474]! } - public var Passport_Language_bg: String { return self._s[2475]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2476]! } - public var Permissions_PrivacyPolicy: String { return self._s[2477]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2478]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[2479]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2480]! } - public var Conversation_ContextMenuOpenChannel: String { return self._s[2481]! } - public var Report_AdditionalDetailsPlaceholder: String { return self._s[2482]! } - public var Activity_UploadingVideo: String { return self._s[2483]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[2485]! } - public var Widget_LongTapToEdit: String { return self._s[2486]! } - public var VoiceChat_InviteLink_Listener: String { return self._s[2488]! } - public var SocksProxySetup_Credentials: String { return self._s[2489]! } - public var Preview_SaveGif: String { return self._s[2490]! } - public var Cache_Photos: String { return self._s[2491]! } - public var Channel_AdminLogFilter_EventsCalls: String { return self._s[2492]! } - public var Conversation_ContextMenuCancelEditing: String { return self._s[2493]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[2494]! } + public var Conversation_ForwardChats: String { return self._s[2478]! } + public var Passport_Language_bg: String { return self._s[2479]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2480]! } + public var Permissions_PrivacyPolicy: String { return self._s[2481]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2482]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[2483]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2484]! } + public var Conversation_ContextMenuOpenChannel: String { return self._s[2485]! } + public var Report_AdditionalDetailsPlaceholder: String { return self._s[2486]! } + public var Activity_UploadingVideo: String { return self._s[2487]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[2489]! } + public var Widget_LongTapToEdit: String { return self._s[2490]! } + public var VoiceChat_InviteLink_Listener: String { return self._s[2492]! } + public var SocksProxySetup_Credentials: String { return self._s[2493]! } + public var Preview_SaveGif: String { return self._s[2494]! } + public var Cache_Photos: String { return self._s[2495]! } + public var Channel_AdminLogFilter_EventsCalls: String { return self._s[2496]! } + public var Conversation_ContextMenuCancelEditing: String { return self._s[2497]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[2498]! } public func VoiceChat_RemoveAndBanPeerConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2495]!, self._r[2495]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2499]!, self._r[2499]!, [_1, _2]) } - public var Passport_Language_lt: String { return self._s[2496]! } - public var Passport_DeleteDocument: String { return self._s[2498]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2499]! } + public var Passport_Language_lt: String { return self._s[2500]! } + public var Passport_DeleteDocument: String { return self._s[2502]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2503]! } public func Location_ProximityNotification_NotifyLong(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2500]!, self._r[2500]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2504]!, self._r[2504]!, [_1, _2]) } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[2501]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[2505]! } public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2502]!, self._r[2502]!, [_0]) + return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_0]) } - public var AccessDenied_VideoCallCamera: String { return self._s[2503]! } + public var AccessDenied_VideoCallCamera: String { return self._s[2507]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2504]!, self._r[2504]!, [_0]) + return formatWithArgumentRanges(self._s[2508]!, self._r[2508]!, [_0]) } - public var PhotoEditor_SharpenTool: String { return self._s[2505]! } + public var PhotoEditor_SharpenTool: String { return self._s[2509]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_1]) + return formatWithArgumentRanges(self._s[2510]!, self._r[2510]!, [_1]) } - public var DialogList_Unpin: String { return self._s[2507]! } - public var Stickers_NoStickersFound: String { return self._s[2508]! } - public var UserInfo_AddContact: String { return self._s[2510]! } + public var DialogList_Unpin: String { return self._s[2511]! } + public var Stickers_NoStickersFound: String { return self._s[2512]! } + public var UserInfo_AddContact: String { return self._s[2514]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2512]!, self._r[2512]!, [_0]) + return formatWithArgumentRanges(self._s[2516]!, self._r[2516]!, [_0]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2513]!, self._r[2513]!, [_0]) + return formatWithArgumentRanges(self._s[2517]!, self._r[2517]!, [_0]) } - public var CallFeedback_VideoReasonDistorted: String { return self._s[2514]! } - public var Tour_Text2: String { return self._s[2515]! } + public var CallFeedback_VideoReasonDistorted: String { return self._s[2518]! } + public var Tour_Text2: String { return self._s[2519]! } public func Conversation_TitleCommentsFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2517]!, self._r[2517]!, [_1, _2]) - } - public var InviteLink_DeleteAllRevokedLinksAlert_Text: String { return self._s[2519]! } - public var Paint_Delete: String { return self._s[2520]! } - public func Call_VoiceChatInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2521]!, self._r[2521]!, [_1, _2]) } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2522]! } + public var InviteLink_DeleteAllRevokedLinksAlert_Text: String { return self._s[2523]! } + public var Paint_Delete: String { return self._s[2524]! } + public func Call_VoiceChatInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2525]!, self._r[2525]!, [_1, _2]) + } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2526]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2524]!, self._r[2524]!, [_0]) + return formatWithArgumentRanges(self._s[2528]!, self._r[2528]!, [_0]) } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2525]! } - public var Notification_CallOutgoingShort: String { return self._s[2526]! } - public var Checkout_PasswordEntry_Title: String { return self._s[2527]! } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2528]! } - public var Notification_MessageLifetime1m: String { return self._s[2529]! } - public var BlockedUsers_AddNew: String { return self._s[2531]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[2532]! } - public var Settings_SaveEditedPhotos: String { return self._s[2533]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[2534]! } - public var Channel_AboutItem: String { return self._s[2535]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[2536]! } - public var Privacy_Calls_P2PNever: String { return self._s[2538]! } - public var Passport_Language_uk: String { return self._s[2539]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2540]! } - public var Conversation_Moderate_Report: String { return self._s[2541]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2542]! } - public var VoiceOver_Chat_SeenByRecipients: String { return self._s[2543]! } - public var Permissions_SiriText_v0: String { return self._s[2544]! } - public var Theme_Colors_Background: String { return self._s[2545]! } - public var Notification_CallMissed: String { return self._s[2546]! } - public var Stats_ZoomOut: String { return self._s[2547]! } - public var Profile_AddToExisting: String { return self._s[2548]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2551]! } - public var VoiceChat_RemovePeerRemove: String { return self._s[2552]! } - public var Undo_DeletedChannel: String { return self._s[2553]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2529]! } + public var Notification_CallOutgoingShort: String { return self._s[2530]! } + public var Checkout_PasswordEntry_Title: String { return self._s[2531]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2532]! } + public var Notification_MessageLifetime1m: String { return self._s[2533]! } + public var BlockedUsers_AddNew: String { return self._s[2535]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[2536]! } + public var Settings_SaveEditedPhotos: String { return self._s[2537]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[2538]! } + public var Channel_AboutItem: String { return self._s[2539]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[2540]! } + public var Privacy_Calls_P2PNever: String { return self._s[2542]! } + public var Passport_Language_uk: String { return self._s[2543]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2544]! } + public var Conversation_Moderate_Report: String { return self._s[2545]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2546]! } + public var VoiceOver_Chat_SeenByRecipients: String { return self._s[2547]! } + public var Permissions_SiriText_v0: String { return self._s[2548]! } + public var Theme_Colors_Background: String { return self._s[2549]! } + public var Notification_CallMissed: String { return self._s[2550]! } + public var Stats_ZoomOut: String { return self._s[2551]! } + public var Profile_AddToExisting: String { return self._s[2552]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2555]! } + public var VoiceChat_RemovePeerRemove: String { return self._s[2556]! } + public var Undo_DeletedChannel: String { return self._s[2557]! } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2554]!, self._r[2554]!, [_0]) + return formatWithArgumentRanges(self._s[2558]!, self._r[2558]!, [_0]) } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2555]! } - public var Map_LiveLocationGroupDescription: String { return self._s[2556]! } - public var Passport_InfoFAQ_URL: String { return self._s[2557]! } - public var IntentsSettings_SuggestedChats: String { return self._s[2560]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2559]! } + public var Map_LiveLocationGroupDescription: String { return self._s[2560]! } + public var Passport_InfoFAQ_URL: String { return self._s[2561]! } + public var IntentsSettings_SuggestedChats: String { return self._s[2564]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2561]!, self._r[2561]!, [_1]) + return formatWithArgumentRanges(self._s[2565]!, self._r[2565]!, [_1]) } - public var State_connecting: String { return self._s[2562]! } - public var Passport_Identity_Country: String { return self._s[2563]! } - public var Passport_PasswordDescription: String { return self._s[2564]! } - public var ChatList_PsaLabel_covid: String { return self._s[2565]! } + public var State_connecting: String { return self._s[2566]! } + public var Passport_Identity_Country: String { return self._s[2567]! } + public var Passport_PasswordDescription: String { return self._s[2568]! } + public var ChatList_PsaLabel_covid: String { return self._s[2569]! } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_1]) + return formatWithArgumentRanges(self._s[2570]!, self._r[2570]!, [_1]) } - public var Contacts_AddPeopleNearby: String { return self._s[2567]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[2568]! } - public var ClearCache_Description: String { return self._s[2569]! } - public var Localization_LanguageName: String { return self._s[2570]! } + public var Contacts_AddPeopleNearby: String { return self._s[2571]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[2572]! } + public var ClearCache_Description: String { return self._s[2573]! } + public var Localization_LanguageName: String { return self._s[2574]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2571]!, self._r[2571]!, [_0]) + return formatWithArgumentRanges(self._s[2575]!, self._r[2575]!, [_0]) } - public var Conversation_AddMembers: String { return self._s[2572]! } - public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[2573]! } - public var UserInfo_CreateNewContact: String { return self._s[2574]! } - public var Channel_Stickers_NotFound: String { return self._s[2576]! } - public var Message_FakeAccount: String { return self._s[2577]! } - public var Watch_Message_Poll: String { return self._s[2578]! } - public var Group_Members_Title: String { return self._s[2579]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2580]! } + public var Conversation_AddMembers: String { return self._s[2576]! } + public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[2577]! } + public var UserInfo_CreateNewContact: String { return self._s[2578]! } + public var Channel_Stickers_NotFound: String { return self._s[2580]! } + public var Message_FakeAccount: String { return self._s[2581]! } + public var Watch_Message_Poll: String { return self._s[2582]! } + public var Group_Members_Title: String { return self._s[2583]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2584]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2581]!, self._r[2581]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_0, _1]) } - public var VoiceChat_CancelConfirmationText: String { return self._s[2582]! } - public var BroadcastGroups_Convert: String { return self._s[2583]! } - public var Login_InfoDeletePhoto: String { return self._s[2584]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[2585]! } - public var InstantPage_FeedbackButton: String { return self._s[2586]! } - public var Appearance_PreviewReplyText: String { return self._s[2587]! } - public var Passport_FieldPhoneHelp: String { return self._s[2588]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2589]! } - public var Media_SendingOptionsTooltip: String { return self._s[2590]! } - public var ScheduledMessages_ScheduledOnline: String { return self._s[2591]! } - public var Notifications_Badge: String { return self._s[2592]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[2593]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2594]! } + public var VoiceChat_CancelConfirmationText: String { return self._s[2586]! } + public var BroadcastGroups_Convert: String { return self._s[2587]! } + public var Login_InfoDeletePhoto: String { return self._s[2588]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[2589]! } + public var InstantPage_FeedbackButton: String { return self._s[2590]! } + public var Appearance_PreviewReplyText: String { return self._s[2591]! } + public var Passport_FieldPhoneHelp: String { return self._s[2592]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2593]! } + public var Media_SendingOptionsTooltip: String { return self._s[2594]! } + public var ScheduledMessages_ScheduledOnline: String { return self._s[2595]! } + public var Notifications_Badge: String { return self._s[2596]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[2597]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2598]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2596]!, self._r[2596]!, [_0]) + return formatWithArgumentRanges(self._s[2600]!, self._r[2600]!, [_0]) } - public var Passport_InfoLearnMore: String { return self._s[2597]! } - public var EnterPasscode_EnterTitle: String { return self._s[2598]! } - public var Appearance_EditTheme: String { return self._s[2599]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2600]! } - public var Stats_FollowersTitle: String { return self._s[2601]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[2602]! } - public var Channel_Subscribers_Title: String { return self._s[2603]! } - public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2604]! } - public var ChatImportActivity_ErrorGeneric: String { return self._s[2605]! } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[2606]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2607]! } - public var Conversation_AddToReadingList: String { return self._s[2608]! } - public var VoiceChat_EditBioPlaceholder: String { return self._s[2609]! } + public var Passport_InfoLearnMore: String { return self._s[2601]! } + public var EnterPasscode_EnterTitle: String { return self._s[2602]! } + public var Appearance_EditTheme: String { return self._s[2603]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2604]! } + public var Stats_FollowersTitle: String { return self._s[2605]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[2606]! } + public var Channel_Subscribers_Title: String { return self._s[2607]! } + public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2608]! } + public var ChatImportActivity_ErrorGeneric: String { return self._s[2609]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[2610]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2611]! } + public var Conversation_AddToReadingList: String { return self._s[2612]! } + public var VoiceChat_EditBioPlaceholder: String { return self._s[2613]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2610]!, self._r[2610]!, [_0]) + return formatWithArgumentRanges(self._s[2614]!, self._r[2614]!, [_0]) } - public var Group_AdminLog_EmptyText: String { return self._s[2611]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[2612]! } - public var Watch_Location_Current: String { return self._s[2613]! } - public var PrivacyPolicy_Title: String { return self._s[2614]! } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2621]! } - public var Channel_TypeSetup_Title: String { return self._s[2625]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[2626]! } - public var Passport_Language_ja: String { return self._s[2627]! } - public var ReportPeer_ReasonSpam: String { return self._s[2628]! } - public var Widget_GalleryDescription: String { return self._s[2629]! } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[2630]! } - public var VoiceChat_ChangePhoto: String { return self._s[2632]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[2633]! } - public var Channel_AdminLog_ChangeInfo: String { return self._s[2634]! } - public var ChatListFolder_NameNonContacts: String { return self._s[2635]! } + public var Group_AdminLog_EmptyText: String { return self._s[2615]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[2616]! } + public var Watch_Location_Current: String { return self._s[2617]! } + public var Appearance_AppIconNew1: String { return self._s[2618]! } + public var PrivacyPolicy_Title: String { return self._s[2619]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2626]! } + public var Channel_TypeSetup_Title: String { return self._s[2630]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[2631]! } + public var Passport_Language_ja: String { return self._s[2632]! } + public var ReportPeer_ReasonSpam: String { return self._s[2633]! } + public var Widget_GalleryDescription: String { return self._s[2634]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2635]! } + public var VoiceChat_ChangePhoto: String { return self._s[2637]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[2638]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[2639]! } + public var ChatListFolder_NameNonContacts: String { return self._s[2640]! } public func InviteLink_ExpiresIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2636]!, self._r[2636]!, [_0]) + return formatWithArgumentRanges(self._s[2641]!, self._r[2641]!, [_0]) } - public var Call_Audio: String { return self._s[2637]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2638]! } - public var ChatList_Search_NoResultsFitlerFiles: String { return self._s[2639]! } - public var Settings_PrivacySettings: String { return self._s[2640]! } - public var InviteLink_UsageLimitReached: String { return self._s[2641]! } - public var Stats_Followers: String { return self._s[2642]! } - public var Notifications_AddExceptionTitle: String { return self._s[2643]! } - public var TwoFactorSetup_Password_Title: String { return self._s[2644]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2645]! } - public var OldChannels_NoticeText: String { return self._s[2646]! } - public var Conversation_SavedMessages: String { return self._s[2647]! } - public var Intents_ErrorLockedText: String { return self._s[2648]! } + public var Call_Audio: String { return self._s[2642]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2643]! } + public var ChatList_Search_NoResultsFitlerFiles: String { return self._s[2644]! } + public var Settings_PrivacySettings: String { return self._s[2645]! } + public var InviteLink_UsageLimitReached: String { return self._s[2646]! } + public var Stats_Followers: String { return self._s[2647]! } + public var Notifications_AddExceptionTitle: String { return self._s[2648]! } + public var TwoFactorSetup_Password_Title: String { return self._s[2649]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2650]! } + public var OldChannels_NoticeText: String { return self._s[2651]! } + public var Conversation_SavedMessages: String { return self._s[2652]! } + public var Intents_ErrorLockedText: String { return self._s[2653]! } public func Conversation_PeerNearbyTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2650]!, self._r[2650]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2655]!, self._r[2655]!, [_1, _2]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2651]! } - public var Appearance_ThemeNightBlue: String { return self._s[2652]! } - public var Notification_ChannelInviterSelf: String { return self._s[2653]! } - public var Conversation_ForwardTooltip_SavedMessages_Many: String { return self._s[2654]! } - public var InviteLink_Create_TimeLimitExpiryDateNever: String { return self._s[2656]! } - public var Watch_UserInfo_Service: String { return self._s[2657]! } - public var ChatList_Context_Back: String { return self._s[2658]! } - public var Passport_Email_Title: String { return self._s[2659]! } - public var Stats_GroupTopAdmin_Promote: String { return self._s[2660]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2656]! } + public var Appearance_ThemeNightBlue: String { return self._s[2657]! } + public var Notification_ChannelInviterSelf: String { return self._s[2658]! } + public var Conversation_ForwardTooltip_SavedMessages_Many: String { return self._s[2659]! } + public var InviteLink_Create_TimeLimitExpiryDateNever: String { return self._s[2661]! } + public var Watch_UserInfo_Service: String { return self._s[2662]! } + public var ChatList_Context_Back: String { return self._s[2663]! } + public var Passport_Email_Title: String { return self._s[2664]! } + public var Stats_GroupTopAdmin_Promote: String { return self._s[2665]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2661]!, self._r[2661]!, [_1]) + return formatWithArgumentRanges(self._s[2666]!, self._r[2666]!, [_1]) } - public var Conversation_UnsupportedMedia: String { return self._s[2662]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2663]! } - public var Privacy_TopPeersHelp: String { return self._s[2665]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[2666]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2667]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[2668]! } + public var Conversation_UnsupportedMedia: String { return self._s[2667]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2668]! } + public var Privacy_TopPeersHelp: String { return self._s[2670]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[2671]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2672]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[2673]! } public func Location_ProximityNotification_AlreadyClose(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2669]!, self._r[2669]!, [_0]) + return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_0]) } - public var Notification_PassportValueProofOfAddress: String { return self._s[2670]! } - public var Map_Map: String { return self._s[2671]! } - public var WallpaperSearch_ColorBlue: String { return self._s[2672]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[2673]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2674]! } - public var ChatList_Search_FilterMusic: String { return self._s[2675]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[2676]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2677]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[2679]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[2675]! } + public var Map_Map: String { return self._s[2676]! } + public var WallpaperSearch_ColorBlue: String { return self._s[2677]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[2678]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2679]! } + public var ChatList_Search_FilterMusic: String { return self._s[2680]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[2681]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2682]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[2684]! } public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2680]!, self._r[2680]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2685]!, self._r[2685]!, [_1, _2]) } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2681]!, self._r[2681]!, [_0]) + return formatWithArgumentRanges(self._s[2686]!, self._r[2686]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2682]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2683]! } - public var VoiceOver_ChatList_MessageEmpty: String { return self._s[2685]! } - public var GroupInfo_Location: String { return self._s[2686]! } - public var Passport_Language_ka: String { return self._s[2687]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2687]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2688]! } + public var VoiceOver_ChatList_MessageEmpty: String { return self._s[2690]! } + public var GroupInfo_Location: String { return self._s[2691]! } + public var Passport_Language_ka: String { return self._s[2692]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2688]!, self._r[2688]!, [_0]) + return formatWithArgumentRanges(self._s[2693]!, self._r[2693]!, [_0]) } - public var Conversation_ContextMenuOpenChannelProfile: String { return self._s[2689]! } - public var ChatImport_SelectionConfirmationAlertTitle: String { return self._s[2691]! } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[2693]! } - public var DialogList_SearchSectionRecent: String { return self._s[2694]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2695]! } - public var Conversation_Timer_Send: String { return self._s[2696]! } + public var Conversation_ContextMenuOpenChannelProfile: String { return self._s[2694]! } + public var ChatImport_SelectionConfirmationAlertTitle: String { return self._s[2696]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[2698]! } + public var DialogList_SearchSectionRecent: String { return self._s[2699]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2700]! } + public var Conversation_Timer_Send: String { return self._s[2701]! } public func VoiceOver_ScrollStatus(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2698]!, self._r[2698]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2703]!, self._r[2703]!, [_1, _2]) } - public var ChatState_Updating: String { return self._s[2699]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[2700]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2701]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[2702]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2703]! } - public var InviteLink_Create_TimeLimitExpiryTime: String { return self._s[2704]! } - public var ChannelInfo_InviteLink_RevokeAlert_Text: String { return self._s[2705]! } - public var ChatList_Search_NoResults: String { return self._s[2706]! } - public var ChatListFolderSettings_AddRecommended: String { return self._s[2708]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2709]! } - public var PeerInfo_GroupAboutItem: String { return self._s[2710]! } - public var VoiceOver_SelfDestructTimerOff: String { return self._s[2712]! } + public var ChatState_Updating: String { return self._s[2704]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[2705]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2706]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[2707]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2708]! } + public var InviteLink_Create_TimeLimitExpiryTime: String { return self._s[2709]! } + public var ChannelInfo_InviteLink_RevokeAlert_Text: String { return self._s[2710]! } + public var ChatList_Search_NoResults: String { return self._s[2711]! } + public var ChatListFolderSettings_AddRecommended: String { return self._s[2713]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2714]! } + public var PeerInfo_GroupAboutItem: String { return self._s[2715]! } + public var VoiceOver_SelfDestructTimerOff: String { return self._s[2717]! } public func Channel_AdminLog_DeletedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2713]!, self._r[2713]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1, _2]) } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2714]!, self._r[2714]!, [_0]) + return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_0]) } - public var PrivacySettings_AuthSessions: String { return self._s[2715]! } - public var Passport_Address_Postcode: String { return self._s[2716]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2717]! } + public var PrivacySettings_AuthSessions: String { return self._s[2720]! } + public var Passport_Address_Postcode: String { return self._s[2721]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2722]! } public func VoiceChat_ForwardTooltip_ManyChats(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2723]!, self._r[2723]!, [_0, _1]) } - public var Passport_Address_Street2Placeholder: String { return self._s[2719]! } - public var Group_Location_Title: String { return self._s[2720]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[2721]! } - public var PeopleNearby_UsersEmpty: String { return self._s[2722]! } - public var Conversation_ContextMenuSpeak: String { return self._s[2724]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[2725]! } + public var Passport_Address_Street2Placeholder: String { return self._s[2724]! } + public var Group_Location_Title: String { return self._s[2725]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[2726]! } + public var PeopleNearby_UsersEmpty: String { return self._s[2727]! } + public var Conversation_ContextMenuSpeak: String { return self._s[2729]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[2730]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2727]!, self._r[2727]!, [_0]) + return formatWithArgumentRanges(self._s[2732]!, self._r[2732]!, [_0]) } - public var Proxy_TooltipUnavailable: String { return self._s[2728]! } - public var Map_Search: String { return self._s[2729]! } - public var VoiceChat_CancelConfirmationTitle: String { return self._s[2730]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2731]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2732]! } + public var Proxy_TooltipUnavailable: String { return self._s[2733]! } + public var Map_Search: String { return self._s[2734]! } + public var VoiceChat_CancelConfirmationTitle: String { return self._s[2735]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2736]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2737]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_0]) + return formatWithArgumentRanges(self._s[2738]!, self._r[2738]!, [_0]) } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[2734]! } - public var ProfilePhoto_MainPhoto: String { return self._s[2735]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2736]! } - public var SharedMedia_EmptyMusicText: String { return self._s[2737]! } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[2738]! } - public var NetworkUsageSettings_BytesReceived: String { return self._s[2739]! } - public var Channel_AdminLog_EmptyText: String { return self._s[2740]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2741]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[2742]! } - public var Notifications_GroupNotifications: String { return self._s[2743]! } - public var AccessDenied_SaveMedia: String { return self._s[2744]! } - public var InviteLink_Create_Revoke: String { return self._s[2745]! } - public var GroupInfo_LabelOwner: String { return self._s[2746]! } - public var Passport_Language_id: String { return self._s[2748]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2749]! } - public var Conversation_UnpinMessageAlert: String { return self._s[2750]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[2739]! } + public var ProfilePhoto_MainPhoto: String { return self._s[2740]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2741]! } + public var SharedMedia_EmptyMusicText: String { return self._s[2742]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[2743]! } + public var NetworkUsageSettings_BytesReceived: String { return self._s[2744]! } + public var Channel_AdminLog_EmptyText: String { return self._s[2745]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2746]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[2747]! } + public var Notifications_GroupNotifications: String { return self._s[2748]! } + public var AccessDenied_SaveMedia: String { return self._s[2749]! } + public var InviteLink_Create_Revoke: String { return self._s[2750]! } + public var GroupInfo_LabelOwner: String { return self._s[2751]! } + public var Passport_Language_id: String { return self._s[2753]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2754]! } + public var Conversation_UnpinMessageAlert: String { return self._s[2755]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_0]) + return formatWithArgumentRanges(self._s[2756]!, self._r[2756]!, [_0]) } public func Call_RemoteVideoPaused(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2752]!, self._r[2752]!, [_0]) + return formatWithArgumentRanges(self._s[2757]!, self._r[2757]!, [_0]) } - public var TwoFactorSetup_Done_Text: String { return self._s[2753]! } + public var TwoFactorSetup_Done_Text: String { return self._s[2758]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_0]) - } - public var NetworkUsageSettings_BytesSent: String { return self._s[2755]! } - public var Conversation_AudioRateTooltipNormal: String { return self._s[2756]! } - public var VoiceChat_EditDescriptionSuccess: String { return self._s[2757]! } - public var OwnershipTransfer_Transfer: String { return self._s[2758]! } - public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_0]) } - public var Passport_Language_pt: String { return self._s[2760]! } - public var PrivacySettings_WebSessions: String { return self._s[2761]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[2763]! } - public var TwoFactorSetup_Hint_Title: String { return self._s[2764]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[2760]! } + public var Conversation_AudioRateTooltipNormal: String { return self._s[2761]! } + public var VoiceChat_EditDescriptionSuccess: String { return self._s[2762]! } + public var OwnershipTransfer_Transfer: String { return self._s[2763]! } + public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2764]!, self._r[2764]!, [_0]) + } + public var Passport_Language_pt: String { return self._s[2765]! } + public var PrivacySettings_WebSessions: String { return self._s[2766]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[2768]! } + public var TwoFactorSetup_Hint_Title: String { return self._s[2769]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2765]!, self._r[2765]!, [_0]) + return formatWithArgumentRanges(self._s[2770]!, self._r[2770]!, [_0]) } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2766]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2767]! } - public var AutoNightTheme_Scheduled: String { return self._s[2768]! } - public var CreatePoll_ExplanationHeader: String { return self._s[2769]! } - public var Calls_TabTitle: String { return self._s[2770]! } - public var VoiceChat_RecordingInProgress: String { return self._s[2771]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[2772]! } - public var Notification_VideoCallCanceled: String { return self._s[2773]! } - public var Login_CodeSentInternal: String { return self._s[2774]! } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[2775]! } - public var Call_RecordingDisabledMessage: String { return self._s[2777]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2771]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2772]! } + public var AutoNightTheme_Scheduled: String { return self._s[2773]! } + public var CreatePoll_ExplanationHeader: String { return self._s[2774]! } + public var Calls_TabTitle: String { return self._s[2775]! } + public var VoiceChat_RecordingInProgress: String { return self._s[2776]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[2777]! } + public var Notification_VideoCallCanceled: String { return self._s[2778]! } + public var Login_CodeSentInternal: String { return self._s[2779]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[2780]! } + public var Call_RecordingDisabledMessage: String { return self._s[2782]! } public func VoiceChat_RemovedPeerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2778]!, self._r[2778]!, [_0]) + return formatWithArgumentRanges(self._s[2783]!, self._r[2783]!, [_0]) } - public var Conversation_UsersTooMuchError: String { return self._s[2780]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2781]! } - public var Channel_Info_Stickers: String { return self._s[2782]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[2783]! } + public var Conversation_UsersTooMuchError: String { return self._s[2785]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2786]! } + public var VoiceChat_StopScreenSharingShort: String { return self._s[2787]! } + public var Channel_Info_Stickers: String { return self._s[2788]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[2789]! } public func Conversation_PeerNearbyDistance(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2784]!, self._r[2784]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2790]!, self._r[2790]!, [_1, _2]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[2785]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[2791]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2786]!, self._r[2786]!, [_0]) + return formatWithArgumentRanges(self._s[2792]!, self._r[2792]!, [_0]) } - public var Passport_DiscardMessageTitle: String { return self._s[2787]! } - public var Call_VoiceOver_VideoCallIncoming: String { return self._s[2788]! } - public var Localization_LanguageOther: String { return self._s[2789]! } - public var Conversation_EncryptionCanceled: String { return self._s[2790]! } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2791]! } - public var ReportPeer_ReasonFake: String { return self._s[2793]! } + public var Passport_DiscardMessageTitle: String { return self._s[2793]! } + public var Call_VoiceOver_VideoCallIncoming: String { return self._s[2794]! } + public var Localization_LanguageOther: String { return self._s[2795]! } + public var Conversation_EncryptionCanceled: String { return self._s[2796]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2797]! } + public var ReportPeer_ReasonFake: String { return self._s[2799]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) + return formatWithArgumentRanges(self._s[2800]!, self._r[2800]!, [_0]) } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2796]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2797]! } - public var InviteLink_Create_UsersLimitNumberOfUsers: String { return self._s[2798]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2802]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2803]! } + public var InviteLink_Create_UsersLimitNumberOfUsers: String { return self._s[2804]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2799]!, self._r[2799]!, [_1]) + return formatWithArgumentRanges(self._s[2805]!, self._r[2805]!, [_1]) } - public var Conversation_ScamWarning: String { return self._s[2801]! } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[2802]! } - public var LocalGroup_Title: String { return self._s[2803]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[2805]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[2806]! } - public var VoiceChat_SelectAccount: String { return self._s[2807]! } - public var Login_PhoneFloodError: String { return self._s[2808]! } - public var Conversation_PinMessageAlert_PinAndNotifyMembers: String { return self._s[2809]! } - public var Username_InvalidTaken: String { return self._s[2811]! } - public var SocksProxySetup_AddProxy: String { return self._s[2813]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[2814]! } - public var MediaPicker_UngroupDescription: String { return self._s[2815]! } - public var Login_CodeExpired: String { return self._s[2816]! } - public var Localization_ChooseLanguage: String { return self._s[2817]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[2818]! } + public var Conversation_ScamWarning: String { return self._s[2807]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[2808]! } + public var LocalGroup_Title: String { return self._s[2809]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[2811]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[2812]! } + public var VoiceChat_SelectAccount: String { return self._s[2813]! } + public var Login_PhoneFloodError: String { return self._s[2814]! } + public var Conversation_PinMessageAlert_PinAndNotifyMembers: String { return self._s[2815]! } + public var Username_InvalidTaken: String { return self._s[2817]! } + public var SocksProxySetup_AddProxy: String { return self._s[2819]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[2820]! } + public var MediaPicker_UngroupDescription: String { return self._s[2821]! } + public var Login_CodeExpired: String { return self._s[2822]! } + public var Localization_ChooseLanguage: String { return self._s[2823]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[2824]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2819]!, self._r[2819]!, [_0]) + return formatWithArgumentRanges(self._s[2825]!, self._r[2825]!, [_0]) } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2820]!, self._r[2820]!, [_0]) + return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_0]) } - public var ReportPeer_ReasonOther_Title: String { return self._s[2822]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[2823]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[2828]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[2829]! } public func VoiceChat_UserInvited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2824]!, self._r[2824]!, [_0]) + return formatWithArgumentRanges(self._s[2830]!, self._r[2830]!, [_0]) } - public var PeerInfo_ButtonDiscuss: String { return self._s[2825]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[2826]! } - public var Call_StatusNoAnswer: String { return self._s[2827]! } - public var ScheduledMessages_DeleteMany: String { return self._s[2829]! } - public var Channel_DiscussionGroupInfo: String { return self._s[2830]! } - public var Conversation_UnarchiveDone: String { return self._s[2831]! } - public var LogoutOptions_AddAccountText: String { return self._s[2832]! } - public var Message_PinnedContactMessage: String { return self._s[2833]! } + public var PeerInfo_ButtonDiscuss: String { return self._s[2831]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[2832]! } + public var Call_StatusNoAnswer: String { return self._s[2833]! } + public var ScheduledMessages_DeleteMany: String { return self._s[2835]! } + public var Channel_DiscussionGroupInfo: String { return self._s[2836]! } + public var Conversation_UnarchiveDone: String { return self._s[2837]! } + public var LogoutOptions_AddAccountText: String { return self._s[2838]! } + public var Message_PinnedContactMessage: String { return self._s[2839]! } public func ChatList_DeleteAndLeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2834]!, self._r[2834]!, [_0]) + return formatWithArgumentRanges(self._s[2840]!, self._r[2840]!, [_0]) } - public var VoiceChat_EditBioTitle: String { return self._s[2836]! } + public var VoiceChat_EditBioTitle: String { return self._s[2842]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) + return formatWithArgumentRanges(self._s[2843]!, self._r[2843]!, [_0]) } - public var Stats_GroupLanguagesTitle: String { return self._s[2838]! } - public var Passport_FieldAddressHelp: String { return self._s[2839]! } + public var Stats_GroupLanguagesTitle: String { return self._s[2844]! } + public var Passport_FieldAddressHelp: String { return self._s[2845]! } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2840]!, self._r[2840]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2846]!, self._r[2846]!, [_1, _2]) } - public var ChatSettings_OpenLinksIn: String { return self._s[2842]! } - public var TwoFactorSetup_Hint_SkipAction: String { return self._s[2843]! } - public var Message_Photo: String { return self._s[2844]! } - public var Media_LimitedAccessManage: String { return self._s[2846]! } - public var MediaPicker_AddCaption: String { return self._s[2847]! } - public var LogoutOptions_Title: String { return self._s[2848]! } + public var ChatSettings_OpenLinksIn: String { return self._s[2848]! } + public var TwoFactorSetup_Hint_SkipAction: String { return self._s[2849]! } + public var Message_Photo: String { return self._s[2850]! } + public var Media_LimitedAccessManage: String { return self._s[2852]! } + public var MediaPicker_AddCaption: String { return self._s[2853]! } + public var LogoutOptions_Title: String { return self._s[2854]! } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2849]!, self._r[2849]!, [_1]) + return formatWithArgumentRanges(self._s[2855]!, self._r[2855]!, [_1]) } - public var Conversation_StatusKickedFromGroup: String { return self._s[2850]! } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2851]! } - public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2852]! } - public var Channel_AdminLogFilter_Title: String { return self._s[2853]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[2854]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[2855]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2856]! } - public var ChannelIntro_Title: String { return self._s[2857]! } - public var Stats_Message_Views: String { return self._s[2858]! } - public var Stickers_Install: String { return self._s[2859]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[2856]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2857]! } + public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2858]! } + public var Channel_AdminLogFilter_Title: String { return self._s[2859]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[2860]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[2861]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2862]! } + public var ChannelIntro_Title: String { return self._s[2863]! } + public var Stats_Message_Views: String { return self._s[2864]! } + public var Stickers_Install: String { return self._s[2865]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2860]!, self._r[2860]!, [_0]) + return formatWithArgumentRanges(self._s[2866]!, self._r[2866]!, [_0]) } - public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[2861]! } - public var Conversation_SwipeToReplyHintTitle: String { return self._s[2863]! } - public var Settings_Username: String { return self._s[2866]! } - public var FastTwoStepSetup_Title: String { return self._s[2867]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2868]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[2869]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2871]! } - public var CallFeedback_ReasonEcho: String { return self._s[2872]! } + public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[2867]! } + public var Conversation_SwipeToReplyHintTitle: String { return self._s[2869]! } + public var Settings_Username: String { return self._s[2872]! } + public var FastTwoStepSetup_Title: String { return self._s[2873]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2874]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[2875]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2877]! } + public var CallFeedback_ReasonEcho: String { return self._s[2878]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2873]!, self._r[2873]!, [_0]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) } - public var Conversation_OpenBotLinkTitle: String { return self._s[2874]! } - public var SocksProxySetup_Title: String { return self._s[2875]! } - public var CallFeedback_Success: String { return self._s[2876]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[2878]! } - public var InstantPage_AutoNightTheme: String { return self._s[2880]! } - public var Watch_Conversation_Reply: String { return self._s[2881]! } - public var VoiceChat_Share: String { return self._s[2883]! } - public var VoiceChat_AddPhoto: String { return self._s[2884]! } - public var Chat_PanelUnpinAllMessages: String { return self._s[2885]! } - public var WallpaperPreview_Pattern: String { return self._s[2886]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2887]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[2880]! } + public var SocksProxySetup_Title: String { return self._s[2881]! } + public var CallFeedback_Success: String { return self._s[2882]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[2884]! } + public var InstantPage_AutoNightTheme: String { return self._s[2886]! } + public var Watch_Conversation_Reply: String { return self._s[2887]! } + public var VoiceChat_Share: String { return self._s[2889]! } + public var VoiceChat_AddPhoto: String { return self._s[2890]! } + public var Chat_PanelUnpinAllMessages: String { return self._s[2891]! } + public var WallpaperPreview_Pattern: String { return self._s[2892]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2893]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2888]!, self._r[2888]!, [_0]) + return formatWithArgumentRanges(self._s[2894]!, self._r[2894]!, [_0]) } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[2889]! } - public var VoiceOver_Chat_GroupInfo: String { return self._s[2890]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[2892]! } - public var Update_Title: String { return self._s[2893]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[2894]! } - public var WallpaperPreview_CropTopText: String { return self._s[2897]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[2898]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2899]! } - public var ChatListFolder_DiscardCancel: String { return self._s[2900]! } - public var Message_PinnedPhotoMessage: String { return self._s[2901]! } - public var Appearance_ThemeDayClassic: String { return self._s[2902]! } - public var VoiceChat_ChangeName: String { return self._s[2903]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[2905]! } - public var VoiceChat_DisplayAsInfo: String { return self._s[2907]! } - public var AccessDenied_Wallpapers: String { return self._s[2912]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[2895]! } + public var VoiceOver_Chat_GroupInfo: String { return self._s[2896]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[2898]! } + public var Update_Title: String { return self._s[2899]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[2900]! } + public var WallpaperPreview_CropTopText: String { return self._s[2903]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[2904]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2905]! } + public var ChatListFolder_DiscardCancel: String { return self._s[2906]! } + public var Message_PinnedPhotoMessage: String { return self._s[2907]! } + public var Appearance_ThemeDayClassic: String { return self._s[2908]! } + public var VoiceChat_ChangeName: String { return self._s[2909]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[2911]! } + public var VoiceChat_DisplayAsInfo: String { return self._s[2913]! } + public var AccessDenied_Wallpapers: String { return self._s[2918]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2913]!, self._r[2913]!, [_0]) + return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_0]) } - public var Weekday_Sunday: String { return self._s[2914]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[2916]! } - public var PeopleNearby_MakeVisibleDescription: String { return self._s[2917]! } - public var AccessDenied_LocationDisabled: String { return self._s[2918]! } - public var Tour_Text3: String { return self._s[2919]! } - public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2920]! } + public var Weekday_Sunday: String { return self._s[2920]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[2922]! } + public var PeopleNearby_MakeVisibleDescription: String { return self._s[2923]! } + public var AccessDenied_LocationDisabled: String { return self._s[2924]! } + public var Tour_Text3: String { return self._s[2925]! } + public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2926]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2921]!, self._r[2921]!, [_0]) + return formatWithArgumentRanges(self._s[2927]!, self._r[2927]!, [_0]) } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2922]! } - public var Conversation_ClearCache: String { return self._s[2923]! } - public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[2924]! } - public var ChatList_Tabs_AllChats: String { return self._s[2925]! } - public var DialogList_RecentTitlePeople: String { return self._s[2926]! } - public var Stickers_AddToFavorites: String { return self._s[2927]! } - public var ChatList_Context_RemoveFromFolder: String { return self._s[2928]! } - public var VoiceChat_CancelSpeakRequest: String { return self._s[2929]! } - public var Settings_RemoveVideo: String { return self._s[2930]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2931]! } - public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[2932]! } - public var VoiceOver_Chat_YourFile: String { return self._s[2933]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[2935]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[2936]! } - public var VoiceChat_TapToAddBio: String { return self._s[2937]! } - public var Channel_AdminLog_AddMembers: String { return self._s[2938]! } - public var Map_SendThisLocation: String { return self._s[2940]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[2942]! } - public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2943]! } - public var CloudStorage_Title: String { return self._s[2944]! } - public var TwoFactorSetup_Password_Action: String { return self._s[2945]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[2946]! } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[2948]! } - public var Undo_LeftGroup: String { return self._s[2949]! } - public var Conversation_StopLiveLocation: String { return self._s[2950]! } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[2951]! } - public var Message_PinnedInvoice: String { return self._s[2952]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2953]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2928]! } + public var Conversation_ClearCache: String { return self._s[2929]! } + public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[2930]! } + public var ChatList_Tabs_AllChats: String { return self._s[2931]! } + public var DialogList_RecentTitlePeople: String { return self._s[2932]! } + public var Stickers_AddToFavorites: String { return self._s[2933]! } + public var ChatList_Context_RemoveFromFolder: String { return self._s[2934]! } + public var VoiceChat_CancelSpeakRequest: String { return self._s[2935]! } + public var Settings_RemoveVideo: String { return self._s[2936]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2937]! } + public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[2938]! } + public var VoiceOver_Chat_YourFile: String { return self._s[2939]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[2941]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[2942]! } + public var VoiceChat_TapToAddBio: String { return self._s[2943]! } + public var Channel_AdminLog_AddMembers: String { return self._s[2944]! } + public var Map_SendThisLocation: String { return self._s[2946]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[2948]! } + public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2949]! } + public var CloudStorage_Title: String { return self._s[2950]! } + public var TwoFactorSetup_Password_Action: String { return self._s[2951]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[2952]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[2954]! } + public var Undo_LeftGroup: String { return self._s[2955]! } + public var Conversation_StopLiveLocation: String { return self._s[2956]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[2957]! } + public var Message_PinnedInvoice: String { return self._s[2958]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2959]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2955]!, self._r[2955]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_1, _2]) } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2956]!, self._r[2956]!, [_0]) + return formatWithArgumentRanges(self._s[2962]!, self._r[2962]!, [_0]) } - public var Weekday_Tuesday: String { return self._s[2957]! } - public var ChangePhoneNumberCode_Code: String { return self._s[2958]! } - public var VoiceOver_Chat_YourMessage: String { return self._s[2959]! } - public var Calls_CallTabDescription: String { return self._s[2960]! } - public var ChatImport_SelectionErrorNotAdmin: String { return self._s[2961]! } - public var SocksProxySetup_UseProxy: String { return self._s[2963]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2964]! } - public var PasscodeSettings_AlphanumericCode: String { return self._s[2965]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[2966]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[2968]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2969]! } - public var Exceptions_AddToExceptions: String { return self._s[2970]! } - public var UserInfo_Title: String { return self._s[2971]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[2973]! } - public var VoiceChat_EditDescription: String { return self._s[2975]! } - public var ChatList_Unmute: String { return self._s[2976]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[2977]! } + public var Weekday_Tuesday: String { return self._s[2963]! } + public var ChangePhoneNumberCode_Code: String { return self._s[2964]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[2965]! } + public var Calls_CallTabDescription: String { return self._s[2966]! } + public var ChatImport_SelectionErrorNotAdmin: String { return self._s[2967]! } + public var SocksProxySetup_UseProxy: String { return self._s[2969]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2970]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[2971]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[2972]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[2974]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2975]! } + public var Exceptions_AddToExceptions: String { return self._s[2976]! } + public var UserInfo_Title: String { return self._s[2977]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[2979]! } + public var VoiceChat_EditDescription: String { return self._s[2981]! } + public var ChatList_Unmute: String { return self._s[2982]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[2983]! } public func Channel_AdminLog_MessageChangedAutoremoveTimeoutSet(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2978]!, self._r[2978]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2984]!, self._r[2984]!, [_1, _2]) } - public var Stats_GroupTopPostersTitle: String { return self._s[2979]! } - public var Username_CheckingUsername: String { return self._s[2981]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2982]! } - public var PeerSelection_ImportIntoNewGroup: String { return self._s[2986]! } - public var Location_ProximityAlertSetTitle: String { return self._s[2987]! } - public var AuthSessions_AddedDeviceTerminate: String { return self._s[2988]! } - public var Conversation_JoinVoiceChatAsSpeaker: String { return self._s[2989]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[2990]! } - public var Settings_ChangePhoneNumber: String { return self._s[2991]! } - public var PeerInfo_PaneLinks: String { return self._s[2992]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2995]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[2997]! } + public var Stats_GroupTopPostersTitle: String { return self._s[2985]! } + public var Username_CheckingUsername: String { return self._s[2987]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2988]! } + public var PeerSelection_ImportIntoNewGroup: String { return self._s[2992]! } + public var Location_ProximityAlertSetTitle: String { return self._s[2993]! } + public var AuthSessions_AddedDeviceTerminate: String { return self._s[2994]! } + public var Conversation_JoinVoiceChatAsSpeaker: String { return self._s[2995]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[2996]! } + public var Settings_ChangePhoneNumber: String { return self._s[2997]! } + public var PeerInfo_PaneLinks: String { return self._s[2998]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3001]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[3003]! } public func PUSH_CHAT_VOICECHAT_INVITE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2998]!, self._r[2998]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3004]!, self._r[3004]!, [_1, _2]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[2999]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3000]! } - public var VoiceChat_CancelConfirmationEnd: String { return self._s[3001]! } - public var BroadcastGroups_ConfirmationAlert_Title: String { return self._s[3002]! } - public var Stats_FollowersBySourceTitle: String { return self._s[3004]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3005]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3006]! } + public var VoiceChat_CancelConfirmationEnd: String { return self._s[3007]! } + public var BroadcastGroups_ConfirmationAlert_Title: String { return self._s[3008]! } + public var Stats_FollowersBySourceTitle: String { return self._s[3010]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3005]!, self._r[3005]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3011]!, self._r[3011]!, [_0, _1]) } - public var Compose_NewEncryptedChatTitle: String { return self._s[3006]! } - public var Channel_CommentsGroup_Header: String { return self._s[3008]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3012]! } + public var Channel_CommentsGroup_Header: String { return self._s[3014]! } public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_0]) + return formatWithArgumentRanges(self._s[3018]!, self._r[3018]!, [_0]) } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3013]!, self._r[3013]!, [_1]) + return formatWithArgumentRanges(self._s[3019]!, self._r[3019]!, [_1]) } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3015]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3021]! } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3016]!, self._r[3016]!, [_0]) + return formatWithArgumentRanges(self._s[3022]!, self._r[3022]!, [_0]) } - public var Conversation_ReportMessages: String { return self._s[3017]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3018]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3019]! } - public var PrivacySettings_LastSeen: String { return self._s[3021]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[3022]! } - public var Theme_Colors_Proceed: String { return self._s[3023]! } - public var UserInfo_ScamBotWarning: String { return self._s[3024]! } - public var LogoutOptions_LogOut: String { return self._s[3026]! } - public var Conversation_SendMessage: String { return self._s[3027]! } - public var Conversation_CancelForwardCancelForward: String { return self._s[3028]! } - public var VoiceChat_Scheduled: String { return self._s[3030]! } - public var Passport_Address_Region: String { return self._s[3031]! } - public var MediaPicker_CameraRoll: String { return self._s[3033]! } + public var Conversation_ReportMessages: String { return self._s[3023]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3024]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3025]! } + public var PrivacySettings_LastSeen: String { return self._s[3027]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[3028]! } + public var Theme_Colors_Proceed: String { return self._s[3029]! } + public var UserInfo_ScamBotWarning: String { return self._s[3030]! } + public var LogoutOptions_LogOut: String { return self._s[3032]! } + public var Conversation_SendMessage: String { return self._s[3033]! } + public var Conversation_CancelForwardCancelForward: String { return self._s[3034]! } + public var VoiceChat_Scheduled: String { return self._s[3036]! } + public var Passport_Address_Region: String { return self._s[3037]! } + public var MediaPicker_CameraRoll: String { return self._s[3039]! } public func VoiceOver_Chat_ForwardedFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3035]!, self._r[3035]!, [_0]) + return formatWithArgumentRanges(self._s[3041]!, self._r[3041]!, [_0]) } - public var Call_ReportSend: String { return self._s[3037]! } - public var VoiceOver_ChatList_Message: String { return self._s[3038]! } - public var Month_ShortJune: String { return self._s[3039]! } - public var AutoDownloadSettings_GroupChats: String { return self._s[3040]! } + public var Call_ReportSend: String { return self._s[3043]! } + public var VoiceOver_ChatList_Message: String { return self._s[3044]! } + public var Month_ShortJune: String { return self._s[3045]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[3046]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3043]!, self._r[3043]!, [_0]) + return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0]) } - public var TwoStepAuth_DisableSuccess: String { return self._s[3044]! } - public var Cache_KeepMedia: String { return self._s[3045]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[3050]! } + public var Cache_KeepMedia: String { return self._s[3051]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3052]!, self._r[3052]!, [_1, _2, _3]) } - public var Appearance_LargeEmoji: String { return self._s[3047]! } + public var Appearance_LargeEmoji: String { return self._s[3053]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[3054]!, self._r[3054]!, [_1, _2, _3, _4, _5, _6]) } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[3049]! } - public var Privacy_PaymentsClear_PaymentInfoCleared: String { return self._s[3050]! } - public var Call_CameraConfirmationText: String { return self._s[3051]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[3055]! } + public var Privacy_PaymentsClear_PaymentInfoCleared: String { return self._s[3056]! } + public var Call_CameraConfirmationText: String { return self._s[3057]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3053]!, self._r[3053]!, [_0]) + return formatWithArgumentRanges(self._s[3059]!, self._r[3059]!, [_0]) } - public var DialogList_SearchSectionChats: String { return self._s[3054]! } - public var VoiceOver_MessageContextReport: String { return self._s[3056]! } - public var VoiceChat_RemovePeer: String { return self._s[3057]! } - public var ChatListFolder_ExcludeChatsTitle: String { return self._s[3058]! } - public var InviteLink_ContextCopy: String { return self._s[3059]! } - public var NotificationsSound_Tritone: String { return self._s[3061]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[3064]! } - public var Stats_GroupTopAdmin_Actions: String { return self._s[3065]! } - public var PeerInfo_AddToContacts: String { return self._s[3066]! } - public var VoiceChat_OpenChat: String { return self._s[3067]! } - public var AccessDenied_Title: String { return self._s[3068]! } - public var InviteLink_QRCode_InfoChannel: String { return self._s[3069]! } - public var Tour_Title1: String { return self._s[3070]! } - public var VoiceOver_AttachMedia: String { return self._s[3071]! } + public var DialogList_SearchSectionChats: String { return self._s[3060]! } + public var VoiceOver_MessageContextReport: String { return self._s[3062]! } + public var VoiceChat_RemovePeer: String { return self._s[3063]! } + public var ChatListFolder_ExcludeChatsTitle: String { return self._s[3064]! } + public var InviteLink_ContextCopy: String { return self._s[3065]! } + public var NotificationsSound_Tritone: String { return self._s[3067]! } + public var VoiceChat_YouAreSharingScreen: String { return self._s[3069]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[3071]! } + public var Stats_GroupTopAdmin_Actions: String { return self._s[3072]! } + public var PeerInfo_AddToContacts: String { return self._s[3073]! } + public var VoiceChat_OpenChat: String { return self._s[3074]! } + public var AccessDenied_Title: String { return self._s[3075]! } + public var InviteLink_QRCode_InfoChannel: String { return self._s[3076]! } + public var Tour_Title1: String { return self._s[3077]! } + public var VoiceOver_AttachMedia: String { return self._s[3078]! } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3073]!, self._r[3073]!, [_0]) + return formatWithArgumentRanges(self._s[3080]!, self._r[3080]!, [_0]) } - public var Chat_Gifs_SavedSectionHeader: String { return self._s[3074]! } - public var Privacy_DeleteDrafts_DraftsDeleted: String { return self._s[3075]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[3076]! } + public var Chat_Gifs_SavedSectionHeader: String { return self._s[3081]! } + public var Privacy_DeleteDrafts_DraftsDeleted: String { return self._s[3082]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[3083]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3077]!, self._r[3077]!, [_0]) - } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[3078]! } - public var OldChannels_Title: String { return self._s[3079]! } - public var LoginPassword_FloodError: String { return self._s[3080]! } - public var ChatImportActivity_InProgress: String { return self._s[3082]! } - public var Checkout_ErrorPaymentFailed: String { return self._s[3083]! } - public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3084]!, self._r[3084]!, [_0]) } - public var VoiceOver_Media_PlaybackPlay: String { return self._s[3087]! } - public var Passport_CorrectErrors: String { return self._s[3089]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[3085]! } + public var OldChannels_Title: String { return self._s[3086]! } + public var LoginPassword_FloodError: String { return self._s[3087]! } + public var ChatImportActivity_InProgress: String { return self._s[3089]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[3090]! } + public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3091]!, self._r[3091]!, [_0]) + } + public var VoiceOver_Media_PlaybackPlay: String { return self._s[3094]! } + public var Passport_CorrectErrors: String { return self._s[3096]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_1, _2]) - } - public var ChatListFolderSettings_Title: String { return self._s[3091]! } - public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_1, _2]) - } - public var PhotoEditor_HighlightsTool: String { return self._s[3093]! } - public var Contacts_NotRegisteredSection: String { return self._s[3096]! } - public func Call_VoiceChatInProgressCallMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3097]!, self._r[3097]!, [_1, _2]) } + public var ChatListFolderSettings_Title: String { return self._s[3098]! } + public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3099]!, self._r[3099]!, [_1, _2]) + } + public var PhotoEditor_HighlightsTool: String { return self._s[3100]! } + public var Contacts_NotRegisteredSection: String { return self._s[3103]! } + public func Call_VoiceChatInProgressCallMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3104]!, self._r[3104]!, [_1, _2]) + } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3098]!, self._r[3098]!, [_1]) + return formatWithArgumentRanges(self._s[3105]!, self._r[3105]!, [_1]) } - public var InviteLink_Create_UsersLimitInfo: String { return self._s[3099]! } - public var User_DeletedAccount: String { return self._s[3100]! } - public var Conversation_ViewContactDetails: String { return self._s[3101]! } - public var Conversation_Dice_u1F3B3: String { return self._s[3102]! } - public var WebSearch_GIFs: String { return self._s[3103]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[3104]! } - public var Appearance_PreviewOutgoingText: String { return self._s[3105]! } - public var Calls_CallTabTitle: String { return self._s[3106]! } - public var Call_VoiceChatInProgressTitle: String { return self._s[3107]! } - public var Checkout_OptionalTipItem: String { return self._s[3108]! } + public var InviteLink_Create_UsersLimitInfo: String { return self._s[3106]! } + public var User_DeletedAccount: String { return self._s[3107]! } + public var Conversation_ViewContactDetails: String { return self._s[3108]! } + public var Conversation_Dice_u1F3B3: String { return self._s[3109]! } + public var WebSearch_GIFs: String { return self._s[3110]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[3111]! } + public var Appearance_PreviewOutgoingText: String { return self._s[3112]! } + public var Calls_CallTabTitle: String { return self._s[3113]! } + public var Call_VoiceChatInProgressTitle: String { return self._s[3114]! } + public var Checkout_OptionalTipItem: String { return self._s[3115]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3109]!, self._r[3109]!, [_0]) + return formatWithArgumentRanges(self._s[3116]!, self._r[3116]!, [_0]) } - public var Channel_Status: String { return self._s[3110]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[3112]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[3113]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3114]! } + public var Channel_Status: String { return self._s[3117]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[3119]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[3120]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3121]! } public func ClearCache_Success(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3115]!, self._r[3115]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3122]!, self._r[3122]!, [_0, _1]) } - public var Passport_Identity_ExpiryDateNone: String { return self._s[3117]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[3119]! } - public var Month_ShortDecember: String { return self._s[3120]! } - public var Username_Help: String { return self._s[3121]! } - public var Login_InfoAvatarAdd: String { return self._s[3122]! } - public var Month_ShortMay: String { return self._s[3123]! } - public var DialogList_UnknownPinLimitError: String { return self._s[3124]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[3125]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[3126]! } - public var VoiceChat_StopScreenSharing: String { return self._s[3127]! } - public var VoiceChat_AskedToSpeak: String { return self._s[3128]! } - public var Weekday_ShortSunday: String { return self._s[3129]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3130]! } - public var AuthSessions_TerminateSession: String { return self._s[3131]! } - public var Passport_Identity_FilesTitle: String { return self._s[3132]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[3124]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[3126]! } + public var Month_ShortDecember: String { return self._s[3127]! } + public var Username_Help: String { return self._s[3128]! } + public var Login_InfoAvatarAdd: String { return self._s[3129]! } + public var Month_ShortMay: String { return self._s[3130]! } + public var DialogList_UnknownPinLimitError: String { return self._s[3131]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[3132]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[3133]! } + public var VoiceChat_StopScreenSharing: String { return self._s[3134]! } + public var VoiceChat_AskedToSpeak: String { return self._s[3135]! } + public var Weekday_ShortSunday: String { return self._s[3136]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3137]! } + public var AuthSessions_TerminateSession: String { return self._s[3138]! } + public var Passport_Identity_FilesTitle: String { return self._s[3139]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3133]!, self._r[3133]!, [_0]) + return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_0]) } - public var PeopleNearby_MakeVisible: String { return self._s[3135]! } + public var PeopleNearby_MakeVisible: String { return self._s[3142]! } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_0]) + return formatWithArgumentRanges(self._s[3143]!, self._r[3143]!, [_0]) } - public var Widget_UpdatedAt: String { return self._s[3137]! } + public var Widget_UpdatedAt: String { return self._s[3144]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3145]!, self._r[3145]!, [_1, _2]) } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_0]) + return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3140]! } - public var VoiceChat_VideoPreviewShareScreen: String { return self._s[3141]! } - public var Conversation_ContextMenuForward: String { return self._s[3143]! } - public var Channel_AdminLog_CanManageCalls: String { return self._s[3144]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3147]! } + public var VoiceChat_VideoPreviewShareScreen: String { return self._s[3148]! } + public var Conversation_ContextMenuForward: String { return self._s[3150]! } + public var Channel_AdminLog_CanManageCalls: String { return self._s[3151]! } public func PUSH_CHAT_MESSAGE_QUIZ(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3153]!, self._r[3153]!, [_1, _2, _3]) } - public var Notification_GroupInviterSelf: String { return self._s[3148]! } - public var Privacy_Forwards_NeverLink: String { return self._s[3149]! } - public var AuthSessions_CurrentSession: String { return self._s[3150]! } - public var Passport_Address_EditPassportRegistration: String { return self._s[3151]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3152]! } - public var ChatSearch_ResultsTooltip: String { return self._s[3154]! } - public var CheckoutInfo_Pay: String { return self._s[3155]! } + public var Notification_GroupInviterSelf: String { return self._s[3155]! } + public var Privacy_Forwards_NeverLink: String { return self._s[3156]! } + public var AuthSessions_CurrentSession: String { return self._s[3157]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[3158]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3159]! } + public var ChatSearch_ResultsTooltip: String { return self._s[3161]! } + public var CheckoutInfo_Pay: String { return self._s[3162]! } public func Conversation_PinMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_0]) + return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_0]) } - public var GroupInfo_AddParticipant: String { return self._s[3158]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[3159]! } + public var GroupInfo_AddParticipant: String { return self._s[3165]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[3166]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3160]!, self._r[3160]!, [_0]) + return formatWithArgumentRanges(self._s[3167]!, self._r[3167]!, [_0]) } - public var Localization_LanguageCustom: String { return self._s[3161]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[3162]! } - public var Settings_UsernameEmpty: String { return self._s[3163]! } - public var Settings_FAQ_URL: String { return self._s[3164]! } - public var ChatList_UndoArchiveText1: String { return self._s[3165]! } - public var Common_Select: String { return self._s[3167]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[3168]! } - public var Notification_PassportValueAddress: String { return self._s[3169]! } - public var Conversation_MessageDialogDelete: String { return self._s[3170]! } - public var Map_OpenInYandexNavigator: String { return self._s[3172]! } - public var DialogList_SearchSectionDialogs: String { return self._s[3173]! } - public var AccessDenied_Contacts: String { return self._s[3174]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[3176]! } - public var Passport_ScanPassportHelp: String { return self._s[3177]! } - public var Chat_PinnedListPreview_HidePinnedMessages: String { return self._s[3178]! } - public var ChatListFolder_NameChannels: String { return self._s[3179]! } - public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[3180]! } + public var Localization_LanguageCustom: String { return self._s[3168]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[3169]! } + public var Settings_UsernameEmpty: String { return self._s[3170]! } + public var Settings_FAQ_URL: String { return self._s[3171]! } + public var ChatList_UndoArchiveText1: String { return self._s[3172]! } + public var Common_Select: String { return self._s[3174]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[3175]! } + public var Notification_PassportValueAddress: String { return self._s[3176]! } + public var Conversation_MessageDialogDelete: String { return self._s[3177]! } + public var Map_OpenInYandexNavigator: String { return self._s[3179]! } + public var DialogList_SearchSectionDialogs: String { return self._s[3180]! } + public var AccessDenied_Contacts: String { return self._s[3181]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[3183]! } + public var Passport_ScanPassportHelp: String { return self._s[3184]! } + public var Chat_PinnedListPreview_HidePinnedMessages: String { return self._s[3185]! } + public var ChatListFolder_NameChannels: String { return self._s[3186]! } + public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[3187]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3181]!, self._r[3181]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_1, _2]) } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[3182]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[3189]! } public func VoiceChat_InviteMemberToGroupFirstText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3183]!, self._r[3183]!, [_1, _2]) - } - public var Conversation_GifTooltip: String { return self._s[3184]! } - public var Widget_MessageAutoremoveTimerUpdated: String { return self._s[3185]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3187]! } - public var VoiceChat_Connecting: String { return self._s[3188]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3189]! } - public func Channel_AdminLog_CreatedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3190]!, self._r[3190]!, [_1, _2]) } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3191]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3192]! } - public var CreatePoll_Quiz: String { return self._s[3193]! } - public var TwoFactorSetup_Email_Placeholder: String { return self._s[3195]! } - public var Watch_Message_Invoice: String { return self._s[3196]! } - public var Settings_AddAnotherAccount_Help: String { return self._s[3197]! } - public var Watch_Message_Unsupported: String { return self._s[3198]! } + public var Conversation_GifTooltip: String { return self._s[3191]! } + public var Widget_MessageAutoremoveTimerUpdated: String { return self._s[3192]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3194]! } + public var VoiceChat_Connecting: String { return self._s[3195]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3196]! } + public func Channel_AdminLog_CreatedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3197]!, self._r[3197]!, [_1, _2]) + } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3198]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3199]! } + public var CreatePoll_Quiz: String { return self._s[3200]! } + public var TwoFactorSetup_Email_Placeholder: String { return self._s[3202]! } + public var Watch_Message_Invoice: String { return self._s[3203]! } + public var Settings_AddAnotherAccount_Help: String { return self._s[3204]! } + public var Watch_Message_Unsupported: String { return self._s[3205]! } public func Call_CameraOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3200]!, self._r[3200]!, [_0]) + return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0]) } - public var AuthSessions_TerminateOtherSessions: String { return self._s[3201]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[3203]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[3204]! } - public var Call_IncomingVoiceCall: String { return self._s[3205]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[3208]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[3210]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[3211]! } + public var Call_IncomingVoiceCall: String { return self._s[3212]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3206]!, self._r[3206]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3213]!, self._r[3213]!, [_1, _2]) } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[3207]! } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[3208]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[3209]! } - public var Group_ErrorAccessDenied: String { return self._s[3210]! } - public var PasscodeSettings_HelpTop: String { return self._s[3211]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3212]! } - public var AddContact_SharedContactException: String { return self._s[3213]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[3214]! } - public var Privacy_TopPeers: String { return self._s[3215]! } - public var Web_OpenExternal: String { return self._s[3216]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[3217]! } - public var Channel_Management_LabelAdministrator: String { return self._s[3218]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[3214]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[3215]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[3216]! } + public var Group_ErrorAccessDenied: String { return self._s[3217]! } + public var PasscodeSettings_HelpTop: String { return self._s[3218]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3219]! } + public var AddContact_SharedContactException: String { return self._s[3220]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[3221]! } + public var Privacy_TopPeers: String { return self._s[3222]! } + public var Web_OpenExternal: String { return self._s[3223]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[3224]! } + public var Channel_Management_LabelAdministrator: String { return self._s[3225]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3219]!, self._r[3219]!, [_0]) + return formatWithArgumentRanges(self._s[3226]!, self._r[3226]!, [_0]) } - public var Conversation_PhoneCopied: String { return self._s[3220]! } - public var Permissions_Skip: String { return self._s[3221]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3222]! } + public var Conversation_PhoneCopied: String { return self._s[3227]! } + public var Permissions_Skip: String { return self._s[3228]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3229]! } public func VoiceChat_ForwardTooltip_TwoChats(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3223]!, self._r[3223]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3230]!, self._r[3230]!, [_0, _1]) } - public var PeopleNearby_Title: String { return self._s[3224]! } - public var GroupInfo_SharedMediaNone: String { return self._s[3225]! } + public var PeopleNearby_Title: String { return self._s[3231]! } + public var GroupInfo_SharedMediaNone: String { return self._s[3232]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_1]) + return formatWithArgumentRanges(self._s[3234]!, self._r[3234]!, [_1]) } - public var Profile_MessageLifetime1w: String { return self._s[3228]! } + public var Profile_MessageLifetime1w: String { return self._s[3235]! } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_1, _2, _3]) } - public var WebBrowser_DefaultBrowser: String { return self._s[3230]! } - public var Conversation_PinOlderMessageAlertTitle: String { return self._s[3232]! } - public var EditTheme_Edit_BottomInfo: String { return self._s[3233]! } - public var Privacy_Forwards_Preview: String { return self._s[3234]! } - public var Settings_EditAccount: String { return self._s[3235]! } + public var WebBrowser_DefaultBrowser: String { return self._s[3237]! } + public var Conversation_PinOlderMessageAlertTitle: String { return self._s[3239]! } + public var EditTheme_Edit_BottomInfo: String { return self._s[3240]! } + public var Privacy_Forwards_Preview: String { return self._s[3241]! } + public var Settings_EditAccount: String { return self._s[3242]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3236]!, self._r[3236]!, [_0]) + return formatWithArgumentRanges(self._s[3243]!, self._r[3243]!, [_0]) } - public var TwoFactorSetup_Intro_Title: String { return self._s[3237]! } + public var TwoFactorSetup_Intro_Title: String { return self._s[3244]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3239]!, self._r[3239]!, [_1]) + return formatWithArgumentRanges(self._s[3246]!, self._r[3246]!, [_1]) } - public var PeerInfo_ButtonVideoCall: String { return self._s[3240]! } + public var PeerInfo_ButtonVideoCall: String { return self._s[3247]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3241]!, self._r[3241]!, [_0]) + return formatWithArgumentRanges(self._s[3248]!, self._r[3248]!, [_0]) } - public var Login_InfoHelp: String { return self._s[3242]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[3243]! } - public var VoiceChat_SpeakPermissionEveryone: String { return self._s[3244]! } - public var Profile_MessageLifetime1d: String { return self._s[3245]! } - public var Group_UpgradeConfirmation: String { return self._s[3246]! } + public var Login_InfoHelp: String { return self._s[3249]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[3250]! } + public var VoiceChat_SpeakPermissionEveryone: String { return self._s[3251]! } + public var Profile_MessageLifetime1d: String { return self._s[3252]! } + public var Group_UpgradeConfirmation: String { return self._s[3253]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3254]!, self._r[3254]!, [_1, _2]) } - public var Appearance_RemoveThemeColor: String { return self._s[3248]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3249]! } + public var Appearance_RemoveThemeColor: String { return self._s[3255]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3256]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3250]!, self._r[3250]!, [_0]) + return formatWithArgumentRanges(self._s[3257]!, self._r[3257]!, [_0]) } - public var UserInfo_BotSettings: String { return self._s[3251]! } + public var UserInfo_BotSettings: String { return self._s[3258]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3253]!, self._r[3253]!, [_0]) + return formatWithArgumentRanges(self._s[3260]!, self._r[3260]!, [_0]) } - public var Permissions_ContactsText_v0: String { return self._s[3254]! } - public var Conversation_PinMessagesForMe: String { return self._s[3255]! } - public var VoiceChat_PanelJoin: String { return self._s[3256]! } - public var Conversation_DiscussionStarted: String { return self._s[3258]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[3259]! } - public var SharedMedia_SearchNoResults: String { return self._s[3261]! } + public var Permissions_ContactsText_v0: String { return self._s[3261]! } + public var Conversation_PinMessagesForMe: String { return self._s[3262]! } + public var VoiceChat_PanelJoin: String { return self._s[3263]! } + public var Conversation_DiscussionStarted: String { return self._s[3265]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[3266]! } + public var SharedMedia_SearchNoResults: String { return self._s[3268]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3263]!, self._r[3263]!, [_0]) - } - public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3265]!, self._r[3265]!, [_0]) - } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[3266]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3267]! } - public var Call_AudioRouteHeadphones: String { return self._s[3268]! } - public func Notification_VoiceChatScheduledTomorrowChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3270]!, self._r[3270]!, [_0]) } + public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3272]!, self._r[3272]!, [_0]) + } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[3273]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3274]! } + public var Call_AudioRouteHeadphones: String { return self._s[3275]! } + public func Notification_VoiceChatScheduledTomorrowChannel(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3277]!, self._r[3277]!, [_0]) + } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_1]) + return formatWithArgumentRanges(self._s[3278]!, self._r[3278]!, [_1]) } - public var Passport_Identity_FilesView: String { return self._s[3272]! } - public var TwoStepAuth_SetupEmail: String { return self._s[3273]! } - public var Widget_ApplicationStartRequired: String { return self._s[3274]! } - public var PhotoEditor_Original: String { return self._s[3275]! } - public var Call_YourMicrophoneOff: String { return self._s[3276]! } - public var Permissions_ContactsAllow_v0: String { return self._s[3277]! } - public var Conversation_CardNumberCopied: String { return self._s[3278]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[3279]! } - public var PrivacyPolicy_Decline: String { return self._s[3280]! } - public var SettingsSearch_Synonyms_ChatFolders: String { return self._s[3281]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[3282]! } - public var ChatListFolder_IncludeSectionInfo: String { return self._s[3283]! } + public var Passport_Identity_FilesView: String { return self._s[3279]! } + public var TwoStepAuth_SetupEmail: String { return self._s[3280]! } + public var Widget_ApplicationStartRequired: String { return self._s[3281]! } + public var PhotoEditor_Original: String { return self._s[3282]! } + public var Call_YourMicrophoneOff: String { return self._s[3283]! } + public var Permissions_ContactsAllow_v0: String { return self._s[3284]! } + public var Conversation_CardNumberCopied: String { return self._s[3285]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[3286]! } + public var PrivacyPolicy_Decline: String { return self._s[3287]! } + public var SettingsSearch_Synonyms_ChatFolders: String { return self._s[3288]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[3289]! } + public var ChatListFolder_IncludeSectionInfo: String { return self._s[3290]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3284]!, self._r[3284]!, [_0]) + return formatWithArgumentRanges(self._s[3291]!, self._r[3291]!, [_0]) } - public var Passport_Identity_Name: String { return self._s[3285]! } - public var WallpaperPreview_PatternTitle: String { return self._s[3287]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[3288]! } - public var WallpaperSearch_ColorOrange: String { return self._s[3290]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[3291]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[3292]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3293]! } - public var IntentsSettings_ResetAll: String { return self._s[3294]! } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3296]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3297]! } - public var ChatList_DeleteForAllSubscribers: String { return self._s[3298]! } - public var Notification_Exceptions_Add: String { return self._s[3299]! } - public var Group_DeleteGroup: String { return self._s[3300]! } - public var Cache_Help: String { return self._s[3301]! } - public var Call_AudioRouteMute: String { return self._s[3302]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[3303]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[3304]! } + public var Passport_Identity_Name: String { return self._s[3292]! } + public var WallpaperPreview_PatternTitle: String { return self._s[3294]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[3295]! } + public var WallpaperSearch_ColorOrange: String { return self._s[3297]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[3298]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[3299]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3300]! } + public var IntentsSettings_ResetAll: String { return self._s[3301]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3303]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3304]! } + public var ChatList_DeleteForAllSubscribers: String { return self._s[3305]! } + public var Notification_Exceptions_Add: String { return self._s[3306]! } + public var Group_DeleteGroup: String { return self._s[3307]! } + public var Cache_Help: String { return self._s[3308]! } + public var Call_AudioRouteMute: String { return self._s[3309]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[3310]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[3311]! } public func VoiceChat_Status_MembersFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3305]!, self._r[3305]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3312]!, self._r[3312]!, [_1, _2]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3306]!, self._r[3306]!, [_1]) + return formatWithArgumentRanges(self._s[3313]!, self._r[3313]!, [_1]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3307]!, self._r[3307]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3314]!, self._r[3314]!, [_1, _2]) } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3308]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[3309]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3315]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[3316]! } public func PUSH_CHAT_VOICECHAT_INVITE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3310]!, self._r[3310]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3317]!, self._r[3317]!, [_1, _2, _3]) } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[3311]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3312]! } - public var ClearCache_StorageFree: String { return self._s[3313]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[3318]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3319]! } + public var ClearCache_StorageFree: String { return self._s[3320]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3314]!, self._r[3314]!, [_0]) + return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[3315]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[3322]! } public func Channel_AdminLog_EditedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3317]!, self._r[3317]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3324]!, self._r[3324]!, [_1, _2]) } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[3318]! } - public var DialogList_Typing: String { return self._s[3319]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[3325]! } + public var DialogList_Typing: String { return self._s[3326]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) + return formatWithArgumentRanges(self._s[3327]!, self._r[3327]!, [_0]) } - public var Target_SelectGroup: String { return self._s[3321]! } - public var AuthSessions_IncompleteAttempts: String { return self._s[3322]! } + public var Target_SelectGroup: String { return self._s[3328]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3329]! } public func Notification_ProximityReached(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3323]!, self._r[3323]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3330]!, self._r[3330]!, [_1, _2, _3]) } - public var Chat_PinnedListPreview_ShowAllMessages: String { return self._s[3324]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[3325]! } + public var Chat_PinnedListPreview_ShowAllMessages: String { return self._s[3331]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[3332]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3326]!, self._r[3326]!, [_0]) + return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_0]) } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3327]! } - public var TwoFactorSetup_EmailVerification_Title: String { return self._s[3328]! } - public var ChatSettings_TextSize: String { return self._s[3329]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[3331]! } - public var Map_SendThisPlace: String { return self._s[3332]! } - public var Conversation_TextCopied: String { return self._s[3333]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3334]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3335]! } - public var Call_ShareStats: String { return self._s[3336]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3334]! } + public var TwoFactorSetup_EmailVerification_Title: String { return self._s[3335]! } + public var ChatSettings_TextSize: String { return self._s[3336]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[3338]! } + public var Map_SendThisPlace: String { return self._s[3339]! } + public var Conversation_TextCopied: String { return self._s[3340]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3341]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3342]! } + public var Call_ShareStats: String { return self._s[3343]! } public func PUSH_CHAT_VOICECHAT_END(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3338]!, self._r[3338]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3345]!, self._r[3345]!, [_1, _2]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3339]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[3340]! } - public var Settings_Support: String { return self._s[3341]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3342]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3346]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[3347]! } + public var Settings_Support: String { return self._s[3348]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3349]! } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3344]!, self._r[3344]!, [_0]) + return formatWithArgumentRanges(self._s[3351]!, self._r[3351]!, [_0]) } - public var Watch_Conversation_GroupInfo: String { return self._s[3345]! } - public var Tour_Text4: String { return self._s[3346]! } - public var VoiceChat_CancelReminder: String { return self._s[3347]! } - public var Calls_StartNewCall: String { return self._s[3348]! } - public var UserInfo_FakeUserWarning: String { return self._s[3350]! } - public var PasscodeSettings_AutoLock: String { return self._s[3351]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3352]! } - public var Bot_DescriptionTitle: String { return self._s[3354]! } - public var Map_LocationTitle: String { return self._s[3355]! } - public var ChatListFolder_ExcludeSectionInfo: String { return self._s[3356]! } - public var Conversation_HashtagCopied: String { return self._s[3357]! } + public var Watch_Conversation_GroupInfo: String { return self._s[3352]! } + public var Tour_Text4: String { return self._s[3353]! } + public var VoiceChat_CancelReminder: String { return self._s[3354]! } + public var Calls_StartNewCall: String { return self._s[3355]! } + public var UserInfo_FakeUserWarning: String { return self._s[3357]! } + public var PasscodeSettings_AutoLock: String { return self._s[3358]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3359]! } + public var Bot_DescriptionTitle: String { return self._s[3361]! } + public var Map_LocationTitle: String { return self._s[3362]! } + public var ChatListFolder_ExcludeSectionInfo: String { return self._s[3363]! } + public var Conversation_HashtagCopied: String { return self._s[3364]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3358]!, self._r[3358]!, [_1]) + return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_1]) } - public var VoiceChat_ReminderNotify: String { return self._s[3359]! } - public var Login_EmailNotConfiguredError: String { return self._s[3360]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[3361]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[3362]! } - public var Permissions_CellularDataText_v0: String { return self._s[3363]! } - public var Conversation_EncryptionProcessing: String { return self._s[3364]! } - public var GroupPermission_Delete: String { return self._s[3366]! } - public var Contacts_SortByName: String { return self._s[3367]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[3368]! } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[3369]! } - public var Group_Management_AddModeratorHelp: String { return self._s[3371]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[3372]! } - public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3373]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[3375]! } + public var VoiceChat_ReminderNotify: String { return self._s[3366]! } + public var Login_EmailNotConfiguredError: String { return self._s[3367]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[3368]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[3369]! } + public var Permissions_CellularDataText_v0: String { return self._s[3370]! } + public var Conversation_EncryptionProcessing: String { return self._s[3371]! } + public var GroupPermission_Delete: String { return self._s[3373]! } + public var Contacts_SortByName: String { return self._s[3374]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[3375]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[3376]! } + public var Group_Management_AddModeratorHelp: String { return self._s[3378]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[3379]! } + public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3380]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[3382]! } public func PUSH_CHANNEL_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_1]) + return formatWithArgumentRanges(self._s[3383]!, self._r[3383]!, [_1]) } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3377]!, self._r[3377]!, [_0]) + return formatWithArgumentRanges(self._s[3384]!, self._r[3384]!, [_0]) } - public var ChatList_Context_Delete: String { return self._s[3378]! } - public var VoiceChat_InviteMember: String { return self._s[3379]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[3380]! } - public var Conversation_Processing: String { return self._s[3381]! } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[3382]! } - public var ChatSettings_Stickers: String { return self._s[3383]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3384]! } - public var Passport_Language_cs: String { return self._s[3385]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3387]! } - public var Conversation_Contact: String { return self._s[3388]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[3389]! } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[3390]! } - public var Theme_Unsupported: String { return self._s[3391]! } - public var Privacy_TopPeersWarning: String { return self._s[3392]! } + public var ChatList_Context_Delete: String { return self._s[3385]! } + public var VoiceChat_InviteMember: String { return self._s[3386]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[3387]! } + public var Conversation_Processing: String { return self._s[3388]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[3389]! } + public var ChatSettings_Stickers: String { return self._s[3390]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3391]! } + public var Passport_Language_cs: String { return self._s[3392]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3394]! } + public var Conversation_Contact: String { return self._s[3395]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[3396]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[3397]! } + public var Theme_Unsupported: String { return self._s[3398]! } + public var Privacy_TopPeersWarning: String { return self._s[3399]! } public func Conversation_ScheduledVoiceChatStartsTodayShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3393]!, self._r[3393]!, [_0]) + return formatWithArgumentRanges(self._s[3400]!, self._r[3400]!, [_0]) } - public var InviteLink_Title: String { return self._s[3395]! } + public var InviteLink_Title: String { return self._s[3402]! } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3396]!, self._r[3396]!, [_0]) + return formatWithArgumentRanges(self._s[3403]!, self._r[3403]!, [_0]) } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3397]! } - public var TwoStepAuth_RemovePassword: String { return self._s[3398]! } - public var Settings_CheckPhoneNumberText: String { return self._s[3399]! } - public var PeopleNearby_Users: String { return self._s[3400]! } - public var Appearance_TextSize_UseSystem: String { return self._s[3401]! } - public var Settings_SetProfilePhoto: String { return self._s[3402]! } - public var Conversation_ContextMenuBan: String { return self._s[3403]! } - public var KeyCommand_ScrollUp: String { return self._s[3404]! } - public var Settings_ChatSettings: String { return self._s[3406]! } - public var CallList_RecentCallsHeader: String { return self._s[3407]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3404]! } + public var TwoStepAuth_RemovePassword: String { return self._s[3405]! } + public var Settings_CheckPhoneNumberText: String { return self._s[3406]! } + public var PeopleNearby_Users: String { return self._s[3407]! } + public var Appearance_TextSize_UseSystem: String { return self._s[3408]! } + public var Settings_SetProfilePhoto: String { return self._s[3409]! } + public var Conversation_ContextMenuBan: String { return self._s[3410]! } + public var KeyCommand_ScrollUp: String { return self._s[3411]! } + public var Settings_ChatSettings: String { return self._s[3413]! } + public var CallList_RecentCallsHeader: String { return self._s[3414]! } public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3408]!, self._r[3408]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3415]!, self._r[3415]!, [_1, _2]) } - public var Stats_GroupTopInvitersTitle: String { return self._s[3409]! } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3410]! } - public var VoiceChat_StartRecordingTitle: String { return self._s[3411]! } + public var Stats_GroupTopInvitersTitle: String { return self._s[3416]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3417]! } + public var VoiceChat_StartRecordingTitle: String { return self._s[3418]! } public func Notification_VoiceChatScheduledToday(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3419]!, self._r[3419]!, [_1, _2]) } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[3414]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3415]! } - public var VoiceOver_ChatList_MessageRead: String { return self._s[3416]! } - public var Stats_GroupTopPoster_Promote: String { return self._s[3417]! } - public var Cache_Title: String { return self._s[3418]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[3421]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3422]! } + public var VoiceOver_ChatList_MessageRead: String { return self._s[3423]! } + public var Stats_GroupTopPoster_Promote: String { return self._s[3424]! } + public var Cache_Title: String { return self._s[3425]! } public func Conversation_AutoremoveTimerSetToastText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3419]!, self._r[3419]!, [_0]) + return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_0]) } - public var Clipboard_SendPhoto: String { return self._s[3420]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[3422]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3423]! } - public var WatchRemote_AlertTitle: String { return self._s[3426]! } - public var Appearance_ReduceMotion: String { return self._s[3427]! } + public var Clipboard_SendPhoto: String { return self._s[3427]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[3429]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3430]! } + public var WatchRemote_AlertTitle: String { return self._s[3433]! } + public var Appearance_ReduceMotion: String { return self._s[3434]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3430]!, self._r[3430]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3437]!, self._r[3437]!, [_1, _2]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[3431]! } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[3432]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[3433]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[3438]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[3439]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[3440]! } public func Call_CallInProgressVoiceChatMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3441]!, self._r[3441]!, [_1, _2]) } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_0]) + return formatWithArgumentRanges(self._s[3443]!, self._r[3443]!, [_0]) } - public var ChatListFolder_DiscardConfirmation: String { return self._s[3437]! } + public var ChatListFolder_DiscardConfirmation: String { return self._s[3444]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3439]!, self._r[3439]!, [_0]) + return formatWithArgumentRanges(self._s[3446]!, self._r[3446]!, [_0]) } - public var InstantPage_Search: String { return self._s[3440]! } - public var ChatState_WaitingForNetwork: String { return self._s[3441]! } - public var GroupInfo_Sound: String { return self._s[3442]! } - public var NotificationsSound_Telegraph: String { return self._s[3443]! } + public var InstantPage_Search: String { return self._s[3447]! } + public var ChatState_WaitingForNetwork: String { return self._s[3448]! } + public var GroupInfo_Sound: String { return self._s[3449]! } + public var NotificationsSound_Telegraph: String { return self._s[3450]! } public func VoiceChat_ParticipantIsSpeaking(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_1]) + return formatWithArgumentRanges(self._s[3451]!, self._r[3451]!, [_1]) } - public var NotificationsSound_Hello: String { return self._s[3445]! } - public var VoiceChat_LeaveConfirmation: String { return self._s[3446]! } - public var UserInfo_LinkForwardTooltip_SavedMessages_One: String { return self._s[3447]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[3448]! } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[3449]! } - public var Conversation_HoldForVideo: String { return self._s[3450]! } - public var Conversation_PinOlderMessageAlertText: String { return self._s[3451]! } - public var Appearance_ShareTheme: String { return self._s[3452]! } - public var TwoStepAuth_SetupHint: String { return self._s[3453]! } - public var Stats_GrowthTitle: String { return self._s[3456]! } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3457]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[3458]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[3459]! } - public var GroupPermission_NoSendMessages: String { return self._s[3462]! } - public var Conversation_SetReminder_Title: String { return self._s[3463]! } - public var Privacy_Calls_CustomHelp: String { return self._s[3464]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3465]! } + public var NotificationsSound_Hello: String { return self._s[3452]! } + public var VoiceChat_LeaveConfirmation: String { return self._s[3453]! } + public var UserInfo_LinkForwardTooltip_SavedMessages_One: String { return self._s[3454]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[3455]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[3456]! } + public var Conversation_HoldForVideo: String { return self._s[3457]! } + public var Conversation_PinOlderMessageAlertText: String { return self._s[3458]! } + public var Appearance_ShareTheme: String { return self._s[3459]! } + public var TwoStepAuth_SetupHint: String { return self._s[3460]! } + public var Stats_GrowthTitle: String { return self._s[3463]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3464]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[3465]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[3466]! } + public var GroupPermission_NoSendMessages: String { return self._s[3469]! } + public var Conversation_SetReminder_Title: String { return self._s[3470]! } + public var Privacy_Calls_CustomHelp: String { return self._s[3471]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3472]! } public func ClearCache_StorageTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_0]) + return formatWithArgumentRanges(self._s[3473]!, self._r[3473]!, [_0]) } - public var InviteLinks_InviteLinkExpired: String { return self._s[3468]! } - public var Undo_SecretChatDeleted: String { return self._s[3469]! } - public var PhotoEditor_ContrastTool: String { return self._s[3470]! } - public var Privacy_Forwards: String { return self._s[3471]! } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[3472]! } - public var KeyCommand_SendMessage: String { return self._s[3474]! } - public var Conversation_PrivateMessageLinkCopiedLong: String { return self._s[3475]! } + public var InviteLinks_InviteLinkExpired: String { return self._s[3475]! } + public var Undo_SecretChatDeleted: String { return self._s[3476]! } + public var PhotoEditor_ContrastTool: String { return self._s[3477]! } + public var Privacy_Forwards: String { return self._s[3478]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[3479]! } + public var KeyCommand_SendMessage: String { return self._s[3481]! } + public var Conversation_PrivateMessageLinkCopiedLong: String { return self._s[3482]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3476]!, self._r[3476]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3483]!, self._r[3483]!, [_1, _2]) } - public var GroupPermission_NoSendGifs: String { return self._s[3477]! } + public var VoiceChat_VideoPaused: String { return self._s[3484]! } + public var GroupPermission_NoSendGifs: String { return self._s[3485]! } public func Notification_VoiceChatEndedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3478]!, self._r[3478]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3486]!, self._r[3486]!, [_1, _2]) } - public var Notification_MessageLifetime2s: String { return self._s[3479]! } - public var Message_Theme: String { return self._s[3480]! } - public var Conversation_Dice_u1F3AF: String { return self._s[3483]! } + public var Notification_MessageLifetime2s: String { return self._s[3487]! } + public var Message_Theme: String { return self._s[3488]! } + public var Conversation_Dice_u1F3AF: String { return self._s[3491]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3484]!, self._r[3484]!, [_0]) + return formatWithArgumentRanges(self._s[3492]!, self._r[3492]!, [_0]) } - public var Group_UpgradeNoticeHeader: String { return self._s[3486]! } - public var PeerInfo_BioExpand: String { return self._s[3487]! } - public var Passport_DeletePersonalDetails: String { return self._s[3488]! } - public var Widget_NoUsers: String { return self._s[3489]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[3490]! } - public var VoiceChat_VideoPreviewDescription: String { return self._s[3491]! } - public var Login_TermsOfServiceDecline: String { return self._s[3492]! } - public var VoiceChat_UnmuteSuggestion: String { return self._s[3493]! } - public var CreatePoll_QuizTip: String { return self._s[3495]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[3496]! } - public var MessagePoll_SubmitVote: String { return self._s[3498]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[3499]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[3500]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3501]! } - public var Conversation_UpdateTelegram: String { return self._s[3502]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3494]! } + public var PeerInfo_BioExpand: String { return self._s[3495]! } + public var Passport_DeletePersonalDetails: String { return self._s[3496]! } + public var Widget_NoUsers: String { return self._s[3497]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[3498]! } + public var VoiceChat_VideoPreviewDescription: String { return self._s[3499]! } + public var Login_TermsOfServiceDecline: String { return self._s[3500]! } + public var VoiceChat_UnmuteSuggestion: String { return self._s[3501]! } + public var CreatePoll_QuizTip: String { return self._s[3503]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[3504]! } + public var MessagePoll_SubmitVote: String { return self._s[3506]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[3507]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[3508]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3509]! } + public var Conversation_UpdateTelegram: String { return self._s[3510]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3503]!, self._r[3503]!, [_0]) + return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3504]! } - public var CallSettings_Always: String { return self._s[3505]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[3506]! } - public var VoiceChat_MutedByAdminHelp: String { return self._s[3507]! } - public var Login_TermsOfServiceHeader: String { return self._s[3508]! } - public var KeyCommand_ChatInfo: String { return self._s[3509]! } - public var MessagePoll_LabelPoll: String { return self._s[3510]! } - public var Paint_Clear: String { return self._s[3511]! } - public var PeerInfo_ButtonMute: String { return self._s[3512]! } - public var LastSeen_WithinAWeek: String { return self._s[3513]! } - public var Invitation_JoinVoiceChatAsSpeaker: String { return self._s[3514]! } - public var Passport_Identity_FrontSide: String { return self._s[3515]! } - public var Stickers_GroupStickers: String { return self._s[3516]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[3517]! } + public var UserInfo_About_Placeholder: String { return self._s[3512]! } + public var CallSettings_Always: String { return self._s[3513]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[3514]! } + public var VoiceChat_MutedByAdminHelp: String { return self._s[3515]! } + public var Login_TermsOfServiceHeader: String { return self._s[3516]! } + public var KeyCommand_ChatInfo: String { return self._s[3517]! } + public var MessagePoll_LabelPoll: String { return self._s[3518]! } + public var Paint_Clear: String { return self._s[3519]! } + public var PeerInfo_ButtonMute: String { return self._s[3520]! } + public var LastSeen_WithinAWeek: String { return self._s[3521]! } + public var Invitation_JoinVoiceChatAsSpeaker: String { return self._s[3522]! } + public var Passport_Identity_FrontSide: String { return self._s[3523]! } + public var Stickers_GroupStickers: String { return self._s[3524]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[3525]! } public func Map_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3518]!, self._r[3518]!, [_0]) - } - public var VoiceOver_BotCommands: String { return self._s[3519]! } - public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3522]!, self._r[3522]!, [_1]) - } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[3523]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[3524]! } - public var InviteLink_ContextDelete: String { return self._s[3525]! } - public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_0]) } - public var WebSearch_SearchNoResults: String { return self._s[3528]! } - public var Channel_DiscussionGroup_Create: String { return self._s[3529]! } - public var Passport_Language_es: String { return self._s[3530]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[3531]! } - public var Map_LiveLocationShowAll: String { return self._s[3532]! } - public var Cache_MaximumCacheSizeHelp: String { return self._s[3534]! } - public var Map_OpenInGoogleMaps: String { return self._s[3535]! } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[3537]! } - public var EditTheme_Create_BottomInfo: String { return self._s[3538]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[3539]! } + public var VoiceOver_BotCommands: String { return self._s[3527]! } + public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3530]!, self._r[3530]!, [_1]) + } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[3531]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[3532]! } + public var InviteLink_ContextDelete: String { return self._s[3533]! } + public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3534]!, self._r[3534]!, [_0]) + } + public var WebSearch_SearchNoResults: String { return self._s[3536]! } + public var Channel_DiscussionGroup_Create: String { return self._s[3537]! } + public var Passport_Language_es: String { return self._s[3538]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[3539]! } + public var Map_LiveLocationShowAll: String { return self._s[3540]! } + public var Cache_MaximumCacheSizeHelp: String { return self._s[3542]! } + public var Map_OpenInGoogleMaps: String { return self._s[3543]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[3545]! } + public var EditTheme_Create_BottomInfo: String { return self._s[3546]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[3547]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3540]!, self._r[3540]!, [_0]) + return formatWithArgumentRanges(self._s[3548]!, self._r[3548]!, [_0]) } - public var Passport_Phone_Delete: String { return self._s[3541]! } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[3542]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[3543]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3544]! } + public var Passport_Phone_Delete: String { return self._s[3549]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[3550]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[3551]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3552]! } public func EncryptionKey_Description(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3545]!, self._r[3545]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3553]!, self._r[3553]!, [_1, _2]) } - public var LogoutOptions_LogOutInfo: String { return self._s[3546]! } - public var Cache_ByPeerHeader: String { return self._s[3548]! } - public var Username_InvalidCharacters: String { return self._s[3549]! } - public var Checkout_ShippingAddress: String { return self._s[3551]! } + public var LogoutOptions_LogOutInfo: String { return self._s[3554]! } + public var Cache_ByPeerHeader: String { return self._s[3556]! } + public var Username_InvalidCharacters: String { return self._s[3557]! } + public var Checkout_ShippingAddress: String { return self._s[3559]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_1, _2, _3, _4]) } - public var VoiceChat_LeaveAndEndVoiceChat: String { return self._s[3554]! } - public var Conversation_AddContact: String { return self._s[3555]! } - public var Passport_Address_EditUtilityBill: String { return self._s[3556]! } - public var InviteLink_ContextGetQRCode: String { return self._s[3557]! } - public var Conversation_ChecksTooltip_Delivered: String { return self._s[3559]! } + public var VoiceChat_LeaveAndEndVoiceChat: String { return self._s[3562]! } + public var Conversation_AddContact: String { return self._s[3563]! } + public var Passport_Address_EditUtilityBill: String { return self._s[3564]! } + public var InviteLink_ContextGetQRCode: String { return self._s[3565]! } + public var Conversation_ChecksTooltip_Delivered: String { return self._s[3567]! } public func Channel_AdminLog_MessageAddedAdminNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_1, _2]) } - public var Message_Video: String { return self._s[3561]! } + public var Message_Video: String { return self._s[3569]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3562]!, self._r[3562]!, [_0]) + return formatWithArgumentRanges(self._s[3570]!, self._r[3570]!, [_0]) } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3563]!, self._r[3563]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[3571]!, self._r[3571]!, ["\(_0)"]) } - public var InviteLink_ReactivateLink: String { return self._s[3564]! } - public var Passport_Language_km: String { return self._s[3566]! } + public var InviteLink_ReactivateLink: String { return self._s[3572]! } + public var Passport_Language_km: String { return self._s[3574]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3567]!, self._r[3567]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_1, _2, _3]) } - public var EmptyGroupInfo_Line4: String { return self._s[3568]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3570]! } - public var Notification_CallCanceledShort: String { return self._s[3571]! } - public var PhotoEditor_FadeTool: String { return self._s[3572]! } - public var Group_PublicLink_Info: String { return self._s[3573]! } - public var Contacts_DeselectAll: String { return self._s[3574]! } - public var Conversation_Moderate_Delete: String { return self._s[3576]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3577]! } - public var NotificationsSound_Note: String { return self._s[3580]! } + public var EmptyGroupInfo_Line4: String { return self._s[3576]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3578]! } + public var Notification_CallCanceledShort: String { return self._s[3579]! } + public var PhotoEditor_FadeTool: String { return self._s[3580]! } + public var Group_PublicLink_Info: String { return self._s[3581]! } + public var Contacts_DeselectAll: String { return self._s[3582]! } + public var Conversation_Moderate_Delete: String { return self._s[3584]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3585]! } + public var NotificationsSound_Note: String { return self._s[3588]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_0]) + return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_0]) } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3582]! } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3584]! } - public var DialogList_SearchSectionGlobal: String { return self._s[3585]! } - public var AccessDenied_Settings: String { return self._s[3586]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3587]! } - public var AuthSessions_EmptyTitle: String { return self._s[3588]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[3589]! } - public var GroupInfo_GroupType: String { return self._s[3590]! } - public var Calls_Missed: String { return self._s[3591]! } - public var Contacts_VoiceOver_AddContact: String { return self._s[3592]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3594]! } - public var Passport_Language_uz: String { return self._s[3595]! } - public var Conversation_StopQuizConfirmationTitle: String { return self._s[3596]! } - public var PhotoEditor_BlurToolPortrait: String { return self._s[3597]! } - public var VoiceChat_CreateNewVoiceChatStartNow: String { return self._s[3598]! } - public var Map_ChooseLocationTitle: String { return self._s[3599]! } - public var Checkout_EnterPassword: String { return self._s[3600]! } - public var GroupInfo_ConvertToSupergroup: String { return self._s[3601]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[3602]! } - public var NetworkUsageSettings_Title: String { return self._s[3603]! } - public var Location_ProximityAlertCancelled: String { return self._s[3604]! } - public var SettingsSearch_Synonyms_ChatSettings_IntentsSettings: String { return self._s[3605]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[3606]! } - public var Compose_NewChannel: String { return self._s[3607]! } - public var Privacy_PaymentsClearInfo: String { return self._s[3609]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3590]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3592]! } + public var DialogList_SearchSectionGlobal: String { return self._s[3593]! } + public var AccessDenied_Settings: String { return self._s[3594]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3595]! } + public var AuthSessions_EmptyTitle: String { return self._s[3596]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[3597]! } + public var GroupInfo_GroupType: String { return self._s[3598]! } + public var Calls_Missed: String { return self._s[3599]! } + public var Contacts_VoiceOver_AddContact: String { return self._s[3600]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3602]! } + public var Passport_Language_uz: String { return self._s[3603]! } + public var Conversation_StopQuizConfirmationTitle: String { return self._s[3604]! } + public var PhotoEditor_BlurToolPortrait: String { return self._s[3605]! } + public var VoiceChat_CreateNewVoiceChatStartNow: String { return self._s[3606]! } + public var Map_ChooseLocationTitle: String { return self._s[3607]! } + public var Checkout_EnterPassword: String { return self._s[3608]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[3609]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[3610]! } + public var NetworkUsageSettings_Title: String { return self._s[3611]! } + public var Location_ProximityAlertCancelled: String { return self._s[3612]! } + public var SettingsSearch_Synonyms_ChatSettings_IntentsSettings: String { return self._s[3613]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[3614]! } + public var Compose_NewChannel: String { return self._s[3615]! } + public var Privacy_PaymentsClearInfo: String { return self._s[3617]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3610]!, self._r[3610]!, [_1]) + return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_1]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3611]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3612]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[3615]! } - public var WallpaperSearch_ColorBrown: String { return self._s[3616]! } - public var Appearance_AppIconDefault: String { return self._s[3617]! } - public var StickerSettings_ContextInfo: String { return self._s[3620]! } - public var Channel_AddBotErrorNoRights: String { return self._s[3621]! } - public var Passport_FieldPhone: String { return self._s[3623]! } - public var Contacts_PermissionsTitle: String { return self._s[3624]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3625]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3619]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3620]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[3623]! } + public var WallpaperSearch_ColorBrown: String { return self._s[3624]! } + public var Appearance_AppIconDefault: String { return self._s[3625]! } + public var StickerSettings_ContextInfo: String { return self._s[3628]! } + public var Channel_AddBotErrorNoRights: String { return self._s[3629]! } + public var Passport_FieldPhone: String { return self._s[3631]! } + public var Contacts_PermissionsTitle: String { return self._s[3632]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3633]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3626]!, self._r[3626]!, [_0]) + return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_0]) } - public var Bot_Unblock: String { return self._s[3627]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[3628]! } - public var InviteLink_InviteLinkCopiedText: String { return self._s[3629]! } - public var Passport_PasswordHelp: String { return self._s[3630]! } - public var Watch_Conversation_UserInfo: String { return self._s[3631]! } + public var Bot_Unblock: String { return self._s[3635]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[3636]! } + public var InviteLink_InviteLinkCopiedText: String { return self._s[3637]! } + public var Passport_PasswordHelp: String { return self._s[3638]! } + public var Watch_Conversation_UserInfo: String { return self._s[3639]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3635]!, self._r[3635]!, [_0]) + return formatWithArgumentRanges(self._s[3643]!, self._r[3643]!, [_0]) } - public var State_Connecting: String { return self._s[3637]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3638]! } - public var TextFormat_AddLinkPlaceholder: String { return self._s[3639]! } - public var Conversation_Dice_u1F3B2: String { return self._s[3640]! } + public var State_Connecting: String { return self._s[3645]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3646]! } + public var TextFormat_AddLinkPlaceholder: String { return self._s[3647]! } + public var Conversation_Dice_u1F3B2: String { return self._s[3648]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3641]!, self._r[3641]!, [_0]) + return formatWithArgumentRanges(self._s[3649]!, self._r[3649]!, [_0]) } - public var Conversation_SendingOptionsTooltip: String { return self._s[3642]! } - public var ChatList_UndoArchiveTitle: String { return self._s[3643]! } - public var ChatList_EmptyChatListNewMessage: String { return self._s[3644]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3646]! } - public var PhotoEditor_BlurToolOff: String { return self._s[3647]! } - public var Conversation_AutoremoveOff: String { return self._s[3648]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[3649]! } - public var Weekday_Saturday: String { return self._s[3650]! } - public var DialogList_Unread: String { return self._s[3651]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[3652]! } - public var Stats_GroupPosters: String { return self._s[3653]! } + public var Conversation_SendingOptionsTooltip: String { return self._s[3650]! } + public var ChatList_UndoArchiveTitle: String { return self._s[3651]! } + public var ChatList_EmptyChatListNewMessage: String { return self._s[3652]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3654]! } + public var PhotoEditor_BlurToolOff: String { return self._s[3655]! } + public var Conversation_AutoremoveOff: String { return self._s[3656]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[3657]! } + public var Weekday_Saturday: String { return self._s[3658]! } + public var DialogList_Unread: String { return self._s[3659]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[3660]! } + public var Stats_GroupPosters: String { return self._s[3661]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3654]!, self._r[3654]!, [_1]) + return formatWithArgumentRanges(self._s[3662]!, self._r[3662]!, [_1]) } - public var Conversation_AlsoClearCacheTitle: String { return self._s[3655]! } + public var Conversation_AlsoClearCacheTitle: String { return self._s[3663]! } public func Conversation_ForwardTooltip_TwoChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3656]!, self._r[3656]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3664]!, self._r[3664]!, [_0, _1]) } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3659]!, self._r[3659]!, [_0]) + return formatWithArgumentRanges(self._s[3667]!, self._r[3667]!, [_0]) } - public var ReportPeer_ReasonChildAbuse: String { return self._s[3660]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[3668]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3661]!, self._r[3661]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3669]!, self._r[3669]!, [_1, _2]) } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[3662]! } - public var Conversation_EmailCopied: String { return self._s[3664]! } - public var AutoNightTheme_UseSunsetSunrise: String { return self._s[3665]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[3666]! } - public var Call_VoiceOver_VoiceCallCanceled: String { return self._s[3667]! } - public var VoiceChat_LateBy: String { return self._s[3668]! } - public var Passport_Language_dv: String { return self._s[3669]! } - public var GroupPermission_AddSuccess: String { return self._s[3671]! } - public var Passport_Email_Help: String { return self._s[3672]! } - public var Call_ReportPlaceholder: String { return self._s[3673]! } - public var CreatePoll_AddOption: String { return self._s[3674]! } - public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3676]! } - public var PeerInfo_ButtonLeave: String { return self._s[3677]! } - public var PhotoEditor_TiltShift: String { return self._s[3680]! } - public var SecretGif_Title: String { return self._s[3682]! } - public var GroupInfo_InviteLinks: String { return self._s[3683]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[3684]! } - public var SocksProxySetup_Connecting: String { return self._s[3686]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3687]! } - public var ContactInfo_PhoneLabelWork: String { return self._s[3688]! } - public var Stats_GroupTopHoursTitle: String { return self._s[3689]! } - public var Compose_NewMessage: String { return self._s[3690]! } - public var VoiceOver_Common_SwitchHint: String { return self._s[3691]! } - public var NotificationsSound_Synth: String { return self._s[3692]! } - public var ChatImport_UserErrorNotMutual: String { return self._s[3693]! } - public var Conversation_FileOpenIn: String { return self._s[3694]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[3695]! } - public var UserInfo_SendMessage: String { return self._s[3696]! } - public var Checkout_PayWithFaceId: String { return self._s[3697]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[3670]! } + public var Conversation_EmailCopied: String { return self._s[3672]! } + public var AutoNightTheme_UseSunsetSunrise: String { return self._s[3673]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[3674]! } + public var Call_VoiceOver_VoiceCallCanceled: String { return self._s[3675]! } + public var VoiceChat_LateBy: String { return self._s[3676]! } + public var Passport_Language_dv: String { return self._s[3677]! } + public var GroupPermission_AddSuccess: String { return self._s[3679]! } + public var Passport_Email_Help: String { return self._s[3680]! } + public var Call_ReportPlaceholder: String { return self._s[3681]! } + public var CreatePoll_AddOption: String { return self._s[3682]! } + public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3684]! } + public var PeerInfo_ButtonLeave: String { return self._s[3685]! } + public var PhotoEditor_TiltShift: String { return self._s[3688]! } + public var SecretGif_Title: String { return self._s[3690]! } + public var GroupInfo_InviteLinks: String { return self._s[3691]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[3692]! } + public var SocksProxySetup_Connecting: String { return self._s[3694]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3695]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[3696]! } + public var Stats_GroupTopHoursTitle: String { return self._s[3697]! } + public var Compose_NewMessage: String { return self._s[3698]! } + public var VoiceOver_Common_SwitchHint: String { return self._s[3699]! } + public var NotificationsSound_Synth: String { return self._s[3700]! } + public var ChatImport_UserErrorNotMutual: String { return self._s[3701]! } + public var Conversation_FileOpenIn: String { return self._s[3702]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[3703]! } + public var UserInfo_SendMessage: String { return self._s[3704]! } + public var Checkout_PayWithFaceId: String { return self._s[3705]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3698]!, self._r[3698]!, [_0]) + return formatWithArgumentRanges(self._s[3706]!, self._r[3706]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[3699]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[3700]! } - public var Conversation_ViewChannel: String { return self._s[3701]! } + public var TextFormat_Strikethrough: String { return self._s[3707]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[3708]! } + public var Conversation_ViewChannel: String { return self._s[3709]! } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_0]) + return formatWithArgumentRanges(self._s[3710]!, self._r[3710]!, [_0]) } - public var Channel_Stickers_Placeholder: String { return self._s[3703]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3704]! } - public var Message_ScamAccount: String { return self._s[3705]! } - public var Camera_FlashAuto: String { return self._s[3706]! } - public var Conversation_EncryptedDescription1: String { return self._s[3707]! } - public var LocalGroup_Text: String { return self._s[3708]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[3709]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[3710]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[3711]! } - public var Conversation_EncryptedDescription2: String { return self._s[3712]! } - public var Conversation_CancelForwardText: String { return self._s[3713]! } - public var Notification_GroupActivated: String { return self._s[3714]! } - public var LastSeen_Lately: String { return self._s[3715]! } - public var Conversation_EncryptedDescription3: String { return self._s[3716]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[3717]! } - public var Conversation_SwipeToReplyHintText: String { return self._s[3718]! } - public var Conversation_EncryptedDescription4: String { return self._s[3719]! } - public var SharedMedia_EmptyTitle: String { return self._s[3720]! } - public var Appearance_CreateTheme: String { return self._s[3722]! } - public var Stats_SharesPerPost: String { return self._s[3723]! } - public var Contacts_TabTitle: String { return self._s[3724]! } - public var Weekday_ShortThursday: String { return self._s[3725]! } - public var MessageTimer_Forever: String { return self._s[3726]! } - public var ChatListFolder_CategoryArchived: String { return self._s[3727]! } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3728]! } - public var EditTheme_Create_TopInfo: String { return self._s[3730]! } + public var Channel_Stickers_Placeholder: String { return self._s[3711]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3712]! } + public var Message_ScamAccount: String { return self._s[3713]! } + public var Camera_FlashAuto: String { return self._s[3714]! } + public var Conversation_EncryptedDescription1: String { return self._s[3715]! } + public var LocalGroup_Text: String { return self._s[3716]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[3717]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[3718]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[3719]! } + public var Conversation_EncryptedDescription2: String { return self._s[3720]! } + public var Conversation_CancelForwardText: String { return self._s[3721]! } + public var Notification_GroupActivated: String { return self._s[3722]! } + public var LastSeen_Lately: String { return self._s[3723]! } + public var Conversation_EncryptedDescription3: String { return self._s[3724]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[3725]! } + public var Conversation_SwipeToReplyHintText: String { return self._s[3726]! } + public var Conversation_EncryptedDescription4: String { return self._s[3727]! } + public var SharedMedia_EmptyTitle: String { return self._s[3728]! } + public var Appearance_CreateTheme: String { return self._s[3730]! } + public var Stats_SharesPerPost: String { return self._s[3731]! } + public var Contacts_TabTitle: String { return self._s[3732]! } + public var Weekday_ShortThursday: String { return self._s[3733]! } + public var MessageTimer_Forever: String { return self._s[3734]! } + public var ChatListFolder_CategoryArchived: String { return self._s[3735]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3736]! } + public var EditTheme_Create_TopInfo: String { return self._s[3738]! } public func VoiceOver_ChatList_MessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3731]!, self._r[3731]!, [_0]) + return formatWithArgumentRanges(self._s[3739]!, self._r[3739]!, [_0]) } - public var Month_GenDecember: String { return self._s[3732]! } - public var EnterPasscode_EnterPasscode: String { return self._s[3733]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3734]! } - public var PeopleNearby_CreateGroup: String { return self._s[3736]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3737]! } - public var Paint_ClearConfirm: String { return self._s[3738]! } - public var ChatList_ReadAll: String { return self._s[3739]! } - public var ChatSettings_IntentsSettings: String { return self._s[3740]! } - public var Passport_PassportInformation: String { return self._s[3742]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3744]! } - public var Location_ProximityNotification_DistanceMI: String { return self._s[3747]! } - public var PhotoEditor_ExposureTool: String { return self._s[3748]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[3749]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[3750]! } - public var Stats_GroupTopPoster_History: String { return self._s[3751]! } - public var UserInfo_AddPhone: String { return self._s[3752]! } - public var Media_SendWithTimer: String { return self._s[3754]! } - public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[3755]! } - public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3756]! } - public var GroupInfo_GroupHistoryShort: String { return self._s[3757]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[3758]! } - public var ChatList_Context_Unarchive: String { return self._s[3760]! } + public var Month_GenDecember: String { return self._s[3740]! } + public var EnterPasscode_EnterPasscode: String { return self._s[3741]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3742]! } + public var PeopleNearby_CreateGroup: String { return self._s[3744]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3745]! } + public var Paint_ClearConfirm: String { return self._s[3746]! } + public var ChatList_ReadAll: String { return self._s[3747]! } + public var ChatSettings_IntentsSettings: String { return self._s[3748]! } + public var Passport_PassportInformation: String { return self._s[3750]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3752]! } + public var Location_ProximityNotification_DistanceMI: String { return self._s[3755]! } + public var PhotoEditor_ExposureTool: String { return self._s[3756]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[3757]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[3758]! } + public var Stats_GroupTopPoster_History: String { return self._s[3759]! } + public var UserInfo_AddPhone: String { return self._s[3760]! } + public var Media_SendWithTimer: String { return self._s[3762]! } + public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[3763]! } + public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3764]! } + public var GroupInfo_GroupHistoryShort: String { return self._s[3765]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[3766]! } + public var ChatList_Context_Unarchive: String { return self._s[3768]! } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3761]!, self._r[3761]!, [_0]) + return formatWithArgumentRanges(self._s[3769]!, self._r[3769]!, [_0]) } - public var BlockedUsers_Title: String { return self._s[3763]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[3764]! } - public var Media_ShareThisPhoto: String { return self._s[3765]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[3766]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[3767]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3771]! } - public var CallFeedback_ReasonNoise: String { return self._s[3773]! } - public var WebBrowser_Title: String { return self._s[3774]! } + public var BlockedUsers_Title: String { return self._s[3771]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[3772]! } + public var Media_ShareThisPhoto: String { return self._s[3773]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[3774]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[3775]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3779]! } + public var CallFeedback_ReasonNoise: String { return self._s[3781]! } + public var WebBrowser_Title: String { return self._s[3782]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3775]!, self._r[3775]!, [_0]) + return formatWithArgumentRanges(self._s[3783]!, self._r[3783]!, [_0]) } - public var Notification_MessageLifetime5s: String { return self._s[3777]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3778]! } - public var Profile_MessageLifetime1m: String { return self._s[3780]! } - public var Passport_ScanPassport: String { return self._s[3781]! } - public var Stats_LoadingTitle: String { return self._s[3782]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3784]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[3785]! } - public var Login_InvalidFirstNameError: String { return self._s[3786]! } - public var Undo_ChatCleared: String { return self._s[3788]! } + public var Notification_MessageLifetime5s: String { return self._s[3785]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3786]! } + public var Profile_MessageLifetime1m: String { return self._s[3788]! } + public var Passport_ScanPassport: String { return self._s[3789]! } + public var Stats_LoadingTitle: String { return self._s[3790]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3792]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[3793]! } + public var Login_InvalidFirstNameError: String { return self._s[3794]! } + public var Undo_ChatCleared: String { return self._s[3796]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3790]!, self._r[3790]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3798]!, self._r[3798]!, [_1, _2]) } - public var Conversation_PinMessageAlertPin: String { return self._s[3791]! } + public var Conversation_PinMessageAlertPin: String { return self._s[3799]! } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3792]!, self._r[3792]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3800]!, self._r[3800]!, [_1, _2, _3, _4, _5]) } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3793]!, self._r[3793]!, [_1]) + return formatWithArgumentRanges(self._s[3801]!, self._r[3801]!, [_1]) } - public var Share_MultipleMessagesDisabled: String { return self._s[3794]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[3795]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3797]! } - public var VoiceChat_InviteLink_Speaker: String { return self._s[3798]! } - public var CallSettings_RecentCalls: String { return self._s[3799]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[3800]! } - public var AuthSessions_OtherSessions: String { return self._s[3801]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3802]! } - public var Tour_Text5: String { return self._s[3803]! } - public var Login_PadPhoneHelp: String { return self._s[3804]! } - public var Wallpaper_PhotoLibrary: String { return self._s[3807]! } - public var Conversation_ViewGroup: String { return self._s[3808]! } - public var PeopleNearby_MakeVisibleTitle: String { return self._s[3810]! } - public var VoiceOver_Chat_YourContact: String { return self._s[3811]! } - public var Watch_AuthRequired: String { return self._s[3812]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3814]! } - public var Conversation_ForwardContacts: String { return self._s[3815]! } - public var Conversation_InputTextPlaceholder: String { return self._s[3816]! } + public var Share_MultipleMessagesDisabled: String { return self._s[3802]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[3803]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3805]! } + public var VoiceChat_InviteLink_Speaker: String { return self._s[3806]! } + public var CallSettings_RecentCalls: String { return self._s[3807]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[3808]! } + public var AuthSessions_OtherSessions: String { return self._s[3809]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3810]! } + public var Tour_Text5: String { return self._s[3811]! } + public var Login_PadPhoneHelp: String { return self._s[3812]! } + public var Wallpaper_PhotoLibrary: String { return self._s[3815]! } + public var Conversation_ViewGroup: String { return self._s[3816]! } + public var PeopleNearby_MakeVisibleTitle: String { return self._s[3818]! } + public var VoiceOver_Chat_YourContact: String { return self._s[3819]! } + public var Watch_AuthRequired: String { return self._s[3820]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3822]! } + public var Conversation_ForwardContacts: String { return self._s[3823]! } + public var Conversation_InputTextPlaceholder: String { return self._s[3824]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3817]!, self._r[3817]!, [_1]) + return formatWithArgumentRanges(self._s[3825]!, self._r[3825]!, [_1]) } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3818]!, self._r[3818]!, [_0]) + return formatWithArgumentRanges(self._s[3826]!, self._r[3826]!, [_0]) } - public var Channel_Setup_TypePrivate: String { return self._s[3819]! } + public var Channel_Setup_TypePrivate: String { return self._s[3827]! } public func Conversation_NoticeInvitedByInChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3820]!, self._r[3820]!, [_0]) + return formatWithArgumentRanges(self._s[3828]!, self._r[3828]!, [_0]) } - public var Checkout_OptionalTipItemPlaceholder: String { return self._s[3821]! } - public var InviteLink_Create_TimeLimitExpiryDate: String { return self._s[3822]! } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[3823]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3824]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[3825]! } - public var UserInfo_StartSecretChatStart: String { return self._s[3826]! } + public var Checkout_OptionalTipItemPlaceholder: String { return self._s[3829]! } + public var InviteLink_Create_TimeLimitExpiryDate: String { return self._s[3830]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[3831]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3832]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[3833]! } + public var UserInfo_StartSecretChatStart: String { return self._s[3834]! } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3827]!, self._r[3827]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3835]!, self._r[3835]!, [_1, _2]) } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3828]!, self._r[3828]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[3836]!, self._r[3836]!, [_0, _1, _2]) } public func Conversation_ForwardTooltip_TwoChats_Many(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3829]!, self._r[3829]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3837]!, self._r[3837]!, [_0, _1]) } - public var PrivacySettings_AutoArchiveTitle: String { return self._s[3830]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[3831]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[3832]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[3834]! } - public var NewContact_Title: String { return self._s[3837]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3838]! } - public var VoiceChat_StatusSpeaking: String { return self._s[3839]! } - public var Notifications_PermissionsKeepDisabled: String { return self._s[3840]! } + public var PrivacySettings_AutoArchiveTitle: String { return self._s[3838]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[3839]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[3840]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[3842]! } + public var NewContact_Title: String { return self._s[3845]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3846]! } + public var VoiceChat_StatusSpeaking: String { return self._s[3847]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[3848]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3841]!, self._r[3841]!, [_0]) + return formatWithArgumentRanges(self._s[3849]!, self._r[3849]!, [_0]) } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3842]!, self._r[3842]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3850]!, self._r[3850]!, [_0, _1]) } - public var Chat_SlowmodeTooltipPending: String { return self._s[3843]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[3851]! } public func Time_MediumDate(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3845]!, self._r[3845]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3853]!, self._r[3853]!, [_1, _2]) } - public var ContactInfo_PhoneLabelHome: String { return self._s[3846]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3847]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[3848]! } - public var Conversation_MessageEditedLabel: String { return self._s[3851]! } - public var CallList_ActiveVoiceChatsHeader: String { return self._s[3852]! } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3853]! } - public var ChatList_Context_AddToContacts: String { return self._s[3854]! } - public var Passport_Language_is: String { return self._s[3855]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[3856]! } - public var PhotoEditor_CurvesBlue: String { return self._s[3857]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[3854]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3855]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[3856]! } + public var Conversation_MessageEditedLabel: String { return self._s[3859]! } + public var CallList_ActiveVoiceChatsHeader: String { return self._s[3860]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3861]! } + public var ChatList_Context_AddToContacts: String { return self._s[3862]! } + public var Passport_Language_is: String { return self._s[3863]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[3864]! } + public var PhotoEditor_CurvesBlue: String { return self._s[3865]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3858]!, self._r[3858]!, [_0]) + return formatWithArgumentRanges(self._s[3866]!, self._r[3866]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[3859]! } - public var Login_SmsRequestState3: String { return self._s[3860]! } - public var Message_PinnedVideoMessage: String { return self._s[3861]! } - public var SharedMedia_TitleLink: String { return self._s[3862]! } - public var Passport_FieldIdentity: String { return self._s[3863]! } - public var GroupInfo_Permissions_BroadcastConvert: String { return self._s[3865]! } + public var SocksProxySetup_Username: String { return self._s[3867]! } + public var Login_SmsRequestState3: String { return self._s[3868]! } + public var Message_PinnedVideoMessage: String { return self._s[3869]! } + public var SharedMedia_TitleLink: String { return self._s[3870]! } + public var Passport_FieldIdentity: String { return self._s[3871]! } + public var GroupInfo_Permissions_BroadcastConvert: String { return self._s[3873]! } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3868]!, self._r[3868]!, [_0]) + return formatWithArgumentRanges(self._s[3876]!, self._r[3876]!, [_0]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[3871]! } - public var ReportSpam_DeleteThisChat: String { return self._s[3872]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3873]! } - public var Passport_Identity_DateOfBirth: String { return self._s[3874]! } - public var Call_StatusIncoming: String { return self._s[3875]! } - public var ChatAdmins_AdminLabel: String { return self._s[3876]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[3879]! } + public var ReportSpam_DeleteThisChat: String { return self._s[3880]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3881]! } + public var Passport_Identity_DateOfBirth: String { return self._s[3882]! } + public var Call_StatusIncoming: String { return self._s[3883]! } + public var ChatAdmins_AdminLabel: String { return self._s[3884]! } public func InstantPage_OpenInBrowser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3877]!, self._r[3877]!, [_0]) + return formatWithArgumentRanges(self._s[3885]!, self._r[3885]!, [_0]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3879]!, self._r[3879]!, [_0]) + return formatWithArgumentRanges(self._s[3887]!, self._r[3887]!, [_0]) } - public var Message_PinnedAnimationMessage: String { return self._s[3880]! } - public var VoiceChat_TapToViewCameraVideo: String { return self._s[3881]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[3882]! } - public var Preview_CopyAddress: String { return self._s[3883]! } - public var MediaPlayer_UnknownTrack: String { return self._s[3885]! } - public var Login_CancelSignUpConfirmation: String { return self._s[3886]! } - public var Map_OpenInYandexMaps: String { return self._s[3888]! } + public var Message_PinnedAnimationMessage: String { return self._s[3888]! } + public var VoiceChat_TapToViewCameraVideo: String { return self._s[3889]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[3890]! } + public var Preview_CopyAddress: String { return self._s[3891]! } + public var MediaPlayer_UnknownTrack: String { return self._s[3893]! } + public var Login_CancelSignUpConfirmation: String { return self._s[3894]! } + public var Map_OpenInYandexMaps: String { return self._s[3896]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3891]!, self._r[3891]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3899]!, self._r[3899]!, [_1, _2, _3]) } - public var GroupRemoved_Remove: String { return self._s[3892]! } - public var ChatListFolder_TitleCreate: String { return self._s[3893]! } + public var GroupRemoved_Remove: String { return self._s[3900]! } + public var ChatListFolder_TitleCreate: String { return self._s[3901]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3895]!, self._r[3895]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3903]!, self._r[3903]!, [_1, _2]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[3896]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[3904]! } public func UserInfo_LinkForwardTooltip_TwoChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3898]!, self._r[3898]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3906]!, self._r[3906]!, [_0, _1]) } - public var Group_UpgradeNoticeText2: String { return self._s[3899]! } - public var Stats_GroupGrowthTitle: String { return self._s[3900]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3903]! } - public var Month_GenOctober: String { return self._s[3904]! } - public var Conversation_TitleCommentsEmpty: String { return self._s[3905]! } - public var Settings_Appearance: String { return self._s[3906]! } + public var Group_UpgradeNoticeText2: String { return self._s[3907]! } + public var Stats_GroupGrowthTitle: String { return self._s[3908]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3911]! } + public var Month_GenOctober: String { return self._s[3912]! } + public var Conversation_TitleCommentsEmpty: String { return self._s[3913]! } + public var Settings_Appearance: String { return self._s[3914]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3907]!, self._r[3907]!, [_0]) + return formatWithArgumentRanges(self._s[3915]!, self._r[3915]!, [_0]) } - public var UserInfo_AddToExisting: String { return self._s[3908]! } - public var Call_PhoneCallInProgressMessage: String { return self._s[3910]! } - public var Map_HomeAndWorkInfo: String { return self._s[3911]! } - public var VoiceChat_ContextAudio: String { return self._s[3912]! } - public var InstantPage_VoiceOver_ResetFontSize: String { return self._s[3913]! } - public var Paint_Arrow: String { return self._s[3914]! } - public var InviteLink_CreatePrivateLinkHelp: String { return self._s[3915]! } + public var UserInfo_AddToExisting: String { return self._s[3916]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3918]! } + public var Map_HomeAndWorkInfo: String { return self._s[3919]! } + public var VoiceChat_ContextAudio: String { return self._s[3920]! } + public var InstantPage_VoiceOver_ResetFontSize: String { return self._s[3921]! } + public var Paint_Arrow: String { return self._s[3922]! } + public var InviteLink_CreatePrivateLinkHelp: String { return self._s[3923]! } public func DialogList_MultipleTypingPair(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3916]!, self._r[3916]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3924]!, self._r[3924]!, [_0, _1]) } - public var CancelResetAccount_Title: String { return self._s[3917]! } - public var NotificationsSound_Circles: String { return self._s[3918]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[3919]! } - public var ChatState_Connecting: String { return self._s[3921]! } - public var Profile_MessageLifetime5s: String { return self._s[3922]! } + public var CancelResetAccount_Title: String { return self._s[3925]! } + public var NotificationsSound_Circles: String { return self._s[3926]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[3927]! } + public var ChatState_Connecting: String { return self._s[3929]! } + public var Profile_MessageLifetime5s: String { return self._s[3930]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3923]!, self._r[3923]!, [_0]) + return formatWithArgumentRanges(self._s[3931]!, self._r[3931]!, [_0]) } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[3924]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[3925]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3926]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[3928]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[3929]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[3932]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[3933]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3934]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[3936]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[3937]! } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3930]!, self._r[3930]!, [_0]) + return formatWithArgumentRanges(self._s[3938]!, self._r[3938]!, [_0]) } - public var Passport_Phone_Help: String { return self._s[3931]! } - public var Privacy_ContactsSync: String { return self._s[3932]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3933]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[3935]! } - public var Map_SendMyCurrentLocation: String { return self._s[3936]! } - public var Map_AddressOnMap: String { return self._s[3937]! } - public var BroadcastGroups_ConfirmationAlert_Convert: String { return self._s[3939]! } - public var DialogList_SearchLabel: String { return self._s[3940]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3941]! } - public var GroupInfo_FakeGroupWarning: String { return self._s[3942]! } - public var Conversation_ChecksTooltip_Read: String { return self._s[3944]! } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3946]! } - public var ChatList_Search_ShowMore: String { return self._s[3947]! } - public var DialogList_EncryptionRejected: String { return self._s[3948]! } - public var VoiceChat_InviteLinkCopiedText: String { return self._s[3949]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[3950]! } - public var VoiceChat_StartRecordingText: String { return self._s[3951]! } - public var Privacy_TopPeersDelete: String { return self._s[3952]! } - public var AttachmentMenu_SendAsFile: String { return self._s[3954]! } - public var ChatList_GenericPsaAlert: String { return self._s[3956]! } - public var SecretTimer_ImageDescription: String { return self._s[3958]! } + public var Passport_Phone_Help: String { return self._s[3939]! } + public var Privacy_ContactsSync: String { return self._s[3940]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3941]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[3943]! } + public var Map_SendMyCurrentLocation: String { return self._s[3944]! } + public var Map_AddressOnMap: String { return self._s[3945]! } + public var BroadcastGroups_ConfirmationAlert_Convert: String { return self._s[3947]! } + public var DialogList_SearchLabel: String { return self._s[3948]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3949]! } + public var GroupInfo_FakeGroupWarning: String { return self._s[3950]! } + public var Conversation_ChecksTooltip_Read: String { return self._s[3952]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3954]! } + public var ChatList_Search_ShowMore: String { return self._s[3955]! } + public var DialogList_EncryptionRejected: String { return self._s[3956]! } + public var VoiceChat_InviteLinkCopiedText: String { return self._s[3957]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[3958]! } + public var VoiceChat_StartRecordingText: String { return self._s[3959]! } + public var Privacy_TopPeersDelete: String { return self._s[3960]! } + public var AttachmentMenu_SendAsFile: String { return self._s[3962]! } + public var ChatList_GenericPsaAlert: String { return self._s[3964]! } + public var SecretTimer_ImageDescription: String { return self._s[3966]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3959]!, self._r[3959]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3967]!, self._r[3967]!, [_0, _1]) } - public var VoiceChat_EditNameSuccess: String { return self._s[3960]! } - public var ChatSettings_TextSizeUnits: String { return self._s[3961]! } - public var Notification_RenamedGroup: String { return self._s[3963]! } - public var Tour_Title2: String { return self._s[3964]! } - public var Settings_CopyUsername: String { return self._s[3965]! } - public var Compose_NewEncryptedChat: String { return self._s[3966]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[3967]! } - public var VoiceChat_SetReminder: String { return self._s[3968]! } - public var Month_ShortSeptember: String { return self._s[3969]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[3970]! } - public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[3971]! } - public var VoiceChat_StartNow: String { return self._s[3972]! } - public var Call_StatusConnecting: String { return self._s[3974]! } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[3975]! } - public var Map_ShareLiveLocationHelp: String { return self._s[3976]! } - public var Cache_Files: String { return self._s[3977]! } - public var Notifications_Reset: String { return self._s[3978]! } + public var VoiceChat_EditNameSuccess: String { return self._s[3968]! } + public var ChatSettings_TextSizeUnits: String { return self._s[3969]! } + public var Notification_RenamedGroup: String { return self._s[3971]! } + public var Tour_Title2: String { return self._s[3972]! } + public var Settings_CopyUsername: String { return self._s[3973]! } + public var Compose_NewEncryptedChat: String { return self._s[3974]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[3975]! } + public var VoiceChat_SetReminder: String { return self._s[3976]! } + public var Month_ShortSeptember: String { return self._s[3977]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[3978]! } + public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[3979]! } + public var VoiceChat_StartNow: String { return self._s[3980]! } + public var Call_StatusConnecting: String { return self._s[3982]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[3983]! } + public var Map_ShareLiveLocationHelp: String { return self._s[3984]! } + public var Cache_Files: String { return self._s[3985]! } + public var Notifications_Reset: String { return self._s[3986]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3979]!, self._r[3979]!, [_0]) + return formatWithArgumentRanges(self._s[3987]!, self._r[3987]!, [_0]) } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[3980]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[3988]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3981]!, self._r[3981]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3989]!, self._r[3989]!, [_1, _2]) } - public var Notification_CallIncomingShort: String { return self._s[3982]! } - public var UserInfo_BotPrivacy: String { return self._s[3985]! } - public var Appearance_BubbleCorners_Apply: String { return self._s[3986]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[3987]! } - public var Conversation_ContextMenuLookUp: String { return self._s[3989]! } - public var Calls_RatingTitle: String { return self._s[3990]! } - public var SecretImage_Title: String { return self._s[3991]! } - public var Weekday_Monday: String { return self._s[3992]! } + public var Notification_CallIncomingShort: String { return self._s[3990]! } + public var UserInfo_BotPrivacy: String { return self._s[3993]! } + public var Appearance_BubbleCorners_Apply: String { return self._s[3994]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[3995]! } + public var Conversation_ContextMenuLookUp: String { return self._s[3997]! } + public var Calls_RatingTitle: String { return self._s[3998]! } + public var SecretImage_Title: String { return self._s[3999]! } + public var Weekday_Monday: String { return self._s[4000]! } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3993]!, self._r[3993]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4001]!, self._r[4001]!, [_1, _2]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3994]! } - public var VoiceChat_InviteLink_CopySpeakerLink: String { return self._s[3995]! } - public var Invitation_JoinVoiceChatAsListener: String { return self._s[3996]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[4002]! } + public var VoiceChat_InviteLink_CopySpeakerLink: String { return self._s[4003]! } + public var Invitation_JoinVoiceChatAsListener: String { return self._s[4004]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3997]!, self._r[3997]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4005]!, self._r[4005]!, [_1, _2]) } - public var Stats_GroupMembers: String { return self._s[3998]! } - public var Camera_Retake: String { return self._s[3999]! } - public var Conversation_SearchPlaceholder: String { return self._s[4001]! } + public var Stats_GroupMembers: String { return self._s[4006]! } + public var Camera_Retake: String { return self._s[4007]! } + public var Conversation_SearchPlaceholder: String { return self._s[4009]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4002]!, self._r[4002]!, [_0]) + return formatWithArgumentRanges(self._s[4010]!, self._r[4010]!, [_0]) } - public var Channel_DiscussionGroup_Info: String { return self._s[4003]! } - public var SocksProxySetup_Hostname: String { return self._s[4004]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[4005]! } - public var Privacy_DeleteDrafts: String { return self._s[4007]! } - public var Login_CancelPhoneVerification: String { return self._s[4009]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[4010]! } - public var VoiceOver_Chat_Profile: String { return self._s[4011]! } + public var Channel_DiscussionGroup_Info: String { return self._s[4011]! } + public var SocksProxySetup_Hostname: String { return self._s[4012]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[4013]! } + public var Privacy_DeleteDrafts: String { return self._s[4015]! } + public var Login_CancelPhoneVerification: String { return self._s[4017]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[4018]! } + public var VoiceOver_Chat_Profile: String { return self._s[4019]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4012]!, self._r[4012]!, [_0]) + return formatWithArgumentRanges(self._s[4020]!, self._r[4020]!, [_0]) } - public var TwoStepAuth_EmailSent: String { return self._s[4013]! } - public var Cache_Indexing: String { return self._s[4014]! } - public var Notifications_ExceptionsNone: String { return self._s[4015]! } - public var MessagePoll_LabelQuiz: String { return self._s[4016]! } - public var Call_EncryptionKey_Title: String { return self._s[4017]! } - public var Common_Yes: String { return self._s[4018]! } - public var Channel_ErrorAddBlocked: String { return self._s[4019]! } - public var Month_GenJanuary: String { return self._s[4020]! } - public var Checkout_NewCard_Title: String { return self._s[4021]! } + public var TwoStepAuth_EmailSent: String { return self._s[4021]! } + public var Cache_Indexing: String { return self._s[4022]! } + public var Notifications_ExceptionsNone: String { return self._s[4023]! } + public var MessagePoll_LabelQuiz: String { return self._s[4024]! } + public var Call_EncryptionKey_Title: String { return self._s[4025]! } + public var Common_Yes: String { return self._s[4026]! } + public var Channel_ErrorAddBlocked: String { return self._s[4027]! } + public var Month_GenJanuary: String { return self._s[4028]! } + public var Checkout_NewCard_Title: String { return self._s[4029]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4022]!, self._r[4022]!, [_0]) + return formatWithArgumentRanges(self._s[4030]!, self._r[4030]!, [_0]) } - public var Conversation_InputTextPlaceholderReply: String { return self._s[4024]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[4025]! } - public var Conversation_SendDice: String { return self._s[4026]! } + public var Conversation_InputTextPlaceholderReply: String { return self._s[4032]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[4033]! } + public var Conversation_SendDice: String { return self._s[4034]! } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4027]!, self._r[4027]!, [_0]) + return formatWithArgumentRanges(self._s[4035]!, self._r[4035]!, [_0]) } public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4028]!, self._r[4028]!, [_0]) + return formatWithArgumentRanges(self._s[4036]!, self._r[4036]!, [_0]) } - public var Weekday_Wednesday: String { return self._s[4029]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[4030]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[4031]! } - public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[4032]! } - public var OldChannels_NoticeTitle: String { return self._s[4033]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[4034]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[4035]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[4036]! } - public var Passport_Address_AddUtilityBill: String { return self._s[4037]! } + public var Weekday_Wednesday: String { return self._s[4037]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[4038]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[4039]! } + public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[4040]! } + public var OldChannels_NoticeTitle: String { return self._s[4041]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[4042]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[4043]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[4044]! } + public var Passport_Address_AddUtilityBill: String { return self._s[4045]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4039]!, self._r[4039]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4047]!, self._r[4047]!, [_1, _2, _3]) } - public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[4041]! } - public var Stats_GroupTopAdminsTitle: String { return self._s[4042]! } - public var Paint_Regular: String { return self._s[4044]! } - public var Message_Contact: String { return self._s[4045]! } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[4046]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[4047]! } - public var Notification_Mute1hMin: String { return self._s[4048]! } + public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[4049]! } + public var Stats_GroupTopAdminsTitle: String { return self._s[4050]! } + public var Paint_Regular: String { return self._s[4052]! } + public var Message_Contact: String { return self._s[4053]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[4054]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[4055]! } + public var Notification_Mute1hMin: String { return self._s[4056]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4049]!, self._r[4049]!, [_0]) + return formatWithArgumentRanges(self._s[4057]!, self._r[4057]!, [_0]) } - public var Profile_MessageLifetime1h: String { return self._s[4050]! } - public var TwoStepAuth_GenericHelp: String { return self._s[4051]! } - public var TextFormat_Monospace: String { return self._s[4052]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[4054]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[4055]! } - public var ChatList_DeleteChat: String { return self._s[4056]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[4059]! } + public var Profile_MessageLifetime1h: String { return self._s[4058]! } + public var TwoStepAuth_GenericHelp: String { return self._s[4059]! } + public var TextFormat_Monospace: String { return self._s[4060]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[4062]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[4063]! } + public var ChatList_DeleteChat: String { return self._s[4064]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[4067]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4060]!, self._r[4060]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[4068]!, self._r[4068]!, [_1, _2, _3, _4]) } - public var Login_CancelPhoneVerificationStop: String { return self._s[4061]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[4062]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[4063]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[4069]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[4070]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[4071]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4064]!, self._r[4064]!, [_0]) + return formatWithArgumentRanges(self._s[4072]!, self._r[4072]!, [_0]) } - public var Notifications_Badge_IncludeChannels: String { return self._s[4065]! } - public var InviteLink_CreatePrivateLinkHelpChannel: String { return self._s[4066]! } - public var StickerPack_ViewPack: String { return self._s[4069]! } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[4071]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[4072]! } - public var Notifications_Title: String { return self._s[4073]! } - public var Conversation_InputTextPlaceholderComment: String { return self._s[4074]! } - public var GroupInfo_PublicLink: String { return self._s[4075]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[4073]! } + public var InviteLink_CreatePrivateLinkHelpChannel: String { return self._s[4074]! } + public var StickerPack_ViewPack: String { return self._s[4077]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[4079]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[4080]! } + public var Notifications_Title: String { return self._s[4081]! } + public var Conversation_InputTextPlaceholderComment: String { return self._s[4082]! } + public var GroupInfo_PublicLink: String { return self._s[4083]! } public func ScheduleVoiceChat_GroupText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4076]!, self._r[4076]!, [_0]) - } - public var VoiceOver_DiscardPreparedContent: String { return self._s[4077]! } - public var Conversation_Moderate_Ban: String { return self._s[4081]! } - public var InviteLink_Manage: String { return self._s[4082]! } - public var InstantPage_FontNewYork: String { return self._s[4083]! } - public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4084]!, self._r[4084]!, [_0]) } - public var TextFormat_Underline: String { return self._s[4085]! } - public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4086]!, self._r[4086]!, [_0, _1]) - } - public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4087]!, self._r[4087]!, [_1]) - } - public var PollResults_Collapse: String { return self._s[4089]! } - public var Contacts_GlobalSearch: String { return self._s[4090]! } - public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { + public var VoiceOver_DiscardPreparedContent: String { return self._s[4085]! } + public var Conversation_Moderate_Ban: String { return self._s[4089]! } + public var InviteLink_Manage: String { return self._s[4090]! } + public var InstantPage_FontNewYork: String { return self._s[4091]! } + public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4092]!, self._r[4092]!, [_0]) } - public var Channel_Management_LabelEditor: String { return self._s[4093]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[4095]! } - public var Conversation_Theme: String { return self._s[4096]! } + public var TextFormat_Underline: String { return self._s[4093]! } + public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4094]!, self._r[4094]!, [_0, _1]) + } + public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4095]!, self._r[4095]!, [_1]) + } + public var PollResults_Collapse: String { return self._s[4097]! } + public var Contacts_GlobalSearch: String { return self._s[4098]! } + public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4100]!, self._r[4100]!, [_0]) + } + public var Channel_Management_LabelEditor: String { return self._s[4101]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[4103]! } + public var Conversation_Theme: String { return self._s[4104]! } public func PUSH_CHANNEL_MESSAGE_DOCS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4097]!, self._r[4097]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4105]!, self._r[4105]!, [_1, "\(_2)"]) } - public var Conversation_LinkDialogSave: String { return self._s[4098]! } - public var EnterPasscode_TouchId: String { return self._s[4099]! } - public var Conversation_VoiceChatMediaRecordingRestricted: String { return self._s[4100]! } - public var Group_ErrorAdminsTooMuch: String { return self._s[4101]! } - public var Stats_MessageOverview: String { return self._s[4102]! } - public var Privacy_Calls_P2PAlways: String { return self._s[4104]! } - public var Message_Sticker: String { return self._s[4105]! } - public var Conversation_Mute: String { return self._s[4108]! } - public var VoiceChat_AnonymousDisabledAlertText: String { return self._s[4109]! } - public var ContactInfo_Title: String { return self._s[4110]! } + public var Conversation_LinkDialogSave: String { return self._s[4106]! } + public var EnterPasscode_TouchId: String { return self._s[4107]! } + public var Conversation_VoiceChatMediaRecordingRestricted: String { return self._s[4108]! } + public var Group_ErrorAdminsTooMuch: String { return self._s[4109]! } + public var Stats_MessageOverview: String { return self._s[4110]! } + public var Privacy_Calls_P2PAlways: String { return self._s[4112]! } + public var Message_Sticker: String { return self._s[4113]! } + public var Conversation_Mute: String { return self._s[4116]! } + public var VoiceChat_AnonymousDisabledAlertText: String { return self._s[4117]! } + public var ContactInfo_Title: String { return self._s[4118]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4111]!, self._r[4111]!, [_1]) + return formatWithArgumentRanges(self._s[4119]!, self._r[4119]!, [_1]) } - public var Channel_Setup_TypeHeader: String { return self._s[4112]! } - public var AuthSessions_LogOut: String { return self._s[4113]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[4114]! } - public var VoiceChat_PinVideo: String { return self._s[4115]! } - public var Group_Info_Members: String { return self._s[4117]! } - public var ChatListFolderSettings_NewFolder: String { return self._s[4118]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[4119]! } - public var CreatePoll_Title: String { return self._s[4120]! } - public var EditTheme_EditTitle: String { return self._s[4121]! } - public var ChatListFolderSettings_RecommendedFoldersSection: String { return self._s[4122]! } - public var TwoStepAuth_SetPassword: String { return self._s[4123]! } + public var Channel_Setup_TypeHeader: String { return self._s[4120]! } + public var AuthSessions_LogOut: String { return self._s[4121]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[4122]! } + public var VoiceChat_PinVideo: String { return self._s[4123]! } + public var Group_Info_Members: String { return self._s[4125]! } + public var ChatListFolderSettings_NewFolder: String { return self._s[4126]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[4127]! } + public var CreatePoll_Title: String { return self._s[4128]! } + public var EditTheme_EditTitle: String { return self._s[4129]! } + public var ChatListFolderSettings_RecommendedFoldersSection: String { return self._s[4130]! } + public var TwoStepAuth_SetPassword: String { return self._s[4131]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4124]!, self._r[4124]!, [_0]) + return formatWithArgumentRanges(self._s[4132]!, self._r[4132]!, [_0]) } - public var BlockedUsers_Info: String { return self._s[4125]! } - public var AuthSessions_Sessions: String { return self._s[4126]! } - public var Group_EditAdmin_RankTitle: String { return self._s[4127]! } - public var Common_ActionNotAllowedError: String { return self._s[4128]! } - public var WebPreview_GettingLinkInfo: String { return self._s[4129]! } - public var Appearance_AppIconFilledX: String { return self._s[4130]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[4131]! } - public var FeaturedStickers_OtherSection: String { return self._s[4132]! } - public var VoiceChat_RecordingStarted: String { return self._s[4133]! } - public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[4134]! } - public var Profile_Username: String { return self._s[4135]! } - public var Settings_TipsUsername: String { return self._s[4136]! } - public var Appearance_RemoveTheme: String { return self._s[4137]! } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[4138]! } - public var Message_PinnedStickerMessage: String { return self._s[4139]! } - public var AccessDenied_VideoMicrophone: String { return self._s[4140]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[4141]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[4142]! } - public var Conversation_VoiceChat: String { return self._s[4143]! } - public var VoiceChat_EditBioSuccess: String { return self._s[4144]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[4145]! } - public var TwoStepAuth_Title: String { return self._s[4146]! } - public var VoiceOver_Chat_YourAnimatedSticker: String { return self._s[4147]! } - public var Checkout_WebConfirmation_Title: String { return self._s[4148]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[4149]! } - public var ChatListFolder_CategoryGroups: String { return self._s[4151]! } - public var Stats_GroupTopInviter_Promote: String { return self._s[4152]! } - public var Conversation_EditingPhotoPanelTitle: String { return self._s[4153]! } - public var Month_GenJuly: String { return self._s[4154]! } - public var Passport_Identity_Gender: String { return self._s[4155]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[4156]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[4157]! } - public var VoiceChat_StopRecording: String { return self._s[4158]! } + public var BlockedUsers_Info: String { return self._s[4133]! } + public var AuthSessions_Sessions: String { return self._s[4134]! } + public var Group_EditAdmin_RankTitle: String { return self._s[4135]! } + public var Common_ActionNotAllowedError: String { return self._s[4136]! } + public var WebPreview_GettingLinkInfo: String { return self._s[4137]! } + public var Appearance_AppIconFilledX: String { return self._s[4138]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[4139]! } + public var FeaturedStickers_OtherSection: String { return self._s[4140]! } + public var VoiceChat_RecordingStarted: String { return self._s[4141]! } + public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[4142]! } + public var Profile_Username: String { return self._s[4143]! } + public var Settings_TipsUsername: String { return self._s[4144]! } + public var Appearance_RemoveTheme: String { return self._s[4145]! } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[4146]! } + public var Message_PinnedStickerMessage: String { return self._s[4147]! } + public var AccessDenied_VideoMicrophone: String { return self._s[4148]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[4149]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[4150]! } + public var Conversation_VoiceChat: String { return self._s[4151]! } + public var VoiceChat_EditBioSuccess: String { return self._s[4152]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[4153]! } + public var TwoStepAuth_Title: String { return self._s[4154]! } + public var VoiceOver_Chat_YourAnimatedSticker: String { return self._s[4155]! } + public var Checkout_WebConfirmation_Title: String { return self._s[4156]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[4157]! } + public var ChatListFolder_CategoryGroups: String { return self._s[4159]! } + public var Stats_GroupTopInviter_Promote: String { return self._s[4160]! } + public var Conversation_EditingPhotoPanelTitle: String { return self._s[4161]! } + public var Month_GenJuly: String { return self._s[4162]! } + public var Passport_Identity_Gender: String { return self._s[4163]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[4164]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[4165]! } + public var VoiceChat_StopRecording: String { return self._s[4166]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4159]!, self._r[4159]!, [_0]) + return formatWithArgumentRanges(self._s[4167]!, self._r[4167]!, [_0]) } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4160]!, self._r[4160]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[4168]!, self._r[4168]!, [_0, _1, _2]) } - public var Login_CodeSentSms: String { return self._s[4161]! } + public var Login_CodeSentSms: String { return self._s[4169]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4162]!, self._r[4162]!, [_0]) + return formatWithArgumentRanges(self._s[4170]!, self._r[4170]!, [_0]) } - public var Login_CallRequestState2: String { return self._s[4163]! } - public var Channel_DiscussionGroup_Header: String { return self._s[4164]! } + public var Login_CallRequestState2: String { return self._s[4171]! } + public var Channel_DiscussionGroup_Header: String { return self._s[4172]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4165]!, self._r[4165]!, [_0]) + return formatWithArgumentRanges(self._s[4173]!, self._r[4173]!, [_0]) } - public var Passport_Language_ms: String { return self._s[4166]! } - public var PeopleNearby_MakeInvisible: String { return self._s[4168]! } - public var ChatList_Search_FilterVoice: String { return self._s[4170]! } - public var Camera_TapAndHoldForVideo: String { return self._s[4172]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[4173]! } + public var Passport_Language_ms: String { return self._s[4174]! } + public var PeopleNearby_MakeInvisible: String { return self._s[4176]! } + public var ChatList_Search_FilterVoice: String { return self._s[4178]! } + public var Camera_TapAndHoldForVideo: String { return self._s[4180]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[4181]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4174]!, self._r[4174]!, [_0]) + return formatWithArgumentRanges(self._s[4182]!, self._r[4182]!, [_0]) } public func Call_VoiceChatInProgressMessageCall(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4175]!, self._r[4175]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4183]!, self._r[4183]!, [_1, _2]) } - public var Map_Locating: String { return self._s[4176]! } + public var Map_Locating: String { return self._s[4184]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4178]!, self._r[4178]!, [_0]) + return formatWithArgumentRanges(self._s[4186]!, self._r[4186]!, [_0]) } - public var Passport_Identity_TypeInternalPassport: String { return self._s[4180]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[4181]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[4182]! } - public var Stickers_Installed: String { return self._s[4183]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[4184]! } - public var StickerPackActionInfo_RemovedTitle: String { return self._s[4185]! } - public var CallSettings_Never: String { return self._s[4187]! } - public var Channel_Setup_TypePublicHelp: String { return self._s[4188]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[4188]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[4189]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[4190]! } + public var Stickers_Installed: String { return self._s[4191]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[4192]! } + public var StickerPackActionInfo_RemovedTitle: String { return self._s[4193]! } + public var CallSettings_Never: String { return self._s[4195]! } + public var Channel_Setup_TypePublicHelp: String { return self._s[4196]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4190]!, self._r[4190]!, [_0]) + return formatWithArgumentRanges(self._s[4198]!, self._r[4198]!, [_0]) } - public var Message_Game: String { return self._s[4191]! } - public var Call_Message: String { return self._s[4192]! } + public var Message_Game: String { return self._s[4199]! } + public var Call_Message: String { return self._s[4200]! } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4193]!, self._r[4193]!, [_1]) + return formatWithArgumentRanges(self._s[4201]!, self._r[4201]!, [_1]) } - public var ChannelIntro_Text: String { return self._s[4194]! } - public var StickerPack_Send: String { return self._s[4195]! } - public var Share_AuthDescription: String { return self._s[4196]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[4197]! } - public var CallFeedback_WhatWentWrong: String { return self._s[4198]! } - public var Common_Create: String { return self._s[4201]! } - public var Passport_Language_hy: String { return self._s[4202]! } - public var CreatePoll_Explanation: String { return self._s[4203]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[4204]! } - public var ChatImport_CreateGroupAlertImportAction: String { return self._s[4205]! } - public var PeerInfo_ButtonVoiceChat: String { return self._s[4206]! } - public var Undo_ChatClearedForBothSides: String { return self._s[4207]! } - public var DialogList_NoMessagesTitle: String { return self._s[4208]! } - public var GroupInfo_Title: String { return self._s[4210]! } + public var ChannelIntro_Text: String { return self._s[4202]! } + public var VoiceChat_NoiseSuppressionEnabled: String { return self._s[4203]! } + public var StickerPack_Send: String { return self._s[4204]! } + public var Share_AuthDescription: String { return self._s[4205]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[4206]! } + public var CallFeedback_WhatWentWrong: String { return self._s[4207]! } + public var Common_Create: String { return self._s[4210]! } + public var Passport_Language_hy: String { return self._s[4211]! } + public var CreatePoll_Explanation: String { return self._s[4212]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[4213]! } + public var ChatImport_CreateGroupAlertImportAction: String { return self._s[4214]! } + public var PeerInfo_ButtonVoiceChat: String { return self._s[4215]! } + public var Undo_ChatClearedForBothSides: String { return self._s[4216]! } + public var DialogList_NoMessagesTitle: String { return self._s[4217]! } + public var GroupInfo_Title: String { return self._s[4219]! } public func ScheduleVoiceChat_ScheduleToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4211]!, self._r[4211]!, [_0]) + return formatWithArgumentRanges(self._s[4220]!, self._r[4220]!, [_0]) } - public var UserInfo_ContactForwardTooltip_SavedMessages_One: String { return self._s[4212]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[4213]! } - public var PhoneNumberHelp_Help: String { return self._s[4214]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[4215]! } - public var Settings_Logout: String { return self._s[4216]! } - public var Privacy_PaymentsTitle: String { return self._s[4217]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[4218]! } - public var Tour_Text6: String { return self._s[4219]! } - public var ChatImportActivity_Title: String { return self._s[4221]! } - public var Channel_Username_Help: String { return self._s[4222]! } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[4223]! } - public var AttachmentMenu_Poll: String { return self._s[4224]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[4225]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[4226]! } - public var Passport_DeletePassport: String { return self._s[4227]! } - public var Login_Code: String { return self._s[4228]! } - public var Notification_SecretChatScreenshot: String { return self._s[4229]! } - public var VoiceChat_AddBio: String { return self._s[4230]! } - public var Login_CodeFloodError: String { return self._s[4231]! } + public var UserInfo_ContactForwardTooltip_SavedMessages_One: String { return self._s[4221]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[4222]! } + public var PhoneNumberHelp_Help: String { return self._s[4223]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[4224]! } + public var Settings_Logout: String { return self._s[4225]! } + public var Privacy_PaymentsTitle: String { return self._s[4226]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[4227]! } + public var Tour_Text6: String { return self._s[4228]! } + public var ChatImportActivity_Title: String { return self._s[4230]! } + public var Channel_Username_Help: String { return self._s[4231]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[4232]! } + public var AttachmentMenu_Poll: String { return self._s[4233]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[4234]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[4235]! } + public var Passport_DeletePassport: String { return self._s[4236]! } + public var Login_Code: String { return self._s[4237]! } + public var Notification_SecretChatScreenshot: String { return self._s[4238]! } + public var VoiceChat_AddBio: String { return self._s[4239]! } + public var Login_CodeFloodError: String { return self._s[4240]! } public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4232]!, self._r[4232]!, [_0]) + return formatWithArgumentRanges(self._s[4241]!, self._r[4241]!, [_0]) } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4233]!, self._r[4233]!, [_0]) + return formatWithArgumentRanges(self._s[4242]!, self._r[4242]!, [_0]) } - public var Watch_Stickers_Recents: String { return self._s[4234]! } - public var Generic_ErrorMoreInfo: String { return self._s[4235]! } + public var Watch_Stickers_Recents: String { return self._s[4243]! } + public var Generic_ErrorMoreInfo: String { return self._s[4244]! } public func Call_AccountIsLoggedOnCurrentDevice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4236]!, self._r[4236]!, [_0]) + return formatWithArgumentRanges(self._s[4245]!, self._r[4245]!, [_0]) } - public var AutoDownloadSettings_DataUsage: String { return self._s[4237]! } - public var Conversation_ViewTheme: String { return self._s[4238]! } - public var Contacts_InviteSearchLabel: String { return self._s[4239]! } - public var Settings_CancelUpload: String { return self._s[4241]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[4242]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[4246]! } + public var Conversation_ViewTheme: String { return self._s[4247]! } + public var Contacts_InviteSearchLabel: String { return self._s[4248]! } + public var Settings_CancelUpload: String { return self._s[4250]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[4251]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4243]!, self._r[4243]!, [_0]) + return formatWithArgumentRanges(self._s[4252]!, self._r[4252]!, [_0]) } - public var ChatList_AddFolder: String { return self._s[4244]! } - public var Conversation_Location: String { return self._s[4246]! } - public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[4247]! } - public var DialogList_AdLabel: String { return self._s[4248]! } + public var ChatList_AddFolder: String { return self._s[4253]! } + public var Conversation_Location: String { return self._s[4255]! } + public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[4256]! } + public var DialogList_AdLabel: String { return self._s[4257]! } public func Time_TomorrowAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4250]!, self._r[4250]!, [_0]) + return formatWithArgumentRanges(self._s[4259]!, self._r[4259]!, [_0]) } - public var Message_InvoiceLabel: String { return self._s[4251]! } - public var Channel_TooMuchBots: String { return self._s[4252]! } + public var Message_InvoiceLabel: String { return self._s[4260]! } + public var Channel_TooMuchBots: String { return self._s[4261]! } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4254]!, self._r[4254]!, [_0]) + return formatWithArgumentRanges(self._s[4263]!, self._r[4263]!, [_0]) } - public var Call_IncomingVideoCall: String { return self._s[4255]! } - public var Conversation_LiveLocation: String { return self._s[4256]! } - public var VoiceChat_AskedToSpeakHelp: String { return self._s[4257]! } - public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[4258]! } - public var Passport_Identity_EditPassport: String { return self._s[4259]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[4261]! } - public var ChatList_Search_NoResultsFitlerVoice: String { return self._s[4262]! } - public var GroupInfo_Permissions_AddException: String { return self._s[4263]! } + public var Call_IncomingVideoCall: String { return self._s[4264]! } + public var Conversation_LiveLocation: String { return self._s[4265]! } + public var VoiceChat_AskedToSpeakHelp: String { return self._s[4266]! } + public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[4267]! } + public var Passport_Identity_EditPassport: String { return self._s[4268]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[4270]! } + public var ChatList_Search_NoResultsFitlerVoice: String { return self._s[4271]! } + public var GroupInfo_Permissions_AddException: String { return self._s[4272]! } public func VoiceChat_RemovePeerConfirmationChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4265]!, self._r[4265]!, [_0]) + return formatWithArgumentRanges(self._s[4274]!, self._r[4274]!, [_0]) } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[4266]! } - public var Channel_MessageVideoUpdated: String { return self._s[4267]! } - public var GroupInfo_Permissions_EditingDisabled: String { return self._s[4268]! } - public var AutoremoveSetup_TimeSectionHeader: String { return self._s[4271]! } - public var AccessDenied_Camera: String { return self._s[4272]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[4275]! } + public var Channel_MessageVideoUpdated: String { return self._s[4276]! } + public var GroupInfo_Permissions_EditingDisabled: String { return self._s[4277]! } + public var AutoremoveSetup_TimeSectionHeader: String { return self._s[4280]! } + public var AccessDenied_Camera: String { return self._s[4281]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4273]!, self._r[4273]!, [_0]) + return formatWithArgumentRanges(self._s[4282]!, self._r[4282]!, [_0]) } - public var Theme_Context_ChangeColors: String { return self._s[4274]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[4275]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[4276]! } - public var Login_CodeExpiredError: String { return self._s[4277]! } - public var State_ConnectingToProxy: String { return self._s[4278]! } - public var TextFormat_Link: String { return self._s[4279]! } - public var Passport_Language_lv: String { return self._s[4281]! } - public var Conversation_AutoremoveTimerRemovedGroup: String { return self._s[4282]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[4283]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[4284]! } - public var ProfilePhoto_SetMainVideo: String { return self._s[4285]! } - public var AutoDownloadSettings_Cellular: String { return self._s[4287]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[4288]! } - public var Calls_NoVoiceAndVideoCallsPlaceholder: String { return self._s[4289]! } + public var Theme_Context_ChangeColors: String { return self._s[4283]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[4284]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[4285]! } + public var Login_CodeExpiredError: String { return self._s[4286]! } + public var State_ConnectingToProxy: String { return self._s[4287]! } + public var TextFormat_Link: String { return self._s[4288]! } + public var Passport_Language_lv: String { return self._s[4290]! } + public var Conversation_AutoremoveTimerRemovedGroup: String { return self._s[4291]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[4292]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[4293]! } + public var ProfilePhoto_SetMainVideo: String { return self._s[4294]! } + public var AutoDownloadSettings_Cellular: String { return self._s[4296]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[4297]! } + public var Calls_NoVoiceAndVideoCallsPlaceholder: String { return self._s[4298]! } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4290]!, self._r[4290]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4299]!, self._r[4299]!, [_1, _2]) } - public var ChatList_EmptyChatListFilterTitle: String { return self._s[4291]! } - public var Checkout_PayNone: String { return self._s[4292]! } - public var NotificationsSound_Complete: String { return self._s[4294]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[4295]! } - public var InviteLink_CreateInfo: String { return self._s[4296]! } - public var AuthSessions_DevicesTitle: String { return self._s[4297]! } + public var ChatList_EmptyChatListFilterTitle: String { return self._s[4300]! } + public var Checkout_PayNone: String { return self._s[4301]! } + public var NotificationsSound_Complete: String { return self._s[4303]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[4304]! } + public var InviteLink_CreateInfo: String { return self._s[4305]! } + public var AuthSessions_DevicesTitle: String { return self._s[4306]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4298]!, self._r[4298]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4307]!, self._r[4307]!, [_0, _1]) } - public var Message_LiveLocation: String { return self._s[4299]! } - public var Watch_Suggestion_BRB: String { return self._s[4300]! } - public var Channel_BanUser_Title: String { return self._s[4301]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4302]! } - public var Conversation_Dice_u1F3C0: String { return self._s[4303]! } - public var Conversation_ClearSelfHistory: String { return self._s[4304]! } - public var ProfilePhoto_OpenGallery: String { return self._s[4305]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[4306]! } - public var Weekday_Thursday: String { return self._s[4307]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[4308]! } - public var Privacy_ProfilePhoto: String { return self._s[4310]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[4311]! } + public var Message_LiveLocation: String { return self._s[4308]! } + public var Watch_Suggestion_BRB: String { return self._s[4309]! } + public var Channel_BanUser_Title: String { return self._s[4310]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4311]! } + public var Conversation_Dice_u1F3C0: String { return self._s[4312]! } + public var Conversation_ClearSelfHistory: String { return self._s[4313]! } + public var ProfilePhoto_OpenGallery: String { return self._s[4314]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[4315]! } + public var Weekday_Thursday: String { return self._s[4316]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[4317]! } + public var Privacy_ProfilePhoto: String { return self._s[4319]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[4320]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4312]!, self._r[4312]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4321]!, self._r[4321]!, [_1, _2]) } - public var Message_Audio: String { return self._s[4313]! } - public var Conversation_Info: String { return self._s[4314]! } - public var Cache_Videos: String { return self._s[4315]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[4316]! } - public var Channel_ErrorAddTooMuch: String { return self._s[4317]! } + public var Message_Audio: String { return self._s[4322]! } + public var Conversation_Info: String { return self._s[4323]! } + public var Cache_Videos: String { return self._s[4324]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[4325]! } + public var Channel_ErrorAddTooMuch: String { return self._s[4326]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4318]!, self._r[4318]!, [_0]) + return formatWithArgumentRanges(self._s[4327]!, self._r[4327]!, [_0]) } - public var VoiceChat_EditBio: String { return self._s[4319]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[4321]! } - public var VoiceChat_ShareScreen: String { return self._s[4324]! } - public var ScheduledMessages_Title: String { return self._s[4325]! } - public var ShareFileTip_Title: String { return self._s[4328]! } - public var Chat_Gifs_TrendingSectionHeader: String { return self._s[4329]! } - public var ChatList_RemoveFolderConfirmation: String { return self._s[4330]! } + public var VoiceChat_EditBio: String { return self._s[4328]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[4330]! } + public var VoiceChat_ShareScreen: String { return self._s[4333]! } + public var ScheduledMessages_Title: String { return self._s[4334]! } + public var ShareFileTip_Title: String { return self._s[4337]! } + public var Chat_Gifs_TrendingSectionHeader: String { return self._s[4338]! } + public var ChatList_RemoveFolderConfirmation: String { return self._s[4339]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4331]!, self._r[4331]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4340]!, self._r[4340]!, [_1, _2]) } - public var Conversation_ContextViewStats: String { return self._s[4333]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[4334]! } - public var PasscodeSettings_Title: String { return self._s[4335]! } - public var Channel_AdminLog_SendPolls: String { return self._s[4336]! } - public var LastSeen_ALongTimeAgo: String { return self._s[4337]! } + public var Conversation_ContextViewStats: String { return self._s[4342]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[4343]! } + public var PasscodeSettings_Title: String { return self._s[4344]! } + public var Channel_AdminLog_SendPolls: String { return self._s[4345]! } + public var LastSeen_ALongTimeAgo: String { return self._s[4346]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4338]!, self._r[4338]!, [_1]) + return formatWithArgumentRanges(self._s[4347]!, self._r[4347]!, [_1]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4339]! } - public var ChannelInfo_FakeChannelWarning: String { return self._s[4340]! } - public var CallFeedback_VideoReasonLowQuality: String { return self._s[4341]! } - public var Conversation_PinnedPreviousMessage: String { return self._s[4342]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[4343]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[4344]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4348]! } + public var ChannelInfo_FakeChannelWarning: String { return self._s[4349]! } + public var CallFeedback_VideoReasonLowQuality: String { return self._s[4350]! } + public var Conversation_PinnedPreviousMessage: String { return self._s[4351]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[4352]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[4353]! } public func ChatList_RemovedFromFolderTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4345]!, self._r[4345]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4354]!, self._r[4354]!, [_1, _2]) } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4346]!, self._r[4346]!, [_0]) + return formatWithArgumentRanges(self._s[4355]!, self._r[4355]!, [_0]) } - public var Passport_Identity_GenderFemale: String { return self._s[4347]! } - public var Location_ProximityNotification_DistanceKM: String { return self._s[4350]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[4351]! } + public var Passport_Identity_GenderFemale: String { return self._s[4356]! } + public var Location_ProximityNotification_DistanceKM: String { return self._s[4359]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[4360]! } public func Message_ImportedDateFormat(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4352]!, self._r[4352]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4361]!, self._r[4361]!, [_1, _2, _3]) } - public var VoiceChat_Audio: String { return self._s[4353]! } - public var SharedMedia_TitleAll: String { return self._s[4354]! } - public var Settings_Context_Logout: String { return self._s[4355]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[4358]! } - public var Settings_About_Title: String { return self._s[4359]! } - public var StickerSettings_ContextHide: String { return self._s[4360]! } + public var VoiceChat_Audio: String { return self._s[4362]! } + public var SharedMedia_TitleAll: String { return self._s[4363]! } + public var Settings_Context_Logout: String { return self._s[4364]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[4367]! } + public var Settings_About_Title: String { return self._s[4368]! } + public var StickerSettings_ContextHide: String { return self._s[4369]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4361]!, self._r[4361]!, [_0]) + return formatWithArgumentRanges(self._s[4370]!, self._r[4370]!, [_0]) } public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4362]!, self._r[4362]!, [_0]) + return formatWithArgumentRanges(self._s[4371]!, self._r[4371]!, [_0]) } - public var ChatImport_SelectionConfirmationAlertImportAction: String { return self._s[4364]! } - public var Common_Cancel: String { return self._s[4365]! } - public var CallFeedback_Title: String { return self._s[4367]! } + public var ChatImport_SelectionConfirmationAlertImportAction: String { return self._s[4373]! } + public var Common_Cancel: String { return self._s[4374]! } + public var CallFeedback_Title: String { return self._s[4376]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4368]!, self._r[4368]!, [_0]) - } - public var Conversation_StickerAddedToFavorites: String { return self._s[4369]! } - public var Activity_UploadingVideoMessage: String { return self._s[4371]! } - public var MediaPicker_Send: String { return self._s[4372]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[4373]! } - public var Conversation_LiveLocationYou: String { return self._s[4374]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[4375]! } - public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4377]!, self._r[4377]!, [_0]) } + public var Conversation_StickerAddedToFavorites: String { return self._s[4378]! } + public var Activity_UploadingVideoMessage: String { return self._s[4380]! } + public var MediaPicker_Send: String { return self._s[4381]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[4382]! } + public var Conversation_LiveLocationYou: String { return self._s[4383]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[4384]! } + public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4386]!, self._r[4386]!, [_0]) + } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4378]!, self._r[4378]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4387]!, self._r[4387]!, [_1, _2]) } - public var Checkout_PaymentLiabilityAlert: String { return self._s[4379]! } - public var Conversation_ViewBackground: String { return self._s[4380]! } - public var ChatSettings_PrivateChats: String { return self._s[4383]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[4384]! } - public var BroadcastGroups_LimitAlert_LearnMore: String { return self._s[4385]! } - public var Appearance_ThemeNight: String { return self._s[4386]! } - public var Common_Search: String { return self._s[4387]! } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[4388]! } - public var ChangePhoneNumberNumber_Help: String { return self._s[4390]! } - public var InviteLink_QRCode_Share: String { return self._s[4391]! } - public var Stickers_SuggestAdded: String { return self._s[4393]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[4396]! } - public var Widget_UpdatedTodayAt: String { return self._s[4397]! } - public var NetworkUsageSettings_Cellular: String { return self._s[4398]! } - public var CheckoutInfo_Title: String { return self._s[4399]! } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[4400]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[4401]! } + public var Checkout_PaymentLiabilityAlert: String { return self._s[4388]! } + public var Conversation_ViewBackground: String { return self._s[4389]! } + public var ChatSettings_PrivateChats: String { return self._s[4392]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[4393]! } + public var BroadcastGroups_LimitAlert_LearnMore: String { return self._s[4394]! } + public var Appearance_ThemeNight: String { return self._s[4395]! } + public var Common_Search: String { return self._s[4396]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[4397]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[4399]! } + public var InviteLink_QRCode_Share: String { return self._s[4400]! } + public var Stickers_SuggestAdded: String { return self._s[4402]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[4405]! } + public var Widget_UpdatedTodayAt: String { return self._s[4406]! } + public var NetworkUsageSettings_Cellular: String { return self._s[4407]! } + public var CheckoutInfo_Title: String { return self._s[4408]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[4409]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[4410]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4402]!, self._r[4402]!, [_0]) + return formatWithArgumentRanges(self._s[4411]!, self._r[4411]!, [_0]) } - public var MaskStickerSettings_Info: String { return self._s[4404]! } - public var GroupRemoved_DeleteUser: String { return self._s[4406]! } - public var Contacts_ShareTelegram: String { return self._s[4407]! } - public var Group_UpgradeNoticeText1: String { return self._s[4408]! } + public var MaskStickerSettings_Info: String { return self._s[4413]! } + public var GroupRemoved_DeleteUser: String { return self._s[4415]! } + public var Contacts_ShareTelegram: String { return self._s[4416]! } + public var Group_UpgradeNoticeText1: String { return self._s[4417]! } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4409]!, self._r[4409]!, [_1]) + return formatWithArgumentRanges(self._s[4418]!, self._r[4418]!, [_1]) } - public var PrivacyLastSeenSettings_Title: String { return self._s[4410]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[4414]! } - public var PhotoEditor_TintTool: String { return self._s[4415]! } - public var ChatImportActivity_OpenApp: String { return self._s[4417]! } - public var GroupPermission_NoSendPolls: String { return self._s[4418]! } - public var NotificationsSound_None: String { return self._s[4419]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[4419]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[4423]! } + public var PhotoEditor_TintTool: String { return self._s[4424]! } + public var ChatImportActivity_OpenApp: String { return self._s[4426]! } + public var GroupPermission_NoSendPolls: String { return self._s[4427]! } + public var NotificationsSound_None: String { return self._s[4428]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4420]!, self._r[4420]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4429]!, self._r[4429]!, [_1, "\(_2)"]) } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4423]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4432]! } public func Conversation_AutoremoveTimerSetChannel(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4425]!, self._r[4425]!, [_1]) + return formatWithArgumentRanges(self._s[4434]!, self._r[4434]!, [_1]) } - public var ExplicitContent_AlertChannel: String { return self._s[4426]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[4427]! } - public var Contacts_SortedByPresence: String { return self._s[4428]! } - public var WallpaperSearch_ColorGray: String { return self._s[4429]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4430]! } - public var Conversation_ReportSpam: String { return self._s[4431]! } - public var ChatList_Search_NoResultsFilter: String { return self._s[4434]! } - public var WallpaperSearch_ColorBlack: String { return self._s[4435]! } - public var ArchivedChats_IntroTitle3: String { return self._s[4436]! } - public var InviteLink_DeleteAllRevokedLinksAlert_Action: String { return self._s[4437]! } + public var ExplicitContent_AlertChannel: String { return self._s[4435]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[4436]! } + public var Contacts_SortedByPresence: String { return self._s[4437]! } + public var WallpaperSearch_ColorGray: String { return self._s[4438]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4439]! } + public var Conversation_ReportSpam: String { return self._s[4440]! } + public var ChatList_Search_NoResultsFilter: String { return self._s[4443]! } + public var WallpaperSearch_ColorBlack: String { return self._s[4444]! } + public var ArchivedChats_IntroTitle3: String { return self._s[4445]! } + public var InviteLink_DeleteAllRevokedLinksAlert_Action: String { return self._s[4446]! } public func VoiceChat_PeerJoinedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4438]!, self._r[4438]!, [_0]) + return formatWithArgumentRanges(self._s[4447]!, self._r[4447]!, [_0]) } - public var Conversation_DefaultRestrictedText: String { return self._s[4439]! } - public var Settings_Devices: String { return self._s[4440]! } - public var Call_AudioRouteSpeaker: String { return self._s[4441]! } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[4442]! } - public var VoiceChat_StartsIn: String { return self._s[4443]! } - public var VoiceChat_CreateNewVoiceChatSchedule: String { return self._s[4444]! } - public var VoiceChat_EditDescriptionTitle: String { return self._s[4446]! } - public var Passport_Address_Country: String { return self._s[4447]! } - public var Cache_MaximumCacheSize: String { return self._s[4448]! } - public var Chat_PanelHidePinnedMessages: String { return self._s[4449]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[4450]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4452]! } - public var Login_TermsOfServiceLabel: String { return self._s[4453]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[4454]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[4455]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4456]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[4457]! } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[4458]! } - public var ConvertToSupergroup_Note: String { return self._s[4460]! } - public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4461]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4462]! } - public var Common_More: String { return self._s[4463]! } - public var ShareMenu_SelectChats: String { return self._s[4465]! } + public var Conversation_DefaultRestrictedText: String { return self._s[4448]! } + public var Settings_Devices: String { return self._s[4449]! } + public var Call_AudioRouteSpeaker: String { return self._s[4450]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[4451]! } + public var VoiceChat_StartsIn: String { return self._s[4452]! } + public var VoiceChat_CreateNewVoiceChatSchedule: String { return self._s[4453]! } + public var VoiceChat_EditDescriptionTitle: String { return self._s[4455]! } + public var Passport_Address_Country: String { return self._s[4456]! } + public var Cache_MaximumCacheSize: String { return self._s[4457]! } + public var Chat_PanelHidePinnedMessages: String { return self._s[4458]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[4459]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4461]! } + public var Login_TermsOfServiceLabel: String { return self._s[4462]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[4463]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[4464]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4465]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[4466]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[4467]! } + public var ConvertToSupergroup_Note: String { return self._s[4469]! } + public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4470]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4471]! } + public var Common_More: String { return self._s[4472]! } + public var ShareMenu_SelectChats: String { return self._s[4474]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4466]!, self._r[4466]!, [_0]) + return formatWithArgumentRanges(self._s[4475]!, self._r[4475]!, [_0]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4467]!, self._r[4467]!, [_0]) + return formatWithArgumentRanges(self._s[4476]!, self._r[4476]!, [_0]) } - public var Contacts_PermissionsKeepDisabled: String { return self._s[4469]! } - public var VoiceChat_EditBioText: String { return self._s[4470]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[4478]! } + public var VoiceChat_EditBioText: String { return self._s[4479]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4471]!, self._r[4471]!, [_0]) + return formatWithArgumentRanges(self._s[4480]!, self._r[4480]!, [_0]) } - public var WatchRemote_AlertOpen: String { return self._s[4472]! } + public var WatchRemote_AlertOpen: String { return self._s[4481]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4473]!, self._r[4473]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4482]!, self._r[4482]!, [_1, _2, _3]) } - public var Channel_Members_AddMembersHelp: String { return self._s[4474]! } - public var Shortcut_SwitchAccount: String { return self._s[4475]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4476]! } + public var Channel_Members_AddMembersHelp: String { return self._s[4483]! } + public var Shortcut_SwitchAccount: String { return self._s[4484]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4485]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4477]!, self._r[4477]!, [_0]) + return formatWithArgumentRanges(self._s[4486]!, self._r[4486]!, [_0]) } - public var Compose_NewGroupTitle: String { return self._s[4478]! } - public var DialogList_You: String { return self._s[4479]! } - public var Call_VoiceOver_VoiceCallOutgoing: String { return self._s[4480]! } - public var ReportPeer_ReasonViolence: String { return self._s[4481]! } + public var Compose_NewGroupTitle: String { return self._s[4487]! } + public var DialogList_You: String { return self._s[4488]! } + public var Call_VoiceOver_VoiceCallOutgoing: String { return self._s[4489]! } + public var ReportPeer_ReasonViolence: String { return self._s[4490]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4482]!, self._r[4482]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4491]!, self._r[4491]!, [_1, _2]) } - public var VoiceChat_Reconnecting: String { return self._s[4484]! } - public var KeyCommand_ScrollDown: String { return self._s[4487]! } - public var ChatSettings_DownloadInBackground: String { return self._s[4488]! } - public var Wallpaper_ResetWallpapers: String { return self._s[4489]! } - public var Channel_BanList_RestrictedTitle: String { return self._s[4490]! } - public var ArchivedChats_IntroText3: String { return self._s[4491]! } - public var HashtagSearch_AllChats: String { return self._s[4493]! } - public var VoiceChat_EndVoiceChat: String { return self._s[4494]! } - public var Conversation_MessageCopied: String { return self._s[4496]! } - public var Channel_Info_BlackList: String { return self._s[4497]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4498]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4499]! } - public var Paint_Neon: String { return self._s[4501]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4502]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[4503]! } + public var VoiceChat_Reconnecting: String { return self._s[4493]! } + public var KeyCommand_ScrollDown: String { return self._s[4496]! } + public var ChatSettings_DownloadInBackground: String { return self._s[4497]! } + public var Wallpaper_ResetWallpapers: String { return self._s[4498]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[4499]! } + public var ArchivedChats_IntroText3: String { return self._s[4500]! } + public var HashtagSearch_AllChats: String { return self._s[4502]! } + public var VoiceChat_EndVoiceChat: String { return self._s[4503]! } + public var Conversation_MessageCopied: String { return self._s[4505]! } + public var Channel_Info_BlackList: String { return self._s[4506]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4507]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4508]! } + public var Paint_Neon: String { return self._s[4510]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4511]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[4512]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4505]!, self._r[4505]!, [_0]) + return formatWithArgumentRanges(self._s[4514]!, self._r[4514]!, [_0]) } - public var Map_StopLiveLocation: String { return self._s[4506]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4507]! } - public var Channel_Username_InvalidCharacters: String { return self._s[4508]! } - public var InstantPage_Reference: String { return self._s[4510]! } - public var Group_Members_AddMembers: String { return self._s[4512]! } + public var Map_StopLiveLocation: String { return self._s[4515]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4516]! } + public var Channel_Username_InvalidCharacters: String { return self._s[4517]! } + public var InstantPage_Reference: String { return self._s[4519]! } + public var Group_Members_AddMembers: String { return self._s[4521]! } public func Conversation_ScheduledVoiceChatStartsOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4513]!, self._r[4513]!, [_0]) + return formatWithArgumentRanges(self._s[4522]!, self._r[4522]!, [_0]) } - public var ChatList_HideAction: String { return self._s[4514]! } - public var Conversation_FileICloudDrive: String { return self._s[4516]! } + public var ChatList_HideAction: String { return self._s[4523]! } + public var Conversation_FileICloudDrive: String { return self._s[4525]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4517]!, self._r[4517]!, [_1]) + return formatWithArgumentRanges(self._s[4526]!, self._r[4526]!, [_1]) } - public var Passport_PasswordReset: String { return self._s[4519]! } - public var ChatList_Context_UnhideArchive: String { return self._s[4521]! } - public var ConvertToSupergroup_HelpText: String { return self._s[4522]! } - public var Calls_AddTab: String { return self._s[4523]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4525]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4526]! } - public var Privacy_GroupsAndChannels: String { return self._s[4529]! } - public var Conversation_UsernameCopied: String { return self._s[4530]! } - public var AutoNightTheme_Disabled: String { return self._s[4531]! } - public var CreatePoll_MultipleChoice: String { return self._s[4532]! } + public var Passport_PasswordReset: String { return self._s[4528]! } + public var ChatList_Context_UnhideArchive: String { return self._s[4530]! } + public var ConvertToSupergroup_HelpText: String { return self._s[4531]! } + public var Calls_AddTab: String { return self._s[4532]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4534]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4535]! } + public var Privacy_GroupsAndChannels: String { return self._s[4538]! } + public var Conversation_UsernameCopied: String { return self._s[4539]! } + public var AutoNightTheme_Disabled: String { return self._s[4540]! } + public var CreatePoll_MultipleChoice: String { return self._s[4541]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4533]!, self._r[4533]!, [_1]) + return formatWithArgumentRanges(self._s[4542]!, self._r[4542]!, [_1]) } - public var Watch_Bot_Restart: String { return self._s[4535]! } + public var Watch_Bot_Restart: String { return self._s[4544]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4536]!, self._r[4536]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[4545]!, self._r[4545]!, ["\(_0)"]) } - public var GroupInfo_ScamGroupWarning: String { return self._s[4538]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[4539]! } - public var Appearance_PreviewIncomingText: String { return self._s[4540]! } - public var ChatSettings_WidgetSettings: String { return self._s[4541]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4542]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4544]! } - public var Stats_GroupOverview: String { return self._s[4546]! } - public var ScheduledMessages_EditTime: String { return self._s[4549]! } - public var Month_GenFebruary: String { return self._s[4550]! } - public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4551]! } - public var Stickers_ClearRecent: String { return self._s[4552]! } - public var InviteLink_Create_UsersLimitNumberOfUsersUnlimited: String { return self._s[4553]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4554]! } - public var Stats_Message_PublicShares: String { return self._s[4555]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[4547]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[4548]! } + public var Appearance_PreviewIncomingText: String { return self._s[4549]! } + public var ChatSettings_WidgetSettings: String { return self._s[4550]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4551]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4553]! } + public var Stats_GroupOverview: String { return self._s[4555]! } + public var ScheduledMessages_EditTime: String { return self._s[4558]! } + public var Month_GenFebruary: String { return self._s[4559]! } + public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4560]! } + public var Stickers_ClearRecent: String { return self._s[4561]! } + public var InviteLink_Create_UsersLimitNumberOfUsersUnlimited: String { return self._s[4562]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4563]! } + public var Stats_Message_PublicShares: String { return self._s[4564]! } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4556]!, self._r[4556]!, [_0]) + return formatWithArgumentRanges(self._s[4565]!, self._r[4565]!, [_0]) } - public var Login_TermsOfServiceSignupDecline: String { return self._s[4557]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4558]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[4559]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4560]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4562]! } - public var CreatePoll_Create: String { return self._s[4563]! } - public var ChatList_Search_FilterLinks: String { return self._s[4564]! } - public var Your_cards_number_is_invalid: String { return self._s[4565]! } - public var Month_ShortApril: String { return self._s[4566]! } - public var SocksProxySetup_UseForCalls: String { return self._s[4567]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[4568]! } - public var SocksProxySetup_Status: String { return self._s[4569]! } - public var VoiceChat_UnmuteForMe: String { return self._s[4570]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4571]! } - public var ChatListFolder_CategoryBots: String { return self._s[4572]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[4574]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4575]! } - public var Chat_PinnedListPreview_UnpinAllMessages: String { return self._s[4576]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[4577]! } - public var Conversation_TitleUnmute: String { return self._s[4578]! } - public var Group_Setup_TypeHeader: String { return self._s[4579]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[4566]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4567]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[4568]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4569]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4571]! } + public var CreatePoll_Create: String { return self._s[4572]! } + public var ChatList_Search_FilterLinks: String { return self._s[4573]! } + public var Your_cards_number_is_invalid: String { return self._s[4574]! } + public var Month_ShortApril: String { return self._s[4575]! } + public var SocksProxySetup_UseForCalls: String { return self._s[4576]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[4577]! } + public var SocksProxySetup_Status: String { return self._s[4578]! } + public var VoiceChat_UnmuteForMe: String { return self._s[4579]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4580]! } + public var ChatListFolder_CategoryBots: String { return self._s[4581]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[4583]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4584]! } + public var Chat_PinnedListPreview_UnpinAllMessages: String { return self._s[4585]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[4586]! } + public var Conversation_TitleUnmute: String { return self._s[4587]! } + public var Group_Setup_TypeHeader: String { return self._s[4588]! } public func Conversation_ForwardTooltip_ManyChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4580]!, self._r[4580]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4589]!, self._r[4589]!, [_0, _1]) } - public var Stats_ViewsPerPost: String { return self._s[4581]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4582]! } - public var Passport_Identity_TranslationHelp: String { return self._s[4583]! } + public var Stats_ViewsPerPost: String { return self._s[4590]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4591]! } + public var Passport_Identity_TranslationHelp: String { return self._s[4592]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4584]!, self._r[4584]!, [_1]) + return formatWithArgumentRanges(self._s[4593]!, self._r[4593]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[4585]! } + public var GroupInfo_Administrators_Title: String { return self._s[4594]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4586]!, self._r[4586]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4595]!, self._r[4595]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4587]!, self._r[4587]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4596]!, self._r[4596]!, [_1, _2, _3]) } - public var CheckoutInfo_ShippingInfoState: String { return self._s[4588]! } - public var Passport_Language_my: String { return self._s[4590]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4591]! } - public var Map_PlacesNearby: String { return self._s[4592]! } - public var Channel_About_Help: String { return self._s[4593]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[4594]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[4595]! } - public var Channel_Username_Title: String { return self._s[4596]! } - public var Activity_RecordingVideoMessage: String { return self._s[4597]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[4597]! } + public var Passport_Language_my: String { return self._s[4599]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4600]! } + public var VoiceChat_Unpin: String { return self._s[4601]! } + public var Map_PlacesNearby: String { return self._s[4602]! } + public var Channel_About_Help: String { return self._s[4603]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[4604]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[4605]! } + public var Channel_Username_Title: String { return self._s[4606]! } + public var Activity_RecordingVideoMessage: String { return self._s[4607]! } public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4598]!, self._r[4598]!, [_0]) + return formatWithArgumentRanges(self._s[4608]!, self._r[4608]!, [_0]) } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[4599]! } - public var Passport_DiscardMessageDescription: String { return self._s[4600]! } - public var Conversation_LinkDialogOpen: String { return self._s[4601]! } - public var ChatList_Context_HideArchive: String { return self._s[4602]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[4609]! } + public var Passport_DiscardMessageDescription: String { return self._s[4610]! } + public var Conversation_LinkDialogOpen: String { return self._s[4611]! } + public var ChatList_Context_HideArchive: String { return self._s[4612]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4603]!, self._r[4603]!, [_0]) + return formatWithArgumentRanges(self._s[4613]!, self._r[4613]!, [_0]) } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4604]! } - public var Conversation_Admin: String { return self._s[4605]! } - public var DialogList_TabTitle: String { return self._s[4606]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4614]! } + public var Conversation_Admin: String { return self._s[4615]! } + public var DialogList_TabTitle: String { return self._s[4616]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4607]!, self._r[4607]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4617]!, self._r[4617]!, [_1, _2]) } - public var Notifications_PermissionsUnreachableText: String { return self._s[4608]! } - public var Passport_Identity_GenderMale: String { return self._s[4610]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[4618]! } + public var Passport_Identity_GenderMale: String { return self._s[4620]! } public func VoiceChat_EditTitleSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4612]!, self._r[4612]!, [_0]) - } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4613]! } - public var PhoneNumberHelp_Alert: String { return self._s[4614]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4615]! } - public var Notifications_InAppNotifications: String { return self._s[4616]! } - public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4617]!, self._r[4617]!, [_0]) - } - public var Notification_VideoCallOutgoing: String { return self._s[4618]! } - public var Login_InvalidCodeError: String { return self._s[4619]! } - public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4620]! } - public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4622]!, self._r[4622]!, [_0]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4623]! } - public var ReportPeer_Report: String { return self._s[4624]! } - public var Camera_FlashOff: String { return self._s[4627]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4630]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4623]! } + public var PhoneNumberHelp_Alert: String { return self._s[4624]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4625]! } + public var Notifications_InAppNotifications: String { return self._s[4626]! } + public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4627]!, self._r[4627]!, [_0]) + } + public var Notification_VideoCallOutgoing: String { return self._s[4628]! } + public var Login_InvalidCodeError: String { return self._s[4629]! } + public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4630]! } + public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4632]!, self._r[4632]!, [_0]) + } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4633]! } + public var ReportPeer_Report: String { return self._s[4634]! } + public var Camera_FlashOff: String { return self._s[4637]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4640]! } public func Notification_VoiceChatScheduledTomorrow(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4631]!, self._r[4631]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4641]!, self._r[4641]!, [_1, _2]) } - public var PrivacyPolicy_DeclineTitle: String { return self._s[4634]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4635]! } - public var Passport_FieldEmail: String { return self._s[4636]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[4644]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4645]! } + public var Passport_FieldEmail: String { return self._s[4646]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4637]!, self._r[4637]!, [_1]) + return formatWithArgumentRanges(self._s[4647]!, self._r[4647]!, [_1]) } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[4638]! } - public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4639]! } - public var Group_OwnershipTransfer_Title: String { return self._s[4640]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[4641]! } - public var Login_PhoneNumberHelp: String { return self._s[4643]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4644]! } - public var Conversation_PinnedQuiz: String { return self._s[4645]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[4646]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4647]! } - public var Group_MessagePhotoUpdated: String { return self._s[4648]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[4649]! } - public var BroadcastGroups_ConfirmationAlert_Text: String { return self._s[4650]! } - public var Passport_Identity_Translations: String { return self._s[4652]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4653]! } - public var ChannelInfo_DeleteChannel: String { return self._s[4655]! } - public var PasscodeSettings_HelpBottom: String { return self._s[4656]! } - public var Channel_Members_AddMembers: String { return self._s[4657]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[4658]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4660]! } - public var Conversation_HoldForAudio: String { return self._s[4661]! } - public var Media_LimitedAccessChangeSettings: String { return self._s[4663]! } - public var Watch_LastSeen_Lately: String { return self._s[4664]! } - public var ChatList_Context_MarkAsRead: String { return self._s[4665]! } - public var Conversation_PinnedMessage: String { return self._s[4666]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4667]! } - public var VoiceChat_StopRecordingStop: String { return self._s[4669]! } - public var Passport_UpdateRequiredError: String { return self._s[4670]! } - public var PrivacySettings_Passcode: String { return self._s[4671]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[4648]! } + public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4649]! } + public var Group_OwnershipTransfer_Title: String { return self._s[4650]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[4651]! } + public var Login_PhoneNumberHelp: String { return self._s[4653]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4654]! } + public var Conversation_PinnedQuiz: String { return self._s[4655]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[4656]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4657]! } + public var Group_MessagePhotoUpdated: String { return self._s[4658]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[4659]! } + public var BroadcastGroups_ConfirmationAlert_Text: String { return self._s[4660]! } + public var Passport_Identity_Translations: String { return self._s[4662]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4663]! } + public var ChannelInfo_DeleteChannel: String { return self._s[4665]! } + public var PasscodeSettings_HelpBottom: String { return self._s[4666]! } + public var Channel_Members_AddMembers: String { return self._s[4667]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[4668]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4670]! } + public var Conversation_HoldForAudio: String { return self._s[4671]! } + public var Media_LimitedAccessChangeSettings: String { return self._s[4673]! } + public var Watch_LastSeen_Lately: String { return self._s[4674]! } + public var ChatList_Context_MarkAsRead: String { return self._s[4675]! } + public var Conversation_PinnedMessage: String { return self._s[4676]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4677]! } + public var VoiceChat_StopRecordingStop: String { return self._s[4679]! } + public var Passport_UpdateRequiredError: String { return self._s[4680]! } + public var PrivacySettings_Passcode: String { return self._s[4681]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4672]!, self._r[4672]!, [_0]) + return formatWithArgumentRanges(self._s[4682]!, self._r[4682]!, [_0]) } - public var AutoNightTheme_NotAvailable: String { return self._s[4673]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[4674]! } - public var VoiceOver_Common_On: String { return self._s[4675]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[4676]! } - public var ChatListFolder_IncludedSectionHeader: String { return self._s[4677]! } - public var Channel_SignMessages_Help: String { return self._s[4678]! } - public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4679]! } - public var Conversation_TitleNoComments: String { return self._s[4680]! } - public var MediaPicker_LivePhotoDescription: String { return self._s[4681]! } - public var GroupInfo_Permissions: String { return self._s[4682]! } - public var GroupPermission_NoSendLinks: String { return self._s[4685]! } + public var AutoNightTheme_NotAvailable: String { return self._s[4683]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[4684]! } + public var VoiceOver_Common_On: String { return self._s[4685]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[4686]! } + public var ChatListFolder_IncludedSectionHeader: String { return self._s[4687]! } + public var Channel_SignMessages_Help: String { return self._s[4688]! } + public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4689]! } + public var Conversation_TitleNoComments: String { return self._s[4690]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[4691]! } + public var GroupInfo_Permissions: String { return self._s[4692]! } + public var GroupPermission_NoSendLinks: String { return self._s[4695]! } public func Conversation_ScheduledVoiceChatStartsTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4686]!, self._r[4686]!, [_0]) + return formatWithArgumentRanges(self._s[4696]!, self._r[4696]!, [_0]) } - public var Passport_Identity_ResidenceCountry: String { return self._s[4687]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[4689]! } - public var ChatList_ArchiveAction: String { return self._s[4690]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[4697]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[4699]! } + public var ChatList_ArchiveAction: String { return self._s[4700]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4691]!, self._r[4691]!, [_0]) + return formatWithArgumentRanges(self._s[4701]!, self._r[4701]!, [_0]) } - public var GroupInfo_GroupHistory: String { return self._s[4692]! } + public var GroupInfo_GroupHistory: String { return self._s[4702]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4694]!, self._r[4694]!, [_0]) + return formatWithArgumentRanges(self._s[4704]!, self._r[4704]!, [_0]) } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4696]! } - public var Channel_Info_Banned: String { return self._s[4697]! } - public var Paint_RecentStickers: String { return self._s[4698]! } - public var VoiceOver_MessageContextSend: String { return self._s[4699]! } - public var Group_ErrorNotMutualContact: String { return self._s[4700]! } - public var ReportPeer_ReasonOther: String { return self._s[4702]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4703]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4705]! } - public var KeyCommand_Find: String { return self._s[4706]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4706]! } + public var Channel_Info_Banned: String { return self._s[4707]! } + public var Paint_RecentStickers: String { return self._s[4708]! } + public var VoiceOver_MessageContextSend: String { return self._s[4709]! } + public var Group_ErrorNotMutualContact: String { return self._s[4710]! } + public var ReportPeer_ReasonOther: String { return self._s[4712]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4713]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4715]! } + public var KeyCommand_Find: String { return self._s[4716]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4707]!, self._r[4707]!, [_0]) + return formatWithArgumentRanges(self._s[4717]!, self._r[4717]!, [_0]) } - public var ChatList_Context_Unmute: String { return self._s[4708]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4709]! } - public var Stickers_GroupStickersHelp: String { return self._s[4710]! } - public var Checkout_Title: String { return self._s[4711]! } - public var Activity_RecordingAudio: String { return self._s[4712]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4713]! } - public var BlockedUsers_BlockTitle: String { return self._s[4714]! } - public var DialogList_SavedMessagesHelp: String { return self._s[4716]! } - public var Calls_All: String { return self._s[4717]! } - public var Settings_FAQ_Button: String { return self._s[4719]! } - public var Conversation_Dice_u1F3B0: String { return self._s[4721]! } + public var ChatList_Context_Unmute: String { return self._s[4718]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4719]! } + public var Stickers_GroupStickersHelp: String { return self._s[4720]! } + public var Checkout_Title: String { return self._s[4721]! } + public var Activity_RecordingAudio: String { return self._s[4722]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4723]! } + public var BlockedUsers_BlockTitle: String { return self._s[4724]! } + public var DialogList_SavedMessagesHelp: String { return self._s[4726]! } + public var Calls_All: String { return self._s[4727]! } + public var Settings_FAQ_Button: String { return self._s[4729]! } + public var Conversation_Dice_u1F3B0: String { return self._s[4731]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4722]!, self._r[4722]!, [_0]) + return formatWithArgumentRanges(self._s[4732]!, self._r[4732]!, [_0]) } - public var Conversation_ReportGroupLocation: String { return self._s[4723]! } - public var Passport_Scans_Upload: String { return self._s[4724]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4726]! } - public var ChatList_UnarchiveAction: String { return self._s[4727]! } - public var Stats_GroupTopInviter_History: String { return self._s[4728]! } - public var GroupInfo_Permissions_Title: String { return self._s[4729]! } - public var VoiceChat_CreateNewVoiceChatStart: String { return self._s[4730]! } - public var Passport_Language_el: String { return self._s[4731]! } - public var Channel_DiscussionMessageUnavailable: String { return self._s[4732]! } + public var Conversation_ReportGroupLocation: String { return self._s[4733]! } + public var Passport_Scans_Upload: String { return self._s[4734]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4736]! } + public var ChatList_UnarchiveAction: String { return self._s[4737]! } + public var Stats_GroupTopInviter_History: String { return self._s[4738]! } + public var GroupInfo_Permissions_Title: String { return self._s[4739]! } + public var VoiceChat_CreateNewVoiceChatStart: String { return self._s[4740]! } + public var Passport_Language_el: String { return self._s[4741]! } + public var Channel_DiscussionMessageUnavailable: String { return self._s[4742]! } public func UserInfo_ContactForwardTooltip_TwoChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4733]!, self._r[4733]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4743]!, self._r[4743]!, [_0, _1]) } - public var GroupInfo_ActionPromote: String { return self._s[4734]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4735]! } - public var Media_LimitedAccessSelectMore: String { return self._s[4736]! } + public var GroupInfo_ActionPromote: String { return self._s[4744]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4745]! } + public var Media_LimitedAccessSelectMore: String { return self._s[4746]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4737]!, self._r[4737]!, [_0]) + return formatWithArgumentRanges(self._s[4747]!, self._r[4747]!, [_0]) } - public var VoiceOver_Chat_Reply: String { return self._s[4738]! } - public var Month_GenMay: String { return self._s[4739]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4740]! } - public var Chat_PsaTooltip_covid: String { return self._s[4741]! } - public var Watch_Suggestion_CantTalk: String { return self._s[4742]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4743]! } - public var AppUpgrade_Running: String { return self._s[4744]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4747]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4748]! } - public var SharedMedia_EmptyText: String { return self._s[4749]! } - public var Passport_Address_EditResidentialAddress: String { return self._s[4750]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4751]! } - public var Message_PinnedGame: String { return self._s[4752]! } - public var KeyCommand_SearchInChat: String { return self._s[4753]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[4754]! } - public var ChatList_Search_FilterMedia: String { return self._s[4755]! } - public var Message_PinnedAudioMessage: String { return self._s[4756]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[4758]! } + public var VoiceOver_Chat_Reply: String { return self._s[4748]! } + public var Month_GenMay: String { return self._s[4749]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4750]! } + public var Chat_PsaTooltip_covid: String { return self._s[4751]! } + public var Watch_Suggestion_CantTalk: String { return self._s[4752]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4753]! } + public var AppUpgrade_Running: String { return self._s[4754]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4757]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4758]! } + public var SharedMedia_EmptyText: String { return self._s[4759]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[4760]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4761]! } + public var Message_PinnedGame: String { return self._s[4762]! } + public var KeyCommand_SearchInChat: String { return self._s[4763]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[4764]! } + public var ChatList_Search_FilterMedia: String { return self._s[4765]! } + public var Message_PinnedAudioMessage: String { return self._s[4766]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[4768]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4759]!, self._r[4759]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4769]!, self._r[4769]!, [_1, _2]) } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4760]! } - public var InviteLink_Create: String { return self._s[4761]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4770]! } + public var InviteLink_Create: String { return self._s[4771]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4762]!, self._r[4762]!, [_0]) + return formatWithArgumentRanges(self._s[4772]!, self._r[4772]!, [_0]) } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4763]!, self._r[4763]!, [_0]) + return formatWithArgumentRanges(self._s[4773]!, self._r[4773]!, [_0]) } - public var Settings_AddAccount: String { return self._s[4764]! } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4765]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4766]! } - public var Channel_JoinChannel: String { return self._s[4767]! } - public var Watch_UserInfo_Unblock: String { return self._s[4768]! } - public var PhoneLabel_Title: String { return self._s[4769]! } - public var VoiceChat_EditPermissions: String { return self._s[4771]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[4772]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4773]! } + public var Settings_AddAccount: String { return self._s[4774]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4775]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4776]! } + public var Channel_JoinChannel: String { return self._s[4777]! } + public var Watch_UserInfo_Unblock: String { return self._s[4778]! } + public var PhoneLabel_Title: String { return self._s[4779]! } + public var VoiceChat_EditPermissions: String { return self._s[4781]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[4782]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4783]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4774]!, self._r[4774]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[4784]!, self._r[4784]!, [_1, _2, _3, _4, _5, _6]) } - public var Channel_AddBotErrorHaveRights: String { return self._s[4775]! } - public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4776]! } - public var DialogList_EncryptionProcessing: String { return self._s[4777]! } - public var ChatList_Search_FilterChats: String { return self._s[4778]! } - public var WatchRemote_NotificationText: String { return self._s[4779]! } - public var EditTheme_ChangeColors: String { return self._s[4781]! } - public var GroupRemoved_ViewUserInfo: String { return self._s[4782]! } - public var CallSettings_OnMobile: String { return self._s[4784]! } - public var Month_ShortFebruary: String { return self._s[4786]! } - public var VoiceOver_MessageContextReply: String { return self._s[4787]! } - public var AutoremoveSetup_TimerValueNever: String { return self._s[4788]! } - public var Group_Location_ChangeLocation: String { return self._s[4790]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[4785]! } + public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4786]! } + public var DialogList_EncryptionProcessing: String { return self._s[4787]! } + public var ChatList_Search_FilterChats: String { return self._s[4788]! } + public var WatchRemote_NotificationText: String { return self._s[4789]! } + public var EditTheme_ChangeColors: String { return self._s[4791]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[4792]! } + public var CallSettings_OnMobile: String { return self._s[4794]! } + public var Month_ShortFebruary: String { return self._s[4796]! } + public var VoiceOver_MessageContextReply: String { return self._s[4797]! } + public var AutoremoveSetup_TimerValueNever: String { return self._s[4798]! } + public var Group_Location_ChangeLocation: String { return self._s[4800]! } public func PUSH_VIDEO_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4791]!, self._r[4791]!, [_1]) + return formatWithArgumentRanges(self._s[4801]!, self._r[4801]!, [_1]) } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4792]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[4793]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4794]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4802]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[4803]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4804]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4796]!, self._r[4796]!, [_0]) + return formatWithArgumentRanges(self._s[4806]!, self._r[4806]!, [_0]) } - public var PhotoEditor_WarmthTool: String { return self._s[4797]! } - public var Login_InfoAvatarPhoto: String { return self._s[4798]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4799]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4800]! } - public var Map_PlacesInThisArea: String { return self._s[4801]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[4802]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[4803]! } + public var PhotoEditor_WarmthTool: String { return self._s[4807]! } + public var Login_InfoAvatarPhoto: String { return self._s[4808]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4809]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4810]! } + public var Map_PlacesInThisArea: String { return self._s[4811]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[4812]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[4813]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4804]!, self._r[4804]!, [_1]) + return formatWithArgumentRanges(self._s[4814]!, self._r[4814]!, [_1]) } - public var PeerInfo_ReportProfileVideo: String { return self._s[4805]! } - public var ShareMenu_Send: String { return self._s[4806]! } - public var Username_InvalidStartsWithNumber: String { return self._s[4807]! } + public var PeerInfo_ReportProfileVideo: String { return self._s[4815]! } + public var ShareMenu_Send: String { return self._s[4816]! } + public var Username_InvalidStartsWithNumber: String { return self._s[4817]! } public func Channel_AdminLog_StartedVoiceChat(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4808]!, self._r[4808]!, [_1]) + return formatWithArgumentRanges(self._s[4818]!, self._r[4818]!, [_1]) } - public var Appearance_AppIconClassicX: String { return self._s[4809]! } - public var Report_Report: String { return self._s[4810]! } + public var Appearance_AppIconClassicX: String { return self._s[4819]! } + public var Report_Report: String { return self._s[4820]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4811]!, self._r[4811]!, [_1]) + return formatWithArgumentRanges(self._s[4821]!, self._r[4821]!, [_1]) } - public var Conversation_StopPoll: String { return self._s[4812]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4814]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[4815]! } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4816]! } - public var Conversation_Timer_Title: String { return self._s[4817]! } - public var Common_Next: String { return self._s[4818]! } - public var Notification_Exceptions_NewException: String { return self._s[4819]! } + public var Conversation_StopPoll: String { return self._s[4822]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4824]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[4825]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4826]! } + public var Conversation_Timer_Title: String { return self._s[4827]! } + public var Common_Next: String { return self._s[4828]! } + public var Notification_Exceptions_NewException: String { return self._s[4829]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4820]!, self._r[4820]!, [_0]) + return formatWithArgumentRanges(self._s[4830]!, self._r[4830]!, [_0]) } - public var AccessDenied_CallMicrophone: String { return self._s[4821]! } - public var VoiceChat_UnmutePeer: String { return self._s[4822]! } - public var ChatImportActivity_Retry: String { return self._s[4823]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4824]! } - public var ChangePhoneNumberCode_Help: String { return self._s[4825]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4826]! } - public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4827]! } - public var BlockedUsers_LeavePrefix: String { return self._s[4828]! } + public var AccessDenied_CallMicrophone: String { return self._s[4831]! } + public var VoiceChat_UnmutePeer: String { return self._s[4832]! } + public var ChatImportActivity_Retry: String { return self._s[4833]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4834]! } + public var ChangePhoneNumberCode_Help: String { return self._s[4835]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4836]! } + public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4837]! } + public var BlockedUsers_LeavePrefix: String { return self._s[4838]! } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4829]!, self._r[4829]!, [_0]) + return formatWithArgumentRanges(self._s[4839]!, self._r[4839]!, [_0]) } - public var Group_About_Help: String { return self._s[4830]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4831]! } - public var Tour_Title3: String { return self._s[4832]! } - public var Watch_Conversation_Unblock: String { return self._s[4833]! } - public var Watch_UserInfo_Block: String { return self._s[4834]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[4835]! } - public var TwoFactorSetup_Hint_Action: String { return self._s[4836]! } - public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4837]! } - public var TextFormat_AddLinkTitle: String { return self._s[4838]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4839]! } + public var Group_About_Help: String { return self._s[4840]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4841]! } + public var Tour_Title3: String { return self._s[4842]! } + public var Watch_Conversation_Unblock: String { return self._s[4843]! } + public var Watch_UserInfo_Block: String { return self._s[4844]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[4845]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[4846]! } + public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4847]! } + public var TextFormat_AddLinkTitle: String { return self._s[4848]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4849]! } public func Notification_VoiceChatScheduled(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4840]!, self._r[4840]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4850]!, self._r[4850]!, [_1, _2]) } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4841]! } - public var FastTwoStepSetup_PasswordSection: String { return self._s[4843]! } - public var Compose_ChannelMembers: String { return self._s[4844]! } - public var Conversation_ForwardTitle: String { return self._s[4845]! } - public var Conversation_PinnedPoll: String { return self._s[4848]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4851]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[4853]! } + public var Compose_ChannelMembers: String { return self._s[4854]! } + public var Conversation_ForwardTitle: String { return self._s[4855]! } + public var Conversation_PinnedPoll: String { return self._s[4858]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4849]!, self._r[4849]!, [_0]) + return formatWithArgumentRanges(self._s[4859]!, self._r[4859]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4850]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4852]! } - public var Stats_Overview: String { return self._s[4853]! } - public var Map_HomeAndWorkTitle: String { return self._s[4854]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4860]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4862]! } + public var Stats_Overview: String { return self._s[4863]! } + public var Map_HomeAndWorkTitle: String { return self._s[4864]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4855]!, self._r[4855]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4865]!, self._r[4865]!, [_1, _2, _3]) } - public var Passport_Address_CityPlaceholder: String { return self._s[4856]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4857]! } - public var Privacy_PhoneNumber: String { return self._s[4858]! } - public var ChatList_Search_FilterFiles: String { return self._s[4859]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4860]! } - public var ChannelIntro_CreateChannel: String { return self._s[4861]! } - public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4862]! } + public var Passport_Address_CityPlaceholder: String { return self._s[4866]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4867]! } + public var Privacy_PhoneNumber: String { return self._s[4868]! } + public var ChatList_Search_FilterFiles: String { return self._s[4869]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4870]! } + public var ChannelIntro_CreateChannel: String { return self._s[4871]! } + public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4872]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4863]!, self._r[4863]!, [_0]) + return formatWithArgumentRanges(self._s[4873]!, self._r[4873]!, [_0]) } - public var Weekday_ShortMonday: String { return self._s[4864]! } - public var Passport_Language_ar: String { return self._s[4866]! } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4867]! } - public var TwoFactorSetup_Done_Title: String { return self._s[4868]! } - public var Calls_RatingFeedback: String { return self._s[4869]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4870]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[4873]! } + public var Weekday_ShortMonday: String { return self._s[4874]! } + public var Passport_Language_ar: String { return self._s[4876]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4877]! } + public var TwoFactorSetup_Done_Title: String { return self._s[4878]! } + public var Calls_RatingFeedback: String { return self._s[4879]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4880]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[4883]! } public func VoiceOver_SelfDestructTimerOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4874]!, self._r[4874]!, [_0]) + return formatWithArgumentRanges(self._s[4884]!, self._r[4884]!, [_0]) } - public var Watch_Compose_Send: String { return self._s[4875]! } - public var PasscodeSettings_ChangePasscode: String { return self._s[4876]! } - public var WebSearch_RecentSectionClear: String { return self._s[4877]! } + public var Watch_Compose_Send: String { return self._s[4885]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[4886]! } + public var WebSearch_RecentSectionClear: String { return self._s[4887]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4878]!, self._r[4878]!, [_0]) + return formatWithArgumentRanges(self._s[4888]!, self._r[4888]!, [_0]) } - public var WallpaperSearch_ColorTeal: String { return self._s[4879]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4880]! } - public var Permissions_ContactsTitle_v0: String { return self._s[4881]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[4883]! } - public var Settings_SavedMessages: String { return self._s[4884]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4885]! } - public var Month_ShortMarch: String { return self._s[4886]! } - public var Message_Location: String { return self._s[4887]! } + public var WallpaperSearch_ColorTeal: String { return self._s[4889]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4890]! } + public var Permissions_ContactsTitle_v0: String { return self._s[4891]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[4893]! } + public var Settings_SavedMessages: String { return self._s[4894]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4895]! } + public var Month_ShortMarch: String { return self._s[4896]! } + public var Message_Location: String { return self._s[4897]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4888]!, self._r[4888]!, [_1]) + return formatWithArgumentRanges(self._s[4898]!, self._r[4898]!, [_1]) } public func Channel_AdminLog_MessageRemovedAdminName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4889]!, self._r[4889]!, [_1]) + return formatWithArgumentRanges(self._s[4899]!, self._r[4899]!, [_1]) } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4890]!, self._r[4890]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4900]!, self._r[4900]!, [_1, _2]) } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[4892]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[4902]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4893]!, self._r[4893]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4903]!, self._r[4903]!, [_1, _2]) } - public var GroupPermission_NoSendMedia: String { return self._s[4894]! } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[4895]! } - public var SharedMedia_CategoryDocs: String { return self._s[4896]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[4897]! } - public var Paint_Framed: String { return self._s[4898]! } - public var Channel_Setup_LinkTypePublic: String { return self._s[4899]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4900]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[4901]! } + public var GroupPermission_NoSendMedia: String { return self._s[4904]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[4905]! } + public var SharedMedia_CategoryDocs: String { return self._s[4906]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[4907]! } + public var Paint_Framed: String { return self._s[4908]! } + public var Channel_Setup_LinkTypePublic: String { return self._s[4909]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4910]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[4911]! } public func ChatImport_SelectionConfirmationUserWithTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4902]!, self._r[4902]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4912]!, self._r[4912]!, [_1, _2]) } - public var Channel_SignMessages: String { return self._s[4903]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[4904]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4905]! } + public var Channel_SignMessages: String { return self._s[4913]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[4914]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4915]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4906]!, self._r[4906]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4916]!, self._r[4916]!, [_1, _2]) } - public var InviteLink_Create_TimeLimitNoLimit: String { return self._s[4907]! } - public var GroupInfo_UpgradeButton: String { return self._s[4908]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4909]! } + public var InviteLink_Create_TimeLimitNoLimit: String { return self._s[4917]! } + public var GroupInfo_UpgradeButton: String { return self._s[4918]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4919]! } public func Conversation_ScheduledVoiceChatStartsTomorrowShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4910]!, self._r[4910]!, [_0]) + return formatWithArgumentRanges(self._s[4920]!, self._r[4920]!, [_0]) } - public var AutoDownloadSettings_Files: String { return self._s[4911]! } + public var AutoDownloadSettings_Files: String { return self._s[4921]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4912]!, self._r[4912]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4922]!, self._r[4922]!, [_0, _1]) } - public var Login_SendCodeViaSms: String { return self._s[4914]! } - public var Update_UpdateApp: String { return self._s[4915]! } - public var Channel_Setup_TypePublic: String { return self._s[4916]! } - public var Watch_Compose_CreateMessage: String { return self._s[4917]! } + public var Login_SendCodeViaSms: String { return self._s[4924]! } + public var Update_UpdateApp: String { return self._s[4925]! } + public var Channel_Setup_TypePublic: String { return self._s[4926]! } + public var Watch_Compose_CreateMessage: String { return self._s[4927]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4918]!, self._r[4918]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4928]!, self._r[4928]!, [_1, _2, _3]) } - public var StickerPacksSettings_ManagingHelp: String { return self._s[4919]! } - public var VoiceOver_Chat_Video: String { return self._s[4920]! } - public var Forward_ChannelReadOnly: String { return self._s[4921]! } - public var StickerPack_HideStickers: String { return self._s[4922]! } - public var ChatListFolder_NameContacts: String { return self._s[4923]! } - public var Profile_BotInfo: String { return self._s[4924]! } - public var Document_TargetConfirmationFormat: String { return self._s[4925]! } - public var GroupInfo_InviteByLink: String { return self._s[4926]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[4927]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[4928]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[4929]! } - public var Passport_NotLoggedInMessage: String { return self._s[4930]! } - public var Conversation_StopQuizConfirmation: String { return self._s[4931]! } - public var Checkout_PaymentMethod: String { return self._s[4932]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[4937]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[4938]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[4939]! } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[4940]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[4941]! } - public var Conversation_GigagroupDescription: String { return self._s[4942]! } - public var Camera_Title: String { return self._s[4943]! } - public var Map_Directions: String { return self._s[4944]! } - public var Stats_MessagePublicForwardsTitle: String { return self._s[4946]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[4947]! } - public var Profile_EncryptionKey: String { return self._s[4948]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[4929]! } + public var VoiceOver_Chat_Video: String { return self._s[4930]! } + public var Forward_ChannelReadOnly: String { return self._s[4931]! } + public var StickerPack_HideStickers: String { return self._s[4932]! } + public var ChatListFolder_NameContacts: String { return self._s[4933]! } + public var Profile_BotInfo: String { return self._s[4934]! } + public var Document_TargetConfirmationFormat: String { return self._s[4935]! } + public var GroupInfo_InviteByLink: String { return self._s[4936]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[4937]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[4938]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[4939]! } + public var Passport_NotLoggedInMessage: String { return self._s[4940]! } + public var Conversation_StopQuizConfirmation: String { return self._s[4941]! } + public var Checkout_PaymentMethod: String { return self._s[4942]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[4947]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[4948]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[4949]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[4950]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[4951]! } + public var Conversation_GigagroupDescription: String { return self._s[4952]! } + public var Camera_Title: String { return self._s[4953]! } + public var Map_Directions: String { return self._s[4954]! } + public var Stats_MessagePublicForwardsTitle: String { return self._s[4956]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[4957]! } + public var Profile_EncryptionKey: String { return self._s[4958]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4949]!, self._r[4949]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4959]!, self._r[4959]!, [_1, "\(_2)"]) } - public var VoiceChat_VideoPreviewShareCamera: String { return self._s[4950]! } + public var VoiceChat_VideoPreviewShareCamera: String { return self._s[4960]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4951]!, self._r[4951]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4961]!, self._r[4961]!, [_0, _1]) } - public var Passport_Identity_TypePassport: String { return self._s[4952]! } - public var CreatePoll_QuizOptionsHeader: String { return self._s[4954]! } - public var Common_No: String { return self._s[4955]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[4956]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[4957]! } - public var Settings_AboutEmpty: String { return self._s[4958]! } - public var TwoStepAuth_FloodError: String { return self._s[4960]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[4961]! } + public var Passport_Identity_TypePassport: String { return self._s[4962]! } + public var CreatePoll_QuizOptionsHeader: String { return self._s[4964]! } + public var Common_No: String { return self._s[4965]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[4966]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[4967]! } + public var Settings_AboutEmpty: String { return self._s[4968]! } + public var TwoStepAuth_FloodError: String { return self._s[4970]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[4971]! } public func Notification_VoiceChatScheduledChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4962]!, self._r[4962]!, [_0]) + return formatWithArgumentRanges(self._s[4972]!, self._r[4972]!, [_0]) } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4964]!, self._r[4964]!, [_1]) + return formatWithArgumentRanges(self._s[4974]!, self._r[4974]!, [_1]) } - public var Notification_Exceptions_MessagePreviewAlwaysOn: String { return self._s[4967]! } - public var Conversation_Edit: String { return self._s[4968]! } - public var CheckoutInfo_SaveInfo: String { return self._s[4970]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[4971]! } - public var Call_CameraTooltip: String { return self._s[4973]! } - public var InstantPage_FeedbackButtonShort: String { return self._s[4974]! } - public var Contacts_InviteToTelegram: String { return self._s[4975]! } - public var Notifications_ResetAllNotifications: String { return self._s[4976]! } - public var Calls_NewCall: String { return self._s[4977]! } - public var VoiceOver_Chat_Music: String { return self._s[4980]! } - public var Channel_AdminLogFilter_EventsInviteLinks: String { return self._s[4981]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[4982]! } - public var Channel_Edit_AboutItem: String { return self._s[4983]! } - public var Message_VideoExpired: String { return self._s[4984]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[4985]! } + public var Notification_Exceptions_MessagePreviewAlwaysOn: String { return self._s[4977]! } + public var Conversation_Edit: String { return self._s[4978]! } + public var CheckoutInfo_SaveInfo: String { return self._s[4980]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[4981]! } + public var Call_CameraTooltip: String { return self._s[4983]! } + public var InstantPage_FeedbackButtonShort: String { return self._s[4984]! } + public var Contacts_InviteToTelegram: String { return self._s[4985]! } + public var Notifications_ResetAllNotifications: String { return self._s[4986]! } + public var Calls_NewCall: String { return self._s[4987]! } + public var VoiceOver_Chat_Music: String { return self._s[4990]! } + public var Channel_AdminLogFilter_EventsInviteLinks: String { return self._s[4991]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[4992]! } + public var Channel_Edit_AboutItem: String { return self._s[4993]! } + public var Message_VideoExpired: String { return self._s[4994]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[4995]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4986]!, self._r[4986]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4996]!, self._r[4996]!, [_1, _2]) } - public var NotificationsSound_Input: String { return self._s[4988]! } - public var Notifications_ClassicTones: String { return self._s[4989]! } - public var Conversation_StatusTyping: String { return self._s[4990]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[4991]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[4992]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4993]! } - public var Conversation_MessageLeaveComment: String { return self._s[4994]! } - public var UserInfo_TapToCall: String { return self._s[4995]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[4996]! } + public var NotificationsSound_Input: String { return self._s[4998]! } + public var Notifications_ClassicTones: String { return self._s[4999]! } + public var Conversation_StatusTyping: String { return self._s[5000]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[5001]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[5002]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[5003]! } + public var Conversation_MessageLeaveComment: String { return self._s[5004]! } + public var UserInfo_TapToCall: String { return self._s[5005]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[5006]! } public func ScheduleVoiceChat_ScheduleOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4997]!, self._r[4997]!, [_0, _1]) + return formatWithArgumentRanges(self._s[5007]!, self._r[5007]!, [_0, _1]) } - public var Conversation_ClearAll: String { return self._s[4999]! } - public var UserInfo_NotificationsDefault: String { return self._s[5000]! } - public var Location_ProximityGroupTip: String { return self._s[5001]! } - public var Map_ChooseAPlace: String { return self._s[5002]! } - public var GroupInfo_AddParticipantTitle: String { return self._s[5004]! } - public var ChatList_PeerTypeNonContact: String { return self._s[5005]! } - public var Conversation_SlideToCancel: String { return self._s[5006]! } - public var Month_ShortJuly: String { return self._s[5007]! } - public var SocksProxySetup_ProxyType: String { return self._s[5008]! } + public var Conversation_ClearAll: String { return self._s[5009]! } + public var UserInfo_NotificationsDefault: String { return self._s[5010]! } + public var Location_ProximityGroupTip: String { return self._s[5011]! } + public var Map_ChooseAPlace: String { return self._s[5012]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[5014]! } + public var ChatList_PeerTypeNonContact: String { return self._s[5015]! } + public var Conversation_SlideToCancel: String { return self._s[5016]! } + public var Month_ShortJuly: String { return self._s[5017]! } + public var SocksProxySetup_ProxyType: String { return self._s[5018]! } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5009]!, self._r[5009]!, [_0]) + return formatWithArgumentRanges(self._s[5019]!, self._r[5019]!, [_0]) } - public var StickerPacks_ActionArchive: String { return self._s[5010]! } - public var ChatList_EditFolders: String { return self._s[5011]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[5012]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[5014]! } + public var StickerPacks_ActionArchive: String { return self._s[5020]! } + public var ChatList_EditFolders: String { return self._s[5021]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[5022]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[5024]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5015]!, self._r[5015]!, [_0]) + return formatWithArgumentRanges(self._s[5025]!, self._r[5025]!, [_0]) } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[5016]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[5017]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[5019]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[5026]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[5027]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[5029]! } public func Conversation_ScheduledVoiceChatStartsOnShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5021]!, self._r[5021]!, [_0]) + return formatWithArgumentRanges(self._s[5031]!, self._r[5031]!, [_0]) } - public var Passport_DeleteAddress: String { return self._s[5022]! } - public var Passport_DeletePassportConfirmation: String { return self._s[5023]! } - public var Passport_Identity_ReverseSide: String { return self._s[5024]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[5026]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[5027]! } - public var InviteLink_CreatedBy: String { return self._s[5028]! } - public var Passport_FieldAddress: String { return self._s[5029]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[5030]! } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[5033]! } - public var VoiceChat_Panel_TapToJoin: String { return self._s[5034]! } - public var Map_Home: String { return self._s[5035]! } - public var PollResults_Title: String { return self._s[5038]! } + public var Passport_DeleteAddress: String { return self._s[5032]! } + public var Passport_DeletePassportConfirmation: String { return self._s[5033]! } + public var Passport_Identity_ReverseSide: String { return self._s[5034]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[5036]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[5037]! } + public var InviteLink_CreatedBy: String { return self._s[5038]! } + public var Passport_FieldAddress: String { return self._s[5039]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[5040]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[5043]! } + public var VoiceChat_Panel_TapToJoin: String { return self._s[5044]! } + public var Map_Home: String { return self._s[5045]! } + public var PollResults_Title: String { return self._s[5048]! } public func InviteLink_OtherPermanentLinkInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5039]!, self._r[5039]!, [_1, _2]) + return formatWithArgumentRanges(self._s[5049]!, self._r[5049]!, [_1, _2]) } - public var ArchivedChats_IntroText2: String { return self._s[5041]! } - public var VoiceChat_VideoPreviewTitle: String { return self._s[5042]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[5043]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[5044]! } - public var VoiceChat_Muted: String { return self._s[5046]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[5047]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[5048]! } - public var Conversation_AutoremoveActionEnable: String { return self._s[5050]! } - public var Group_Info_AdminLog: String { return self._s[5051]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[5052]! } - public var Appearance_Animations: String { return self._s[5053]! } - public var Appearance_TextSizeSetting: String { return self._s[5054]! } - public func VoiceOver_Chat_MessagesSelected(_ value: Int32) -> String { + public var ArchivedChats_IntroText2: String { return self._s[5051]! } + public var VoiceChat_VideoPreviewTitle: String { return self._s[5052]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[5053]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[5054]! } + public var VoiceChat_Muted: String { return self._s[5056]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[5057]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[5058]! } + public var Conversation_AutoremoveActionEnable: String { return self._s[5060]! } + public var Group_Info_AdminLog: String { return self._s[5061]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[5062]! } + public var Appearance_Animations: String { return self._s[5063]! } + public var Appearance_TextSizeSetting: String { return self._s[5064]! } + public func StickerPack_StickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func ScheduledIn_Minutes(_ value: Int32) -> String { + public func SharedMedia_File(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_InactiveYear(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Minutes(_ value: Int32) -> String { + public func MessageTimer_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPhotos(_ value: Int32) -> String { + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedFiles(_ value: Int32) -> String { + public func Stats_MessageViews(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Hours(_ value: Int32) -> String { + public func ChatList_MessageVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Generic(_ value: Int32) -> String { + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func ScheduledIn_Years(_ value: Int32) -> String { + public func Media_ShareItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + public func ScheduledIn_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Hours(_ value: Int32) -> String { + public func MessageTimer_Weeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FILES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_MessageForwards(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_MessagesUnpinned(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteLink_PeopleCanJoin(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessagePhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_Leave(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_TitleComments(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteLink_PeopleJoinedShort(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceChat_InviteLink_InviteSpeakers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPacks_DeleteStickerPacksConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PollResults_ShowMore(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_ContextMenuSelectAll(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_AutoremoveRemainingDays(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_InviteContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteLink_InviteLinks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteLink_PeopleJoined(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func VoiceChat_InviteLink_InviteListeners(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ScheduledIn_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_Search_Messages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_ContextViewReplies(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessageMusic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_QuizCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func Stats_GroupTopPosterMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceChat_Panel_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, _1, _2) } public func StickerPacks_ArchiveStickerPacksConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Conversation_MessageViewComments(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_TitlePinnedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminBans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Theme_UsersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteLink_PeopleRemaining(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } public func Conversation_StatusOnline(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Link(_ value: Int32) -> String { + public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func Notification_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } public func Call_ShortMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessageFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveMonth(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[134 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[135 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessageVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[136 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[137 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[138 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[139 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func InstantPage_Views(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeletedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[142 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[143 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[144 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[145 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[146 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ScheduledIn_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[147 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[148 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[149 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_DOCS_FIX1(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[150 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Conversation_TitleReplies(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[151 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ScheduledIn_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[152 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[153 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[154 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ScheduledIn_Months(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[155 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[156 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceChat_Status_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[157 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) } public func PUSH_CHANNEL_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[158 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func InviteLink_InviteLinks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) } public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[159 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_MessageViews(_ value: Int32) -> String { + public func MessageTimer_Seconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[160 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortHours(_ value: Int32) -> String { + public func InviteLink_PeopleCanJoin(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[161 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + public func VoiceChat_Panel_Members(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[162 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_UnreadMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[163 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_GroupFormat(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[164 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[165 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[166 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[167 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopPosterChars(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[168 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) } public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[169 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[170 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[171 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ScheduledIn_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[172 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) } public func Contacts_ImportersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[173 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_TitlePinnedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_TitleComments(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceChat_InviteLink_InviteListeners(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_QuizCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func OldChannels_InactiveWeek(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessagePhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteLink_PeopleRemaining(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_TitleReplies(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceChat_Status_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveMonth(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_ContextViewReplies(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_MessagesSelected(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_AutoremoveRemainingDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Months(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_Search_Messages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InstantPage_Views(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_ContextMenuSelectAll(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_GroupFormat(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) } public func Notification_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[174 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopPosterMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeletedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Contacts_InviteContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessageFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Chat_MessagesUnpinned(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ScheduledIn_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveYear(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPacks_DeleteStickerPacksConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessageMusic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) } public func SharedMedia_Photo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Stats_GroupTopAdminBans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FILES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[134 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[135 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[136 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[137 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_DOCS_FIX1(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[138 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ScheduledIn_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[139 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[142 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[143 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[144 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[145 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[146 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[147 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopPosterChars(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[148 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[149 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[150 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[151 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[152 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[153 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[154 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PollResults_ShowMore(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[155 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_UnreadMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[156 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[157 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_Leave(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[158 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[159 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[160 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[161 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[162 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[163 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_MessageForwards(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[164 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceChat_InviteLink_InviteSpeakers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[165 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[166 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteLink_PeopleJoinedShort(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[167 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[168 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func Call_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[169 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteLink_PeopleJoined(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[170 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[171 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[172 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[173 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[174 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_MessageViewComments(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[175 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift index 19ac9d32f6..3278da9ef7 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift @@ -111,7 +111,7 @@ extension TelegramWallpaper: Codable { if let bottomColor = bottomColor { colors.append(bottomColor) } - self = .file(id: 0, accessHash: 0, isCreator: false, isDefault: false, isPattern: color != nil, isDark: false, slug: slug, file: TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "", size: nil, attributes: []), settings: WallpaperSettings(blur: blur, motion: motion, colors: colors, intensity: intensity, rotation: rotation)) + self = .file(id: 0, accessHash: 0, isCreator: false, isDefault: false, isPattern: color != nil, isDark: false, slug: slug, file: TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: WallpaperDataResource(slug: slug), previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "", size: nil, attributes: []), settings: WallpaperSettings(blur: blur, motion: motion, colors: colors, intensity: intensity, rotation: rotation)) } else { throw PresentationThemeDecodingError.generic } @@ -158,6 +158,12 @@ extension TelegramWallpaper: Codable { if file.settings.colors.count >= 2 { components.append(String(format: "%06x", file.settings.colors[1])) } + if file.settings.colors.count >= 3 { + components.append(String(format: "%06x", file.settings.colors[2])) + } + if file.settings.colors.count >= 4 { + components.append(String(format: "%06x", file.settings.colors[3])) + } if let rotation = file.settings.rotation, rotation != 0 { components.append("\(rotation)") } diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift index b9a7ae0f89..c065b4ce41 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift @@ -239,9 +239,10 @@ public enum PresentationResourceKey: Int32 { case groupInfoMembersIcon case emptyChatListCheckIcon - - case chatFreeCommentButtonBackground + case chatFreeCommentButtonIcon + case chatFreeNavigateButtonIcon + case chatFreeShareButtonIcon } public enum PresentationResourceParameterKey: Hashable { diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift index f0affb12bb..91cbfaba3d 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesChat.swift @@ -1086,16 +1086,21 @@ public struct PresentationResourcesChat { }) } - public static func chatFreeCommentButtonBackground(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> UIImage? { - return theme.image(PresentationResourceKey.chatFreeCommentButtonBackground.rawValue, { _ in - let strokeColor = bubbleVariableColor(variableColor: theme.chat.message.shareButtonStrokeColor, wallpaper: wallpaper) - return generateStretchableFilledCircleImage(diameter: 30.0, color: bubbleVariableColor(variableColor: theme.chat.message.shareButtonFillColor, wallpaper: wallpaper), strokeColor: strokeColor, strokeWidth: strokeColor.alpha.isZero ? nil : 1.0) - }) - } - public static func chatFreeCommentButtonIcon(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> UIImage? { return theme.image(PresentationResourceKey.chatFreeCommentButtonIcon.rawValue, { _ in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/FreeRepliesIcon"), color: bubbleVariableColor(variableColor: theme.chat.message.shareButtonForegroundColor, wallpaper: wallpaper)) }) } + + public static func chatFreeNavigateButtonIcon(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> UIImage? { + return theme.image(PresentationResourceKey.chatFreeNavigateButtonIcon.rawValue, { _ in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/NavigateToMessageIcon"), color: bubbleVariableColor(variableColor: theme.chat.message.shareButtonForegroundColor, wallpaper: wallpaper)) + }) + } + + public static func chatFreeShareButtonIcon(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> UIImage? { + return theme.image(PresentationResourceKey.chatFreeShareButtonIcon.rawValue, { _ in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/ShareIcon"), color: bubbleVariableColor(variableColor: theme.chat.message.shareButtonForegroundColor, wallpaper: wallpaper)) + }) + } } diff --git a/submodules/TelegramUI/Images.xcassets/Call/Context Menu/Noise.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Call/Context Menu/Noise.imageset/Contents.json new file mode 100644 index 0000000000..d4b4c572fd --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Call/Context Menu/Noise.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_noisecancellation.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Call/Context Menu/Noise.imageset/ic_noisecancellation.pdf b/submodules/TelegramUI/Images.xcassets/Call/Context Menu/Noise.imageset/ic_noisecancellation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aa4ab67532cbce0407d1db2090e1892accabe89e GIT binary patch literal 4169 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 z Hb)f$T>jE3w= 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Call/ScreenShareTablet.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Call/ScreenShareTablet.imageset/Contents.json new file mode 100644 index 0000000000..f9643c7932 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Call/ScreenShareTablet.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "sharingscreenipad (1).pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Call/ScreenShareTablet.imageset/sharingscreenipad (1).pdf b/submodules/TelegramUI/Images.xcassets/Call/ScreenShareTablet.imageset/sharingscreenipad (1).pdf new file mode 100644 index 0000000000000000000000000000000000000000..5929efeb34f489bdebe0743d49acf7a96bb4c60c GIT binary patch literal 4686 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 E0D~eu!2kdN literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/Resources/PresentationStrings.mapping index 694340cc6ad904f5aa9b03f6ed4aaf60beacc4a4..3efc8144a4b602322ad42e8dbae9d54563a47ebf 100644 GIT binary patch delta 47870 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

O%)KOqIE!qj*@t zzhKulhl&kpYlD|HTgn=2mC0W~FK!EkH%mOQFI;gg|3gQLgDVk9jPuUoDHFA)M<}&> zP%gjjgM$;;V_NoKx$y-r+5buHFZp>)3cmzGJ{hV;Dmei?x@wi}vg=C@!VY>Nte5I| zU-}YAy_0mZLh2x^!LK!Ug-YHQD8nOLO|`nYUGNcCI>kQtcT-mvPibDOn+uBfgV3jC zGN#p-g|GPvwajO!THkSSasDgr^K)|JD}dqiWTV&wcOoLUvhm%E8!O~D0}QrZa^-tK)EAO|p3D2C z6cUlu{S^)I6EV#}&fm)7^FW;MLaoyk*>@hs*m-&TJY>KRa_Kx83_ogpCgd1@XxQaG zqbE-*x79{tNV$^8+(QC=9+)o5upbbnUUIJN&|sq;wP8JmT3aYN`UAN4mrzH@g+s64 z0mVhS?TSKv71xj8_uuFg|H>_X1UdaK1Ajz%@du;ut5sXY`>K|>xGXRH2>0zzA27Y~ zBS-5m3Hb@s_qXKz1cJRn%XpQR#RQEWr6*cHbXDg6gsk}*WyIViYBK_gaEQcnKS96V zkdO-C!82K%sSUcsHHngOm#7&{ zP4%9Z=pFEOn28DVUYi*!CojPxhz$b~2NYW*87HAX!?KH)_BeEiPoT{|-jqG;n=%n$ zAoh)ZNhIsSVckj#lN=_;rt`_;Kf65c6q-lNxjYlK{ucy9sU%}0zrgpHOD9>&VaRv+ z1^ALFLw~^vqPEB{D7j?Id%y5Hz^T?Rh??qBH<@Xs*}2z~p1%U8>dVAmxxqQI>Q_!x zgD}}v(-mJWPY*zzeE2JOs-axdpGI~?*24_0k7s?q2kpjmstB_@HmHVbt|ZlLDwBWX zvNe-+ztP9dvi~Kex(_-xxtFN%@@{*hV`1PL;M&@;l(U9o=SIUJ$1azXVE8 zwI?r5w!8)%boO`dUI~c9A1pnd6PVPdf9xgxjsT6{#tB$=cB;DLU5Cs*4IereT z(5$<>^aq{vl#^PcPy#M9q+U|%G8~59bXn6o?5=njeHrFJACkI}4qD2`jhq$1^_5kZ zxeEO#C3syOgM*u*VtZBllNIM}-6>YCUuNqDkaWCpw=bSD(igLFpyd3?hTSe>{sh+! z3bW4kE#$>uXZxQJL_@;lr`E2Tp?>r{lzy^Q9UxJf-HxQ?4((S|6FsnBDdVd$Jj_Y} zOa1~T7lnBn4otCLWZfgEm?~%DTybGmDbMz(J3Ug){>8LM$&J4l#Aup0DxJa7=5Jm# zV`$evUTuSTXyV^!6pod<|K?Z~%j17TxR0l_j@qwf$%Vh62`7+_L3AAz+P!Fm6SZz4 zS%r8h=nrg8rNV^n7q2eM9SmWxY>*8b#9~_xrYA4-E#IC zgS|&CU*pm&k+|!0cCXxe9UlHt8GoJ3Wpdwj5b$yxyE=r6mv^tTDl16WRqUtpv;}dyuMf zKiPT*Q8gr{o@1j@mg{%l;+1nZxKa;L3+sIinw#`zkesiI>c+Y-pU!ZUSs$i`O6v%4 z?s{n5YLnvHux_WR>d*Wb-gxR1zTmuZ0A_H~!ZK`XJoF?Au?1{#x`_$amERg@FheMV2k z%u*XY9_H|1FFos)$BYRxPq0V0yY-&v5N>V5bo-v9b&_(NYLv^2wmVQ(>fU66&5kfR z+5SudZ)4(m(@%nR;Th*i? zt1hgHhRzH6HOqXjQC6-f^rEb#M#vtD;_Ng~cJLOij*WeZ94owZ9KnIQbXG6Rk5x?u zYK)-GME5@G#Atwy3hl#Jq=(yNn*+{`Rzg8GyKy!ADpl+Fb%}y&j4hpJ$?Vs{yhW)| zAt1gEINsDxydH-8>H1QynyGHyU;%KYCk5EDK>6KX%_Nz(5Y>IkMZ#Vo6#DPsYNnq1 z9eQs-sEb6u=}R<1@Tvg}^*yQ0kNbUUI6m2BM1YBOA0(aa4gVlf)&-zKdx#`9S>Mv{ zn*nUrkud8Yps8-sG0Ob@0g_=0<^-C|gpbJ8jdy@+pV4EcO>j7SAItbalVCmxyMKF{ zJQ`@C%yB!5c*mYjr}(Ly4K(RUxtU^3^SOngDff#Ta+s^{|!B=-=HRbQ`~RmPz}?q2RqDih(^p{z5n`&t@|zt(ch_Y@h)HU5!`DG&l|8?J$OTqa=CiV}fho9JFUv(Y zV*)WD?Ey0$`JKK@RgcxMumaD#P!nq09%&nDvfTl6kn4}ToY#ra9n;`*YTz4t2?8ls z>KU342BqD5^w^+^C@;CPC6Y7TKn_Rp^*lKrNskRB zD2l7nNOGcZ;nG-&qD*bmgvH5+DCkia$aClc`C{@G|fETEicB(l_;)7a|w?& z>E>pS_o*MEq)W63b>G65Rb-te@Hql209OlH84Yx4=}~9!YIYe5z4vLfsbgAsysiWr zwIkZJ@py*?M@#(z6Buk|{q{h#^~maBxGI?)V}e}yvLwdjCbZ)_3LpIBUAJitC#1a` zjxjae9VoZ{qdomK0BA+vf{v0NYw9DN?itH6cb3VqCd+j3s4H3Giv-lL%J~YHy2^oA zM%>NgxEr;;HOt+N76@iy8Sd_U#7ZN2*VXIE0< zb$XWj$;CL6>F!TA^<@75BoNOfn6N;f#=rn6i08-+l+t+i?KatrV8uO%x=C{88&|3| zry0VXQXBWn@g@#IvnPR?cSxHA)7&*oW+a$oGu-1{^hlI<*YiR0n0jR`qJs?Yg`M&8 zO#+8;q+F(!dz9^Vkq2Gy+(ZEXozjYU;El$Rt!(si_I_vhTsrWvzIt*UlTqjS2pppSAwawL6^}noX zN~loZj|79HH5w^sM;0V;OQy)=Bok-KJo+qi0-{WnCz3e()8t^1X$Z}DJ;^jee%&yc zMV~4CleuEEWL~n#3Yq`l_dN3QZ1`{qOTkb5e9}omyh1$ortsYb z(jx_kx=<#jm^%53d_9y4GKgw9hPX01t-C1FX_dQu^odX^6bu$qAzR~Z%Ec5D8+$j& zf7l2$(_WTHaw_A#SMpO$ntLgA>i9znR+q)8CK5_iQb8ljac?mNKvB{HrpXGTxF$sM zic5$1%t$jCu`7MuR~S8N_p9{QU<00J;__EhgTG1}$^*~mfocr}iX19hcbZUITH#)8 zE#;V3&yJDPY0w4tlgzZ5%o3CiNbpL{bcXVPbW8_0t&=;`O|Dt*v0PvEq~_MKh(ev{ z5UlL{NZ~;_m(C_{kbn%@ZItW`VBsd|n*j)YSmtGL54JGV)JWNt!QO0@y&3HFHn~U% zmfs;YO#<|1c1L!@W-z*00JLgUg@) z)`D`~Pj;+#ONRu#fmIHW(sQhSq#Ome+;Uy(*YsipPMEIMUiT=Wk)g51rDtuW6D>lB zl8LoJP;bh@+I;>k*d!~Atq%M5vAn83pUAm7T!iB^aWtqVErcM*tqZOEDS3YJQTsfd@n^Cv z2hcaUF4yF9xu-4&$p#WP>f#9}fOu++xQ@A~6QAB}Rfo(YWqidv39 z6RVy|fg-+^pX+gyzmd%PptEnKbA8UscQUg+RKs~$SKrjH^%G71sUcz^sACPz0IFP| zLacQOakajwp87LMrN3+~eN+A4)*zom1oNi$bG(!04Uv3lpOopdFxdK}kFST!d@ksifLGxSX~2)E5-xW%fI@+cJNq(dZwsn|#)L~R-MvE%IAAwH_-1;8E@cL@G1_TW zGMsCflV?08AY7UMjZI*93mfnmCB<0@*3^VdLP{DF7j}?ZG+K~65 zN4hp7GhB)rLViccnug%L*#wHsZddkWHLupXo@9JC$^j z{jx^7)GpJ=!Gp4Dg3W3SyviVr;vbjI8@4(us7o=C#Vm`XrtELbS;>@>jUmRe!X2_2 zBb=&|(gaE%TXLE}Z`TR8{N+2FKq1$qFZ5~f?YN-{*RmeTXtklO=?{uhpR7tVt?*-! zBR@6aLD_)vq;j2;0Kd{yp5!-WjT_0Rrrh18RI2A4Kc=Q^ZwjbrCVR<+<~-HZWY@fz zLivi_A~=wwvkiK_+;Dl z&4HHrG^^k!R+YBRjT?=}PR*h9+EYgK$@>#47;l})O4Wx<5OMf?zPGx_zUCZ^ZgQ%* z$#NG^Bhl(!CEm;nsC&3-O(X_5!u1}~<7VpgqE5Ct!WQq%Ceri?w=tMJnGtg6W)tM@ zOL3BS|7l($71GOo;=08&MN_f)E$q#JaO<+B^AyKiYoIK;#WXXwg{$CH8MM{{X0Q%c z-Kn4&dy5G)L&6wy_6^;-Z%?~vXtEb+Lk1*MhHW zp%u&NmcWN`>u=?Hj}Nzs!M%7wOSfCWgA=8wl}Ym+ULO$HsaU%!3HPQJCDib96ia32 zt)QVvj6wPFk#gZyh~>#7YpeC3WVHgaPmx<%aplXjvmEHY)vcJ~ba_ToGvu89%#^U! zCdM^eYPAMF&C$Jx@}_l;E{7&_>CvaP@L+2$;(XF+j)KII)(mukoTVXDpQ{bCT_g?L zn6#|BsAONvY9!jeOMbs$`5ih8>(Q}CyN-PnL@lN~#k=6q7`d+v2mNl@)P|+FM_y^e zhAfdU+c4;RC8#YOFO~XjO}tqa?w9{ZxtG%%X$>L&WO-Yz`U=v%2W;PdUE3EpA6Y5; z+tTYAIY&QcZMZib)uEVtZo>W2AfFF;rC&aP{Q+5!&$6tSNAjsI@+Lp#p>V4ut@4i` z_8hxK-GmJi(vCVCr9nHEZj%gcXPPE%=IctHI*gm1qn*%{Tga{H&0m}%@3({Vwl&;Z z1U>O(@cQ%_DkID<}S&+x& z)AlfVo(Ojwtm5}P1%j*rKW0a`4F7>e8Hq1+$g%0h%G zz+#^*O~d)HB@|zg)K0J%56CT@0JX2mfKDvi>oT(wkHR+`z`Cb5jEV!D0Jv|;kxn4K zx8$!*bojQUbv7-{yW!s4ZxUoiXU6%yEbGiv4)cu!uy#x^`fV!z(m@`P!=3rWQTd^> zX_j@2DthqB;|Jtg!D@x0rw=G^qy$y{P<&6{BOA9BA+QHw0tX%Y*vu5{p0~vimX^g${FLxtU z`IjUKu-PI~PIZIU`-)^uDIE;{bQc(p`)ln>)}XLeo$zV)asI8eDuAB-PKpb727WIa z3!taY%i#jx$q!VIv+j?@(;aKmA0@FnTlbT+>Ta5(UZB(xO4f;@b^Fna0M3Ln(79Zc zHQjjtT*8Y$B&15v08Bj3b_eqQ%vpu%3G@Z+{zXE101|%D2@N&u=8uQS{s% z)c@VTdchj4#-WWb%dQ?=kU!-}4|DUNzZl6s$rl@mSBLR8MG$FKG&Ga-W>wY`9mx?^ zap8(@0zS-=Yn@p5jaIKxnk)q+t|Y&U%WL7Xc`R&-r9Dl!`#R+@_EuJ~d2Yzwo~Djl zmnB`93{k$oKlPdxoOQw?dKt?jdd`pzhx>O>J~Bqja9U5&-tA1KsB z4)j+RCH6&Xry4u}Y}#Cs2GIHzTE|N%Cd8H+YC$ql3FxRu6{Z0T@I#@?){=q*i;K5& zVcoZqbR4RI`T5g2BLq5nSa02=+GygZ4(sCxb!mqvZF&Ce=NfE|Vbb2u|&Umxp6H1U|@E z@?#ugXzmbhYBA|Lju+=ghai|5Pg=D)BfY%}+{EOpCZ~p&z@!Oe>qR0Eo32h#$*9~; z#ZJc)#WmE_G9?l6)U%AG?NIOlOvRyaS|`cup&aUdKjyIPXw%>AV*Tagld^cP@|>8aOmQDW$}l2`;We_w?6Tu5{+%Rkq_ucVgcDdWX(Y%VTedpOUQRpi%~;a5S` z4;7jCjMb!-ZJ}b~++Jlx#15J;6;8y+(&>&v!8P(x5odKR_3HY?GgK}g9{I`c9Y(N8PFp@XU1}PXx!;Mlrk{NEIVVZRh zbukxk_~b~g-op|!#v}*%ZG<*+gH=1{w~^4TTg5#Ja&%jSGJB-$D8BL^DH>%Ox*wsd zaLc^1_~E~}LF3)|fAZld;Mf1;&r!;Bv>=wK0HaN`c`QO-+}=53u;CmHJN#C|CoF|4pQ<11!(o*OST?wvJyU`ALWHOSi2JP{#fQw zZa!fusj)=Ca#U77rFvcO>XET>X1qyoe?~IHa+Onix!e*r0ea~32*(9duL+>l6I6%; zp5ma*&;B?m3nst|J4F%p$=C}BYBmnf`n0??fh{~EKk;MEMtD!RhzU`uf)Q3ZXZxCb z9}L%?6G2X2L`cyBP=4BN@W~cV1jc*2!L+ddHn7rRpmcF*zFRD1MMbB_=E5M@sea;wVx2b!#nY zrqzD3-u7bJuYaLKuaBCQ3OQ z{{K>}d^H&)b`v+OS@{{MCh=1s1*$@tPJ!%oM_M7HMxJnVN~%T5qABo$0wQJ46u3o! zkrjmDl_@5!ZFPFnE9=N?tos3VYgP^kYWRxF14-CBU7^+!9I4pC(ai{etvZF{JZFNCM8!^Wk$BT4$mtNv3VucAmN%cUVmH!X8A8c%~j;~3dF z74Q=)pG^hs#EEMfXevI^a=rSEcI<`{q%XM~^@Y=@lPr%-12d<{;c1*cOkn4MA>ktG zxl2ytD+)C$!6-t5I|OCAw4QDfO-7`nOk6VE1eltU8jmH#ThPX13Exb#LDkp9{^?*_ zbfKqnlWIr$9m*(wKhmAeM;xjMo6&&kK4(~UBJs`Kpjsoo4$@jZ13^PQy9QxV5UfXM zfI{laxfzJUa^$ZWOe9y*XPP{B11hBg24ZBwOzPyxyqSRIhVuMO7PXOnO45jo7p!o- zu&4Ikm_aUKkPBP8aOyMJ1o=;Y6Um#!Rc>m(%j2I#CdM9K0pTw$mEYrkw zvmBjeTA5ooF+&q8P85%8buFMytgH9r<)O#(Rv9`Qh}uf#&1U&pL#BG5>5wH?v(TW8 z?3>LhwT+bY2g$!S8_1Q<0Me~oGjk49bh}8U6Qp1cho-&spTjUZ$jmvwkdCrxj;WQ@ ziTX;T`FvXELbR8wb#<20bHMXmr~!B90tSoi{Cvr-jDAt9bexMMubT{?3xF<=`{uH? z-R0T245~+@HI%qG7yQsu0_SmH`bu5iK*Uqz+%$Cer`v45G_|U1nTOP20G^9gdF+#U z0RDk;X&wu8o6}P}T-!Ciokk8D$v(~euz3*qdh7K)-T{?x3#!V}Yzl#G^yj_bk=U?u>Ml zg{*N&pd$!DT}uiVLd1-fAqyd<$H|<9K(q0Yjsq06!ticC8)%s<6C%A~g-Mdu zmuJr33wa@zuz8Q*A`~qN$yx+6WilVmRs51y&GLAs$fQLupQg&nMT~r!>|A7O*PKBm z0G%ameNkp{!|#xImZaVV#F#A|?lQTFbEsiO36?ZgRdN2KP3PP5 z66E*54%3%g>U&Kdy$gzWp`5)7_`XOY7qh2#Nz=t#mc{hf#2>Ut?aHEM$zl_lcDHY! zR_V!dX^G_0zYlSV^?WZO3W8eu9a_xsyjPAd26HcswC_F}x^G%pzgd%f%H_)tgRES_7HpKKmjHJ+$*CnKEB#?UqX=0E@_&VH zE7R|7mYVnS0^3S8;@x|I!Q=1cnr|bW;&;7O-Darl6)pO3Ri(2|q(J$Nv@${dbVzXXS%sCNuguY6a4V-qJ3m4sZ2E30lta z-Xqz|K|e1?%EEl2a#&Elm+Fa<`T!yP{1<(nY+cTPUy&nJhrGSI9KEwwBjxNxSA0ZY zuye^&WsW)Qyw^Y~w8E(-lV>c2VsV?kA##9VVJ5VSqf2osx)jg`%U5&SJaSpzDtsJjd ztEXK}yN#%#%E+>6o2lNWBT?^4MvWfD{2jJ5@PLTK$lrPtm*BXxOwXvcS3uzuK)<1e zT&Ax{pR*Jk5cXA9jxpX#AEFh6x1B8}BUx2+wY6{B%2c0%`jKr6zh*Tnmmu4Oy-1W3 zTiJ^w8N7{DvON4CWhpq%16HT%ykTqr>^x$zqf95|cr0RMwmgGJheoW_phS4M znyALpWi_kF5tm7nHy_}SvMF?8atE%6gEuK3C$T%_bAuMK`fFNlVeF(@o}F zG-WhT!l|X%e)80LqfOLs)iP+dxdg`M|GW@vqu88@Qo(6TYW0(Lc-HhCw`+j zM^;6lEQd_pe1C!6v$9-Y{mO^VmNbwft67*lJwdSnc4TD@W#5C~_C|7WEr_`>-senu zaua&ceXZPsFDOh?--*$cN>gS+@#r$ue6pw92OP0g%I$z%baN@#2oZiW#pyEtYr>c) z%qp`haEn~p0#~9%6}2mhNh_azOX~h(N|uFFcB{191fXr@JsX7PNo(|aXRU`!YAp@# zGquv%&?uIF&J)GY#I-w{Kc=*;%wI#}d|9;)g07uRT!)p8?>M!uQqDZBE*mzP;A%SV z4pqFDme+FYe>;k6o2i}HiQesXtTaPQww864>+3jkU1a|n6Faag^&DzL&%ASDyOCE; zX>{zD@4FoZauLt!p!M@sc?16hlQ!}9_MS2dpmXu8`Dw(RGbay@?jovi4pNcOFVWE>$K z9)M=o5JfREc^!Ixx>=)iYtyizPJ7VA2lVPv*srkfolrh4HxIx1&!S)A&dmVLdcTwaG`DUu!?`}WQ6+;N!I!|tmTkWxkEyJe5uL1DvX*a`S4F)NGQkvwy%g=O|64NcUGeb0Qp+InZeeYyVAT8iK06WxnR+bckLx z-|9@2`S$}0r^y2=O?skgkm)-6VS}BDK5JnakB4yXJ5!$CfZl`RXoR}!F>fi^Xae2p zg~0)7?%R=2&5?)JnntN}wITofM2Bzumh78X#p>o}EAM0gn6zv@H5IJ;KW@QK`B5Rx z&V%gXLfO0xgttg0J;bo@vYQq(plgSYg?$&(Hr6`+O~)rx+1(`nKYZYu^*vIu3d(

B6>A+AGEnONyfkBSx*yg(^#N5{v#nz}yJrn|LIW9S={#UNIJVFg8^BUeDO*>?N+8|Z+j?;`{AlqtQi|EgCts>=DIlacC0kT!pmw z|EN~engC}z))78K;IjYu+WW75IS_wT8m?vO9+P2Wk|Q3cnj%z7Tj53@KMIh3*$y&voBzeg(%ZJPirQO+;~3N0vXvjyUDB3=`u_ll%rZIv delta 47551 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

>H_tUqe-To>E)HBQ%q`@m1SyqA4yGS>-tJ@ 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%0AUJW1a7GPM(Pk->G zi5t}ep9B`tZ7;*yL-_WLqARkl>>R(Y9isG>l@rNEiI;K^Z(@Xk)G%H6fEpwFM**#< zg@9bwIpNT$$%Hl_W^o7X0+beu8y(sx-bTsUpe{h@!fpmY?*e!>^l&Dtz>;|LmxjMh z_Q@O?%5s*H9HzUx_gRoBpMP=9R!p%pYH+i=V$i9XR@xJL(ldX&< z)Uq6!b{IJ6%a6ZN*obJk1yqen{&l7Aj%*jC4aX1d-s>YZrUieCk?al&8bTn=MeHai zS`6`L>BWj8@zsld-iOC!K0&OTd~f8WSu?csYr1sx&J^ z2Rx5eCC@$ZQAJ8#64>kNC&fNJgwbn27p}_+oGSEUAT)m-KM#NT`Pc*tKr)QI92Ads z_YM8_xQ`vVH|d}WQ*Dp(!XYHBiXae&h-?@XDSVgqSgXPa-`D(lY!OzpkW)AW0ilG! zt!ta!lSqj?lAaklfdt(*%X0RrDG5Wl$wZcN$(-=65hJCvitAAYB~(nhDJYnQx4%dD z#S>EK8HIoExoxOux1uGvA6e)wlzi2Qg{3pXJ(b9sp5mIlk2_jUtd=*!gl}yQP-#Dn z$*ZeQ9%1rsKRLXnE|7;hJO=%pS^=wQFdIi(A&yWu&Bow}(q^|h~I_d;z>D5Qb4Hh8JDU7%2dA55M`%>G76qz3>h` zC-EHT(?TFFCimmMzk~0<$V9aZF)Ox>iW#c@yB)Jbx>;bmZfZyz1b!ZC{#T4V2+H$t z)yeR#rbDAQczco%P-jc97cG?eKURDj-_~@((G8B(Nq}0uK9`A44{7kOz|GKndm~E4{R<7nT zrPu4@PbY^UC57=43a^5cIHSdY5#~IReS9Z8B}|3}twZ>ubnc++kRJ=L_rc8qKlp z|0ZHjm5t>ObZ2HwpsBWfXQITheLj@o`HkPtN74XOxnRLGKYSn8qexs1`e^wm-eIDI zy_4aB2Hd-L@fM=3?*Unukz*?i%hUVRlF;+IN28 zZ)EvQa!}(#-|DA;gWoJ#9vErOpHRlV2k|w&A{~@{yX+}DyW(J5<>TTEUs=K1K)%rC z#r+us++2>b@|`0u?#3*ZbKoK?#~4H!ir&ONJV*Au0+isa0x7T{oisEHGu@^~b-bk3 zc$8RBC^q|nkfU#^uy$5?RckN1uJPLfJQr%X*!~$QDbvSyV%eQoYWw(85$}s@Nxh}Z zj-?6Pwe@v)e%)`gr^-pY9vKd(4&}wZ{l9oSY+B$3*crC}{B{J9iwB`;CDQ?lM32#Z z@9>cz&PXSY&;qKKRCC=_mAZSGe-eA>r%isWI;1KX&CiYZVV52V-MDV&{Lw*(^Wrt0 z@AOre{ciYFbJT!Q_d6=jfCfeH%($*s|v2*?}*LIUpZgAMnF-R+D zQ=52}O4LS!{2JYFQAE>8o8FH7x~QJ#zsCejJ)Yxa+BwI%V2H={Pv4F)La>j6Y>x_0 zTQwbaSU4)`Y`b^CYfRtMLF&NMYL?+hE1K2?c(Rgd3pAW}rM2QfxH$t+IFxU^oI9^- zH2x6YO^*xyW%bSwMHin$Rj011yRosi3Y{&Wj+BE}WbcLJDF)Do`s^NLQ*GS^UI?9h z!S*W3LhIOkRqZ<%zl*hDWE`$=csEnHTJ&$V-co=9C3GbzCcE0NNyJ0CVODU4 zbu@-ArNMH9(6zg5j3u-YB(W=wf;mXY!pVtJC)=Y-o+i;o=sjTNv4bTvD3A)`j0%@1P?5}_N+1a&xK#WbIfgog zEOnH2*J9sl2 zyj)<|l5MjQ05J+w+ug%`s`^o_8?}#&xK}})m7dj;j&qeSeiVl{z2J@gIbOYXXFtDu z?Puh>z-ik-t**G>AZ8lj+ICsF;8$!p)ALAEBGoCM8E1vj(jbp8~n?cpvI~VH_>ht7COh zO_L_;pT^f~fglQ|{PDd)cO%%Rhy}|EIJ;^=msN3o!Kv?gMU7yka=b>h2bFsYt*PlT zR~SKB`vniycpg$sF3l|vA&-O!P?tlA*ic@nEY!?G9h)^4q075CQ$cCYt*r9Ds`iZ2$+#-Qk8L&M^ z59f9dAi~t6CxyNa4|wut=St5+=om@U7V{d)h9J}m>g0OzpB;`R0A(xOqe?MU4K|_V z|J~rM4-l*o3Rf=+3nG?P`9L^3aJ(Y2da-JiG`>4MJwYG+XIWI!D=PggsJ>QA){?vRLNhl$3Ie{6U0JkJXY2@n@PH_TN*T3KT-&ue`a$&u37 zHiUoX7pT;dZ%x!yH1s4%g}<5iC;SuQ&sO2TrNgvKb>+|>&|y(i_+`2K=6X56&!((r zrJ#uGLLx`N*a|Zt24pb`kk+aEc5@S)goLqh^{ z1!$mcCkh7Vt|2nn5b7-g_IL44Vo-h=D})kl%rl>jpGC(mR> zv1#%UFW2n9qrn9*h|mhp4(z(5qEq|LEhlXy=biu=R3rO0ZIPS znqSuQKoev(V<_&Ue}|(N@IVEf;mtn9yQ`Lob~|x=9*U5ed@MqILaCGb&9MB;LNu?~ z=Shxgog%P!3^N>RwS}x@v6XPx=q)VEqAk6yw@t^hzo`Pi52lOjti4wW!z#De$JYic zVduBhHF4MXyK}==`eD*+yS$&H*{_7P&#(=ktu>)t`~NH>KH824Mmx)G*=)Tl-YS+ zM+_aMHEI}_5L)wpQ*B}US=0pBYCM@G?xc#+bKli@k1F+)tu=thA)UGch!p_UulAR% zBc5RVO9kpnT&Kyr{Qf>MN;Dh#e^gw#Gp=!Z=&(H@bHsNa0Pg&|Jp7ssFQX0-2I@Zz zx63a0lWKLFOg|r^ir{;VMY!X>t<_maENMxeBz9JKoh!u`6nnIp3n;j#i?v3_0`~5L zZ{+pOTt+i|+23esiENymPZUpKz4qK9qzKY)o!I*M$`1iLLS3)y*$U~xqx@>$W-AX) zCRyn&$O5qyO3~zazU{QvS@Iz4J_r>HjE;+drPI~iMvCGW7CLdzeY~tABof1x%Za>j z?9S8G8bNrLjs;FF5NvkLPW6JNi?YM}mkj)v4zn1>YXGy;(Ur1B+VqeR@lq*=?QfNh zYr0c0TfyRE2c^cfikFF|60uWp`bzyx>BqdYm#Tb|I}BvjdrC;|1Ug+`*d(-zDN_<( zGsOQ6qE5uV4*YdLNGRg_@#-)U-96_tB=DP*wuu^Yxn@};FJT1D$=4NomHW6KMP%#~W~oUPGxv=V}RxSi&mcwXwMe&0Lqd-LL-)gqp5a=(!;V`BX*ksH9U zNC0$p&QvP8T*(T?Mxw08p+C&s4%WPSiK13=5hVcYUm)S_ureinm+_PQvM;JzGK_cn z|DrCIl<}{Cug{#mYjZ%0ookl?y*b@MkVn?*VM2MwQ*A$xen2t0SR=POX+tDlN_y%7 zL}_RBRDQJ8UFtr!xI`0--#yMOe~wtjs@kC9{Fa`H?86PLKODio)bhzaXaGOTw(|2KHwdvb*z~_jg1n+NF>?K#XMhp#6A-uqXon*kkxJ+n+1+I9MWi} znLOEFiRXT5%Ha@5@z!Eo12JHA#ZI$fN0xRcDXS?kro4C}6_rrEc2mhDjGKFp9Lz5i z`q->?Q5d!qe3in$f?TScnGsCb(R@9p$DZ|_@kRkBSh5^ArZ#;%)1OUy%RKIJeAhy8 zu!Pr#rfm&R6*;z-pCSX0GXPS#VIjGxdi{?B1|hdusll>z%SaA-0OhiAtni4I!>Az8 z2`W3t0rWgc8(*w{VhNfB|Lgm^RZm3}d#$%5_DAMWk;;;P=%RA;jFD$3$Alw8=ikQ; zTlrCv^4It3GSqR_U2zGpa3$p3-it2kEk-tCZp@acDq$Am%EOaNt=Mx26nr*q&m!~{ zE1^EF8fLOF!8d#GE!o_LoVTVz=k`OjvrBMKl!EhT^-uGkM=qe%(|0+`!lo~nH}CS; zTqMfX73qi=IV@~N5|+FEb!4*=Qwjxz?MSSnm8c0$HR&eOTMC|a^LC;=!NK9+8g(#z z<4uXjWhCD^+)8`iH*1KCO$hp`CMZpW)y*UiD27KFEQIHd_h>pDKT>AqCKiAmnp{eJ z(hi)54~v^^l+I!|n5YCjOC6t(-fnb3JXy7O&fK9of{dA_F5W%d&my(NIznSWrBQn$ zR3F9YfN?kz!8_-C&A9>=V}0KqV*MNIDn*oC*g~e-me{K3YhmsdBA|$2hM?;!s?`o) z9Fg(raEJYjsbdtUfmAk!0XvzJWiX{U`7dQC(YRR?GZaWrLujcyVHd1i5|$E$`9*WN5t z(siETMHS>TjEo1d1}6vv`_X9Is>Gz3P({pNf=!`!vT1)^=&s9$`!Q=(-x0htCvyCZB=~T-nzEiB zQum1TQJI~pMa^mx+qjJugf$e~xO^9l)IB?_-Kz5Hl%(UQmiTqN|CO<3gNea%UFRYy zPMzo@R?e|vM)+qNQKy$`UE(oO8&TTJ?wJsG%zyYdJqte1e<Mxrq=_8LHRaf{Z@y4I94erH z#N-ptUJOhWdg(fq+MAT8;iaS(W1*EEi3x@P%BST)5QW_j$|Jk+wdp@#5uku}vh=Iw zVb;!OzQh|uGL#x8B}ej5IEP&BHNA~Dk6!(>n+DjtlcwP8rNZ)N_d8B^nYoO2nOTA4 zefm+Zs^07h6w&x?lBEvm@GVZhmCKcm1Z^B>^Gav@58~R%2RZkg0kyKBTqNZrA`22Y zpu||6$dj1Dd$J~<`qvQXwJG>$%BPA10Ib0ZvF%cHztxy`{kX?MTFG|KBn#J2| zUHSCbSGw})y!7emcmb-uk&qw3&0TH$EcgfO%%}Nc40NTVw0lmQL_4#KqQmV%qNildWm0w&z|C3~3vg8Wvpb=LLQz49 zIPW6Mf(Zs-!~{U43u_W)KJ;ePEa|FADM;U6h$`3pX79Jh6SN6E`}xz-SKyH24qY!{ zSp^^JF={j~Cdu`m*q|fZU}xl(3%dT&c z3XvaC?l7tPw5!t9A>_~6DbE`gnD2O0#Kzl+a`SA;hz03%I4jG!?`;Zr7FG1oCVTAm zYBa?X4CTt@7w04IvqsHQvAEhP_XFk3^%<>Ju=brj&FT#S1(h4~`RBfDbcOQg_3`s3 zm!R$dPYM*K=9qkOiB$NVqhv|uwU7&8+zgdPMnjd-(2NP@EQF94O7`j8DQ!NwLHCR? z9L@8c$XGLpiW~4EAud;)kWnyaS(KJ3`bKZn_~*23NRiL&+L3mjvel>TegvwgQ;*kI zs%*Ge;8lB*5F3liJw-0+b%4qwJfc8rkSpE2H-ft-(p6gxonL%0gaueKF84V(rI1Ir zIbM19Oyz6?Hh|QU+T+`8Ysj2esyI@H9Nnc?M`#09EWN4c(R%sbae}Hn#;-Ol$FjNJ zb~Owy6#>^a3O!Hl-olrV@^lr$R1jE!M`!~s3vJ01YXNnlr+GY}1qw7&{%|n8SY{HZ z;0fI0^m-~YbyqecFjt{?AjDJE0R)<&PXHq`ITkJZ+on5Pa1vZTGk9U{%M{gTpevG( ze6E|QKZMEGv{j3=e$}S5z^i%Kzz&KkR2RPk%H-^6r`YWyxVM)z;!Oof0jD3aEw!eq z{3Je1Yte3$NAf*1)k$LE?uwyJK8VZ2w2QR#Pb0DXHKx~&Fc?5M07eBRz*&#kEHO&l z%uicz(-zOL$>_d@BtsD3a~LtEx~a6Xzu|T7{~a^%^fI)>3s0t=y=|BAyMI!s{rGqT z7ZT+yHF*Q|ywC5M`E3$2`*qXmgnaYUYG>HGqU^}HrQvx)aes;i>Lgdy$yF^?Oe&bL zrkxEH=+uq@qop^Q1%#Sd5Lg}hMOz_JTgJai*wM?%J26gIlQvZaS3AqCD7odP^YOp> z9a%hr$b#(7SiRD#We=V??k?O5j?9+d>t@N8VsvFLzm&PHd4A`uZzhK0qUrW>yZ=e| zKUwdznTX3V&izLU9QEI70M(aupn0G2R-jI81KH)LO`5mDNvVgg55dO2U$J(B320}b zFh09_PryrWqFqdg_*=b{igch-x9Bv`CNB=ck~%iWw87t2im`F(uI-Xy%JSao{m}lo zlY^KPj4#?Tc7UM51T{hb3iZjy4aEJ-^x+6+uE1#ZciI<_+Y5yL_QJ1lMFpk5?3+TS ztJ0!E{NI6s+Gr$=9b5p^X@wSVR5)3Qi&5ysoVU22j%MUK4PgViFyeD{J%%55v$AzB zSC{%(n|gC`NP&@MwAed9>hmto`M|aiH~EmL&egGa-E9XQ^F@HbT?(+YyumiDki*j# zUSdPQoAe$)cv+8o13L+jRiOFh!q((#$CAAKz|pBizV2-mwmeWR5k=+gtE{i+t;~Dg zvRaM4<&yB?8B7PZVB;A$tvPk=qg+fVkwYBY)M|_}DqR$vKC>DqQ#XZmb|K`vkUXT; z7e1D9yOVq)7FdPTVD>gS&|v$FpMM%!bTpRQrZ0%bQhdn!mX(Rl)M-7Btn0_&*B`U@ z^qj9so77z4#Szo1WxcDgBK$s4hR!A-92BbZZz}&r`+w%b&@L6d$lzqSD!IsygH#bo zHQI}Sz~#ni*T^oqNE}N@e+m3JE9#JVryfppDy2gZcNj<38UfRNyK3{rvx;b9O<=`< zCBgg<;@hm&L;DorRp~$d1X)*?QMqx`^o|ef@cdrkC8abrE$>Ofb+{|R7V+$5t$C;D zN6iI6j~;IepD5p=)XGpI>}lD5a(7B?-9#U|N+EvSd&ppPe~MgqWB+I)XBB7tTQI2Y zs&fBo+H@6$rbWP;$D`2pt7qo6gtt9o)&-&_EYvov!?h?exM~dd`G4_>wfk?pi#R~q z3{H8CNc_HDXc6sNHu1`kilukLOYWM15ur7Qt%j)!bStitbHhT`DI{Y zu~(WZame{bre0tKRKKg@YG#$Dlkvz&(-Qcgz2 z-jE{Sxq}?Y3ChIV`j#zP`)LW3ias% zb52Y%gC_h3A~Fo7uodduh_?y#9g~PVtj~ESgh#9lWr47;cA=nll{#A1 z24!9@r|qeJ0B2OK**>zulT6Y20_^d z_SOXKsTev)1`f*^R9HBB7tG($sjj4J9Lqxeqk2_ zyOz(t=>8maFr(0`AsOcvuTZq^U$fihI63mnTFK%7I*G4@1xpsyHV)H%+{ml-Wyz8v z^=2Ww#oZC7RW6LJS&70Os4-==v$66SO$u`tzScr}t3MBLNmkVO4?y78A#QIi5sVL! z`_VBH>p|=k`F=uL-L82+*ngFI@(4?8<$6472tJ0EM4xdqC!sJ$bgN12#%(^ssXihU zG8@IPX!Uj^00x)|u8E}IvyGpHOIJX!XxCXsyX(iU*{ojO#|UVgg7^JX1}Apm)Xi;|~)oPUaRXXzfU5<;LFtloId zjkztfi2CtH^oNp3o~>~x){cX0yPNn~I!T=U@{j$Jt7Gg_*ypgPg#;^+$VJ2vdFuhTD0v%_N7#Jdj;2w*6;r=M(5* zOFRn_7s!LhbBU)!=W1G#%GsPe!!5u{D+9m+IvTMx;0Y%!@)hWz%!l81~pZACDm(inQ+5ZAuxP=lt&!?GEe9Hp7J3ueWi_PJYQh zg_5mQV_^=jgc?nqsd~)bq;VL8a(iQsviE-he1B$TJ*yGW-2P+7?@(b))jc&<@LNK*s%3Y?Per5=(B*Q}p_ngnuqW$r@=Xe6BYV3K2 zF-?t!VVCYtc*XeWCmq(z!P&(BZ>1r$WnTIr>GE5tvR~RZDvGF}r7bW{i&fX#vT4mp1ni?H4J*HMzTaaANr~tM6Dzddvxf|pF^tny771n4He<8WmM>k#nTYzOIFc@ z{#|*m4r1|qwbiM9ry7ouo=z=K8tZhm@f_(d(Y_;_I&5iOIjhyGV+36tZZ1SGrJam!qdFPPN=%>D*4&vZUCY8B?8D~yP4imV~n z8X+6~_8D}T0Qeibd%`sr3*fHgYTm1nUTr$;plHvaCW`AU&EUAEIldpL)D%DZmpOj4 zujZ?Yv6^PHvpjZ0CD4~DfXLl97FJs)_C}9{sJT9Ih1DPsYT(+)Vqi^-LnH&@|I_%EF}Gv zgO3fs!pWjDc1_|AqIS8;$)eb(tQkCUqPj-ITPOP!{>2kiV?_k_je>*zI`ZTZKp{nU zptjp!m(A5;`rw5jyPQYofmuUUEdcoi42LPO1s$polIzG-T!vaeu^7Q(a=GKYrg2qB zDXU@+sh3sNW}~0Ia|()S-NeH?)|bthEs`~etFYTZWK|lo$V2*k(Z@(eswsTAal*+V zTb*exYJy-J(0;niJ!i?TcJPpLak=)pZ&6;+bEdQxb)fG0M9jK&a0qtoET9?J3u~wB zWgqQ@7yF0=;krsOJ6`F^vqwRC=KYdb7lNU2sQ>JO<39JZ8{3Bk$p=5 z?wS{Ik~gwx)teV}(8z6tUel#{Qj%jIExwYc%<6Pi>;DO|So||{a$_3m*@VbwV9=Eb zJ_e#kDecyH%r`T0iPdE^oM(h$!gnlxud!{RYFrL7*8C zzTQ%|4MOIy1R ztwArtWytIJzB%aWN{|)Z{%jN4PtrA?uo72A{~p`dsL@gAsx@~fII>UBsQ25WG5d(! zTl0Qo@Xk^Sf#nW#pQ9M`tW*^<=PZe;OLpuzWRhHIpo-X057Xx!jp1A|Us~eWki;Q53#91_^>uO)NS1lj}ZGJsGe?JUr-xKTvQdCMjIG z7-aw)Ky1>5b}R1Y&T8xLo(>{n4Tw~pM@97SR|XQf(;TeYhG4=qK#@1+N{3(guVlm9 z*Fl|zm|J5?17PRTFKXCsbL%!}(f^mOEBFBZk&kcxnj!nJwMrv{x|51xDigp6(lc3& zN>{tkEgKbB+5vU7L4Q8?Oe{yk?P61lU=wU1E>h2*V*y+j4Wpn*{43?5sd8uy!3L2J z=k?hnJzZxXtxU2Vv=UJwHu=2#x=Sy*#XnjV9Bv8}AD8^xO1mV@r`eUj)j$rI zYsM9u$`#NozE--{;aYQTDNFYt_r8tH40hR zEqv`O;kz->2~#UaGZGmb0m%+W(^#9Xim=qNa{sTornyPp7$ccBa^hlvgCtVZZX+_3 zoVYeY9(C>E8ioD3<9F7SRZRQ_uGH|-8t4)oyXVMV`6WU3!AFNjMRUJvVomD z5;*Oqa8PXAsW=Lpu&S)OD$3Yi*4UFoLhM4v^0EL( zb*bC^!;QqI4$U2oMNc4#W}q_^%*|FE5{Xz=a2TWX7e-(dCN@V}S}Fqvvq~Iwbd`;! zJH$u0TV+Ckbphy4RS~V1SzWaqrB~`Hkb=*kOyvEl@IMTr&x}qU(vJuDdC&`+9pPrz z_KMb^6!yC7wgt|my`t3oqdQhMnq{&+WT?eWk5%<-I^x~0WT*V23e!H49-2kB3~k6r zkJD*RAd#Bov#a1pdu~*4(9J0;+Tn`}WwdFTqm2R#Dk*fw7793$waS_7-bL{9eoUe}Kuv3KToDY&+JW8{8PhF{# zNVq=Y73y@zsMpC)psDbus$Zi73{`i~u~nyZRx3MVhD=C?YskORTFVhGOEBne~ z7A(v{2be%D5^Y@UbpW-1E0-@)T<3gWK)z1^nMU3p<;-PpEfIhmm)FCa6aHK_G}Sd- zmSb00V22N(+te0ot?*~0p5Bn#ahINA@e-7Aw7Fxk7*b0ZQdclWl>a5aE%-gG4#=Xf z08K!$ze{;?aILetT2R~vod+~-vc4vUa_3z}y(jq8o0uITOdPyGurv!l=BkpiA!03) zLaYrQ5BWuuT8E0ph(zjS!irX^XaCWaUZ%vXAg&vAqiPYeP0%NW*m3Zk0hX2%b)RVW z>gpaYII%PJEM|rv!R(4Ts(g6KPcs|+s%YN2G;%vHck@JMS zuh^a+s-9CvG3DG+R&TFT9MP-9Bu_JI)h-I~^d+wsxfezx$}=0pU=@+?pMU*ZA+RE_ zN@ae3XP*>reDUW!dxa#%3T%b!7IYH@KLtPu{ZRMAM&sJW5Y>3}=qw9JqUwgL#nV4+#_dK^8PDq7hv5Yk<^{5VnQoT;G?`SYLWhvBauVp(=oh3~)Xzx|^2-e~|92V!!u^w+?BgV1KrTz_Jm5&6mO zVC_?WYkT|F@5emzc7m03G*95}W=MBK)X9`oCPtw{z?%F%^&iWQ$(yC=MG!5{lQRuz z%+g&8uW3JsVVn!^F(zqJDVd1Y`mKMQ$rCaTj}6f_eEXG{QVbInM!*Xi@yN4DQ~VqW z2b)kSs|o>{l(B{1m;SYAasE|LkR)y9#rp9AtNpt>e5Ye+S{c3QY9#XelN=uv`_Cu& z&Q8$7{#h4PLIhR2#-wEYF~E3=3z@-=tY!DnvR*PB=vLkWD2wr1%LPRrAp-8cfhds_ z9*+<|3u?h!{BgCf2NxC8X<}YID;qXOz)}wDS=YUe1Ps&D>N*n#za){BN`E0p1zRDiT3r?V>6KEQSk95m-mb zb*;~bF(C#!!RA`7=H%q&2_g=5e;YqcGHK;EcQvqO(G!p@pzid1FB1~8Li#_i_c@eG z6>6$RzD(Iww0dhf3|=(z!djII9amS8=Q00uOqY z(fl(SJAE(dHyz>QQSu(Agw!T$c6B2oJz=|i^b#}uRQ5m|xtiz#OW>BWOYIJO1A-N& z3|1^>kjijSN)4WZgykm6;|^{wl~0J;y;qHvRL0O=v ziej6NR3PfZ-Bqs4o5uZ+e{V=r&2B@Z%-)DjrUzN{tcW@c^u1bmoUWoL0FxvIJ*GUa6p^?sr#+xqK{#Z@=C-k%< z0iSoB+kB8v<@4Gaike#6+>>|iruayDz1%ea(ecEeaY=;YMh(g7#H~^LTL#3hd4UAv(tq{Ny*+z*d)YxIYg|)hPz%$ zDYxMksoF9zzd6oG`I>F@AP~>K4AzeKs?mydmF{u|2jt`DlP&w}Mu*$={2>DP<&O8Q zH+4=zl5`=hS8*is!{b$}q^;_J{tjA^ijNKQ)IL@VuC;d!gH%KiEAp^pl?#`<(UxWZ zVsu_Mpnq2kdTgSLf2QWdt83mSx@j`iV32Mw3mS3tC+^EjJl6ZnIuKmwamSzM9OAiK zv!vyaR@}|2U?#>We)Vet6_Uhd#3>wMs;(hFAJ07AMpJtsFY@-`mqwEeD$c*su4g3Y zZqZzWFRO9g-C!McijVOwS78}$Qr1ly6DNHjfLzrzX2QD}#|~}u#q8hPV5a?Swc=#a z)wo>vP>1JuqbpVQ05=hXZb8vDfP$KbRA$P@i8$)zNKeQo!s@8%h%f+!y)-V37@~M3 z&ue|R-_@lE^K6T)t#GOqz`$ZR{i+pob>zo4JT?Lv8|FGIAVt*P4fs`urc^6rNWi+e zDD%h(bLF?EEbMu>sQt50n^lb)maceiGxfx$VviUshP)XiiCC>JQvunj_bT;d#ox31 zfeVs%^QPDQcubaXmVER~`NA`)T$y&Y>&)tdqKp}`-3vXvsD)1fi;HC36?I9_?=aEY z2REiOA~1B%K$?%{@eat97K(Dgmsll09q1_WzMo@{d8jEmx9Q?#?qki~J`fYa+i&(wT zm~1M_s*K&^r2^8}EqoF!!R0&w?_2mP{e+=&KxLlUv1j>{n@^#iuXtOgo`CW{xX1h0J{c?FG_Ix zq(glYv1N*-5kGIkb&1boXKzv>jz$NIZ*!`;sWZ^;g|1`ahU| zMZ2xKbkfb!meP0uqduS_C2&5y6Y6aiDjb-Dz6M`SVRD7K4%k|yuPdscC9Uys=< z%({S>Nz9jJ@HuBt3j)7UL421yvCCNTZR}Eils&1r`i#RE6z{vP+)3{-kEnJ8{U=T1jZ=O19vVhS@*hoO)}M_&Q83)|aYu&>Qm z?{MeVi-)6aYo=okzB9u2VyK5o=mX9N2WsB#pM!f4OD1t#3mJ;)YJyK6eiAZ=W-6!) zIX$l4;RZ_yvuc+phw)LS0;W$%Y#@hI|AD=udK-xKJQgddt$2(aqt(j^eB@_a#IFT!CSEF@S&w}-Vyb0PTX}!PhIv-bMh;7S0*@-QsI;E86r)+K z&5-J%&51*b(=6@_PF9!Y**WP-9VHWTL$xgq#j=BFSs%`L%jL_UANf|@x zv^j4bC|*e~%glL%(_BF;_o&+beO!*>J-3NV!=0*@wV^yS>Ln$jJx zgZKF3ZlvqBgo2OpYsF=U+0|@GOAzP6s1=QT8QLAYS<)gQsP+RMi4-_6$%py@YA^m` zGvcv=Mk>i>P3r|Izm4UZWls-Ozo z>#>jaFz`}9|19l35($=btHzUsmH zqv2l{Yq)u8teI}=nM0tpjNEg=zId{dOcF$L3u^NDbNtK4xWYeZQvS9y6?TX~+Er_! zukZ4rRh}inJG89IyZ19VtjQ9d;K(Cb*?12%nTJky38o;4@&|@X23r&TMmn)HAAb3 z5>#J-)NV^^DkcN9a_o=HL{ao+__3v2r0hB((yK7;NN+&nK2g9R_p9!IU{==Cb^PMq zTZiQ-&{kCIe-CKGtNSxxp)^GKF*3Tte7p4MZ8$=!x2h3$c&9% zVKawhv2IlvFOh#En_K{{_dcA0{I-bF{?QzYF3$2+*1{|GTNl?b)eyY?oEJ+*2!>+4 zLL@6Dj1Pr{&1Vv|*Xpwei-h7D3;*D~zHxa)eXvtuhS~IDK$#6i_!ZJ`%qBIB7BN@$ zDv()dTn*O?iI*dPNJ<6G0Bm$_8tP-+$9H#Kx1gCM*n3GzCkQG%b7%;TTxS=TF>)vW z@6T!0#=F=1roqRXyY{e8d!n9y@!2<>y=mQ5#3ifOe!8ySy^#L1i0xO$Mw`X?1Szqo z_8}M>E<}%~7SFjU=AE?t-GB4^Ii9pVlFdMkp9$QJzUKZcf>Uf@+50~Gp`4{)Ph+{A7!L?^?yah~_eB(w`vEF`Q>MH`S&@@-ptjpEY_0B?8qA_i#vsan{`F-=-Ex4< z`z}*Rt2g>qAmC7rQnTPq;O-x~J;v)9^=c?tjtnG^drR0TNUrn23Kc7P6 zKpR~3aCIIY_pNl21-RlZP{*24tO_;(k~iu+BIv011Y%o)2uOJW%3UmxIlVdcwa30N ze`?k5o)61CAKoR0o*P|B_VRpTj%FuFKFa1RltH<9Int$$?)+*a**u2azviI2>VAS5 zHRBsqKVB7?PP?Dtrk^7zy`Gz%;-uh1;6&oIDN#BzbU*nqDHsgyz(T;WS_m+^N&9dc zRn^1mYaVaw7!%6M<1o89C&eY9W)7N!?vA@7t|x9-pi7-8`j=G%q!hi-cdy#)Q>^*g zy5S@c-Iip)uVb2AARZgok8PF0Rf{L4m{;J3$MgD9NvIcUV>vAGzo0M^&oRB0p5fo@ zXkxMcYIRRD4URUdH!6_J4QqGyMF_GQe!S`Z2;MdzdMe)Wz$Wuqw#}Vz{wb~XgmQ({ zf||?c4X7{nyd6Ae8@8g6C-2Wf^yLnfeHF!DWVCF1$9MzVY-OJN*_z3$CM?k_$sz)Sk0pl|{ay3_G$20r!2H#R3lF3Gdt!*$Y z|L1y2)Ph?BKhsF29#8OV`pn8bx7E?o;sRWEVMVwCx;0s8!Ck#s7FC-LUd}So9GDPI zL+k@|99w9(PT8F1RIjb|v4_85$1X_C(>Umz=xNCE{ipo)5q5|hRjxr`_Zi(8ZEBI^ z$8#~fWJQPM@gyYk(dlLHmr%loSBPtJj z`RNw&Dqg6T9FNIZwWEpK)Kf%uxEoT&IvokPGU0A0w@Ma7nF&xsEUTY=27D?${4RQp zZsg2%u6t4tuApBE5GgRWtBl=YZlP2CX8M`w+xcQ75~=;5re{mlt*$9e(j85f>Ow#P zY9|3cfh*|=EHn*0L1+|Ep2$9z2vmH9yFW-_?$RJAK`D+q)!k@8KW^>gwIZ$ue2Ij# zzpm0xM7d>6prGUsM~FS!vx1psl4xD1auTe==u?f0Dr6D6;k?t*3vV9o@>=r=ZCSn9 zxa`#SE=`K$s&x7}X~ArQqN4I4apHCR{ZnueGv`1+n(AOw0)_F|mubi!h0}aKTjXoS{yzV9HcHR^>)FkAw0F_JUSB4d zZ;GIc#3}SwHA~(V1>2JSaVm+k@lZDR-BBsxUu`HdL`ro~SXF~(aozTeTl@<@Aua}Z zOoEfT4Y|cVZXr}e5wFq)?W^fPswRHBnwrKGRyAHnBWqDYw>!a%YNw?!lrlWPNXwOb zXD?yBU^_sP_5^i$gpse~4X>#RIU zi*TpwBzb&W89!jEKJI3z-XZh9!){x6{WZ9Qvt5HK6!jg>ZHwZ)w(kU#llJULszc%6 zI$ItP>SakruXxrO^FdDvhw-I~k;Z@sF@9E3^!@qd8AS+-5WH z8(h9lX;<7OVKBOVOwg)gyp~b5tbuGT9}nndzwbh-wHK)+R^rln?L+{)i2TM_{qA4N{A;pZ8Nx9Tpe7rSR)<@&XJh8b^s~UpZL`Y3qgJFYYE#OTbvNW_&%n9&)w*4`<`z^$k06 z8_<h|Uf>+U->n8!D^6+TJ@^%SE& zqyph!u6dW30VDhoeB=YMel?qadc!_dTzStuMG*Hq{7eL^PURXZjV09t#z%8TxTzQKysI2rG1J{nI_KR3Uv1Av*!q^QuKpAtYQJ?6?c%z9EK6QT6ks_$@ zdUg$Kvl)ykf0b!)!(zKMq*q$%z}#C4sj~=iYTIxY*#$IdJBPsIl?do8A@qv!vw&!yW8htdK_O2+el*$COjyZMD2%bgc`MUUkjVvzqk@2$s!sjY&0 zRt@VMy|Sn0z3ATX?~{{es#U3mI&zT66Yc29HF=O=uARwXJ6C^FLsR2W^by}3GBrX9 z>r;Ts9@j-uj^AA;6jP#cU5xL6x6mfT(>fXmTZW$%?Vqeu|0>SdoV>4Nwb1?gOU7+z zGCg0Z55Qp;EU@e1i4WB#yYn0b!do>Tqrx1$b4~PCtdIUY6i{6p(8+FMGc5*Yx#P)# z>!VDbq@82~!mFqOm|z(Zz*IK|R7S%;N%)K=_1Dl@jHkY-yq9l;K==8~zqX|ncY=UK zD^mqAj0~|d$HOHIjFxAk|2|j@PySN-X1J#wX%Re7;DMj>(#)_Gv7I&gkgJ-I&q2kc zscJ|EVB3bBrfymq@?v3AXW6WuhOp@Tbf}Ft6c<)NIWJ3IEFS8j{@wFZpU&O_0Efq? z*ql-FP`o;5i;34T1f~2DKLY|y;fL%%%)^66cF>lLnIxH-pnVo$GYh3yr5#Wgb_GqEyaV?`t+yXu78VL@*{n4*|MlX(1}3)~)7d1_E(N8C*yhctmWCavaOQ=juGQZx<$5|M~1{>%6S-rn|bmA^@6n4ed z^}#$qDrQx1n6dCO-mom1#7_C0BIA}*EQU9`paDpgO0XT3huJ&O;&(@Wj;`IXdb&ot zAQU7uU?tj*;ePQ>y8lhRAtxV?3d@QJ%fyOE*EHeNmBfl+JfL=WG{3s-g>sG(6yOev zYHH2k1}>{3?;b+TTs(r>nzVfjH>(E-6|!VGT{`8%G9tFQL&Tu=eQsf+YjK*q^6VM_ zobMK`sYh~Ii`!}S3XeHo(%aTC(@zdAriX+mH9hL^81z?9W(~*K81f)lJr^blF3_my z!0MAO=z?8?Osw>%QyvWG1vyzADCot>fzfc4OoL&KPl>eZ{!=?#T@L{-Od%F4mL1gu zK&*!7WlO$5S=$S}G2O5*gUC|jwMHgcY-7Kufv_qBp4BF5!e8DW;z4}TBq!A+qY77T zj~b?VyL@;1HkigaONQGrg?Uf-(MXzMg`IY;L8)9>27Z#*|Ex&fKT|)uF8a;dRJ^qd z#l5=13}X&!8Z9@ujiypVY~_M{?E9i2kK84RXvTrJi+OxqqmFd#8( zr5(7#2OaM!<&q_VqqztRau*$SoIG4ED^8NJCun)em~)$ap_l{Ll|D~dNyrog1NY4E znu_1*!OOJp3(pH3a_7~oNTF%=A8FF2WL;|kOvjRTItB?eAA#5~l{`ilX9)#WeW`w) z>r|zl4LksgKRUC3UJ7k#$;?LXTBNd90ifal*6@Nt7|&Gm0`QB;7YqNW#sTyJAy-+V z9Cn@6$lwkw+9N6PP>@`qMpThJJgRPXQx#ej=}OJKNOh|=`{sn-SgVG|i4z5_4z;bC z<fr~AbBZ4HzX){Hc zMHNiZa3$~Cp?g#mvlnd*nprr4Jbw0!legGLIzj5SxNg*(1z`C#-cX)rWV$?Kl9U<{ zN5Qn65#{y8MSGP%53D6;3F{TNL5d)V#VBytdWl(Ce-W$6wW-H2BWMgll>@tME8toBElY#*&DpT$?d5qI*|)S+X0LT+-m z3254M`+v`#bpPoR0xezP5KRx&QXVrq=D8{=QTtikm%SdM%jVBno>y4MDIGF(Vw*>? zQhs4(c5Q}bq#PV!em%O8O}l;0^osYNE?12rL9dRim$IP8;9{tIK-KkHyN{Tn;}7*} zBe?Er?c`#t;2CKWETd2z3|lrC-z82CZ(Ggf<9W0)0oOI){io5*>2&j%_+wQ*X_W* z3;P9mq1t_Kc9Sj|4l8v`HR3@7`XE)UQ8u8*nC*sH>U}eK%#Tg=ipyrt{*m2Njju(8 zvN;#^e!(iJttTq`m8u8{Wfy}Jy)K?92?i$Ai=~}5)j*4APNk)y=MCVf+2i;;zHBE& z6RrppV-TJGNs9VPEJPB%GaM=%?xIIZ@>)HhO~<}%y?MP2rC>eobTYX*C25Uq5dySj!867>sMz)X?3CLXCS8 z2j#sln<^FT{>8>u)!f~}@?XBnDOns4y4OT6s>Cz)PSA;h3QhIglb{#@0WR1cGA2a{ z0z0CLnaTd$u&OfkL}GjHtYZqe>u7V@dgiMR&4OWg82XBbC+z^{RbyB|10iq0rgZ zi{HF}N}+_HhP%{aW+>HSe0(1SNZeVcx+JUx7J^PZwZ&m$DxhBvv%xhiZMk|J>gGRc z`ZeW6R?`s*?;GiWp=dVFTFS1=ZWe&qT&kdQM!XT62xr954e9`; zaG_rOzwAaQs`H^M78hMr%v{6w<-Ei&FYr<_;7g=3sNIZS_UwIF{qJW%CcB9YSgDl6 z!g}O2$*6E-4{4DKG_KY!1cyO-WjPTo%7? zhsLQEMc+gU_vgUHke7;LZzO={OSp&j`TiD?9R@eE%fVXE2yXaer&pM#XbL2O2oQU4 z;O$Lb0P)o!7$a!feVMNXz|*Cer}*2#FSFXom>43?Tg;gBaR&o+H5+e+r5gZ087&o+ zWBN*aL?oK~QeVnet_=$Fd;SD=~N><;RZf;^8@e`e8&9aL{G%U+gbS2$j@ z?!s89#4LAj{CUW#==C>VLBocp8w6;-j^sKuu{Wxn4s|5*nM7wT?)~`XPRHpB<9!M1 zMEMdu`PJeil>;vzIq;Ix3U784Pl$hpm?I)GG|OdiYQgYXz3YYaWs@VEb14j3aIOnE&gV(?AY0h1n1C4_z4mhW@YA9QCcn^&r38gvRacU1NvV|4LFk2`ILpqal5j;h+@ zRyX-i8YOK5h$yKLYQnckPpHmH`=oWO;hZ=97~2_mw5DHcJQE~b%y$*CP209258*9| zJr??la!wI>-+c@{?L})~|Dls`J}*_(nksHpyUu-04M28!RjM>#wm=DrU;0XkR=O5t zzz_pTs5cF^-Fr`ea+`vRRzW}wGvS_T?A5}1r`u< z!68mU5<<>kni1&YdJ#vXWT2`!6=*%I-B}06-Z~)A7HyO!v^UuO*$p23{lP8G+T-m2 zrO4rL2p~Oe5MCl1g}{3}?Ky(ae57Bdy|N9BU){5bxtXpQN!*s80g|X?s0odFwLh^G z=AZK`n!h5Br&`jviu3|)!zEiTD$ei9Qx-qw>WxP+lQ;Tg)NMJEEa3cp>N!VfR1`*zs*rZD= z7M$pg6N|Vc7fB&I;mdgSG2jGG7YRuf-O+GmVMD3hOBUI0q8^)8LV|#`c{W*Y5lIsZ zWA{nLH8-r)uz^kC>Nd>Q8iPq7g$yQKO=51ko)IX)>)91+G}8uFWBycsZ1Tlis878v zWwy$p^4edp`w6o$KKEczZ8_>J(*1gvgl1#MT_iX8Rc<6yT};uT2l^@Ze2fdr`*c~jSL zC#ON|P!yCMRnuoxPiT$Eegk;YcO|?%rmJ?P$J~uQ2kh}QXR+dwh)OAh#>l2Uh!SMh zNx>wcU0GApPs)Kwl+_f*E_jiY`*}4n9cQ_w#fS4zT;qsF$HK2oHj9{nIZ$;}k`Mri zOrOW^?%;wwiD-t+g{>8e;6|%zQ+<5La#F!^MJLN4b;v|^-N)ikYsE0*h3ookL6~OP zJ**^Fj~uY0-rQk~K`(kqN%jKywebSfxpVV+xRAO87{_kU0DK*>-BEeo)oA1sinsYs zy+0ohqjgZuEnsv3wvc65iUHTfiQT2%9v}zf2vjRtYpap%Jy9Ri%ND3~^Edlxb?sn5 zn5zJ+yo!)!TOFLcq)lW#Cf=D~ZFlRJI-S}k$|1-f%3)K-f$@3_O`whV#Tg(vUA%bm zg*#2DpmkVj1m69oEJ(~gQ+twoZYs+IkeL9&v62^$jlzA)%43IK=I&3$uG>UI#5GDF zg{0@^RGWtDjy+|;pZTC&whs1cvBT{S1BGVn0-nN>eI;vx6w!)f!k%H#{l^i+#M?BG zPtE!iJDx-Ac>P-y3QbXZT9U(z2f^7EFqqkY*DU%LJEcyFqz?&PG78ip06|l^PKBdM z`y_Hd=ZDa|xi^E@8&<-;#k7oWu)?lAVxo7oY6BG4V_KBx=7*TI&#(A0V${>xWdOBi zSRYRw!ne?>YT>O(&8c2DCAj!HG$I;H3#Hl(s1i#fIRBbg(k!LzE_b*{etOB)+3ThQ z8)ou`0HaALRIb+@z?34)OL5I8juPtJ@RJPH-rdQnk7<9=Eq@ka63X6%^rKL^&znHc z_mhcp13#R-Tcu;a47fJ$WI5r+OU>(b*(~rVH(=X;i3@F<$Pw3hx9qo@No{6_Us3Ltg-UFk-yA|b?O&?-u2Uh+_XGj(Jq4W zbtiKRbM1x6N(Ze5_Oek+9;v^zEQhS7v|x^ebboiTVx~#02a*(adyxzl-{I2xz_zY` z=-0g(7f@gL-qaOLz9DchVuq9-Om~Ou93uiPSJ4A#8JnhoHj2|WbFWEG)YMezFgB!1 z-#c-8yNe0UW|i>Gz5bRnD8u?i(dTnb>EFcd zVph8C>W196v^_s`?G9Lk?Hf>|Vs>i!RL;qQV0PFMPw5aA-}rZQsk(FkaP`KzRd*7# z_s0zRxi1)xY38kvVPAiv*PzUBufiP^MCoIPRGp$YkuJ_DdF(x9Ix{?2h-b!im~Yn3 zwe|S%nuy>Qqwa5l?QuyLo_C_KY68hITy7BY|NkG;QoSRh2E7}8Csfkp-XX7Hy0?4^)9c}+6jq!sus8PdX<o}<(v(inPa;XXpIHB6;ie>XbC4Tv^1y#r?+J7R-0l1Waeg^2{+JOUZj*kBO>5!m z_ja~}zaA~9nY)W5WFuU%kuhr1B0UzD!)c0^5XVmw=0SEPBkx&ZFcpj?bf{YpdBSZ`F?u|0Fb$>hqZ<{aE$b+%BNir|??*#U;_C z|I)8Fe9eE8K;1@3i5*}UV{XBNSVJ0~|sU8u!e1D;I%S=8Y>M-dxb2(4;J=(OJB`z)hR zRivG^;#^UTHzv&x0PMIrplDm+PoI1Ccc4=L62Bza(kO-~SJ0D?0pk7)5G0n2^mD6=L@V{Pi2<2N3{gW0v$sORlgm7tb z!FZ#@M9<5AQK)$ZTeC$|O7%*c0a#(46mKDj#$b+jG4_|n^o6QyMm#MJAmqLHb6)ZM z-A$qVdGYf{(OVwl5NTR{h2S&q7r3%rjc3uj%|qRAE6Ltdemsy^jY}|GzyRHM?Zc)0^f?t3u>7i(Fmnak;^dBtP5(;VFPt>aJ@2a=(Wo zyXyUNb%eO(gP4VU>cjPA+Tb4F{B%=>|T>$7V4EUnXOktLm^A=5FsLgPf)hVnZlFpFSzC;Crm z2dZ3_?=b(bxrm#k_OW=jcgPCIU6Jihg-ZBzHi2!=5vs`zPO z`8iBAtO|`CeVVy^bVaVAd<}96ko?H&()==_{Kkb{v2QN zJzH1a{yBI4Th)%?%h@EpzWzuWHpW;Pz5n6+r}&z$OEl%7y3aqE;w7RZy>0G(&M!q9 zU%%;T6$GdY&rzT5@Bh9%)tCFe+|^T|Q3W~OK*Roy8Tg`9QFNp=t&n}kE=`acyU~Qg z{XhXkg_$3T6vsQCbdNEfxC{8F&(Y;#+xgoaf*Zg>dkcyg+m0*15?9hYL!>EuNqw{INr2$pM0uZ1!l82tyjAHQ~AseA7A* zFKWeV<=o}=XWLIF(DBZyu}9HyH=MwVP8T3e?th8{&O=&!L=h5~XJ~$D;eY(EW+4Ec zZ}FjB@4oGQNyRI}>2rem~wme(htd`y8js!Y`L zXGS0=?{RXy$6Tx5d{F-g9>)~^II>lrPxz=Ks*%9+SAqZiy3g|Qzj}x!iE!naIw+n~ z9I&TP-EcR>mJAnusuV!am8@t*XpUIc!*hk7`%ax}eq2zOZGeC{gsZdff25jBL{T~H zWf%_T=BJ{IS2lgO0Fvids=534{@CV3R#AJg{KSXZABOwG@cgBBhI1~Q?qfJvOK)}@ z`rg1xESg*Sz1s6WFW;Y+|MkN^|B7KR;GKf$^XLg&EB`$Rewej9{$XtWI#%ODAD&+s z@xfpI?)?`v6mWj)mfMDktpGouErDwsvR5#JcRf&d*r4~$z>4QbzvST?LemP?banI! z#RFNhbGU)c+g5@Cjc+3WxksnL>fD%uzWe6edp$YpKLC^CY(O}DyAGNsJq>;XrTS%n zOo)ddf>)`+A7CLRg+LI_bLW3Q$AVV{DN>PlsMV;ED--xbNF@nlA6O8HIalM4Tl~K> zH`?AAxqY}9xsn*LHJ&^etICut!&J-GVK^gJ(o}0wF|o%SmY>KuIK?`QQZd~%ZYqc`Y>prHrAedQbiA{2Va zyCE*`c&mTj&4l`x-Sl(9=pSz?^G=#WMHW8KyZROrlCDLS&BL6ra6zPGAuT+XWRFAQ zS-=IY{0qe)E65u`Z~`-!$fhD*p6bh{(*j}zawbN#vXMR@B`G=YK{$qn>85=EB)f6p z;_%RPY>@&-1+G#BV5>-))Kj&KyF2oTOXI=Gow^{-Cbhnb{K32;bFf=zN_umnn)q12 znxqX(Y*%MLLQBs?(AY6gHdc*!|2(L;9mGly44_ZFjP3%D)q#AdD(n{9l&SO#-Ky%l zS65b0g+-CUV5;hB4tf&e(vEUV-}FxA0XFS}ssKfbaWgtL4f*Y{FSl(V6j&87 zq}QPWZn4&h;Nau!_c0&Baq10ijtMFfI`i8M&WLGta|3vEM0;witA9AaEe7u<7^_LB zgMuOVJt63A#6Bei3D?+H)^U*(E%-jgCw&xgtc#qj+I|@z4 zezm)IQVW}VHtw?YQn?44bJn7Ki{*U2GOu_8{o;C|spqky7O0^L#N;7A65BQcSxAbLTnOwu4bx-Yuv z_3)AqQX0jO_(}o84`j}wJFeYa@Ii7;bSxqWLJBPWBx4)E6hWkvY0&Oa&si~N*Sq<@ zi*lYV9dQ~cpWV4=-4D}pgyYbB0==IN<@IIp6deYtd2CroS?ti>lPA_~Nod4F)l)Y> zhbhmRZ!WuKxItK9N%;g)x-1Fq4kI_gubW%RDAQf=xlgQg1KM7p39@dNzxI}HYzBp9 z1?GfHMn=Mgfhr0P9HAK8utoHH1G~UUiKJ|RI9&l<55;94?Z}$}2qn>d%{lR^N$&~M zqeNIHrGj-+T2!V^B&8kv8CTI)Mj~$B*ioBknafBorx8*TwWsKsd?j^eK1jGpauaXw zr%V+-wr2Wyk%%|yBz=sxONJrSUP&tIebg;_IOMw}PqH_IG0WRe6#535+vk)!2n9vN z(4+GQKFnC<(#qE>^pAQBH7u(j; z18Rswki}CHapPS4%T}U~G5pD?04?`Trq+NAoQx`@3o*`O?(@fI3<(O#LZkN=JG%QDf*-H0WJyoI7m&AAz9A8t*+aXZ7>j=r0 zGrHMgO2z_wXT-=ZS^le=W9LbJq-6=y2ALvTEAQ$BP10@FV~R{*SH$*wXrMi)P)rC2 zdmHZJlI>Tba|>bR8`d!qTis~cbPM%VZQhaa6^P2b*mDc$+8Khg7~eVzXDo33@EC-K z)Dscr1ek0ENv%f>UV1YNYl&X}QyD>p)~sOonD0+kPtdY*+)q+Cd7Q$!km zceUKAR!@*-9C76wrEpN!+g)A9p$YmJ6|NilTszw-wOT3aqsO`m46vFbV4G_7Whfv` zgHy*@$T*3TsKi-HS43OUCyYYZ%5{PR@wh6rr6S^J9Ja?*opt|E=kvY6JhqukX;in< z;#7a}xYfdz@n#vTtys_l2+&TjU?x#H;?pub#_&-_nU!^}>y{qSFl_8HM0?80A477T z4GtWNvxNrdjTm5ZrX5CU%Ia1D?`G7=B@+F(=I3boq?A@FF;cEa%WL8t3}s36w_h~R z4%%@W@ckmy`Us|f=HB?$$kF=w;uYvz*ZPtsn#FQmx1QK9D3oiCLoxb7ntUU8le|Cw z*FX881ALs{%#NR~#?XZ79=%g%bt^v4ELJ5bdozT!;E z0ITcgRJi#k&_@JIL20Mh<@ToaOIB$}NtR-0j)2{YZ(J%PSlWzR#F#$Q8hO>Uoei_7 zlocFWgPD{?uGIX3f+i42RLv>5sJtSJP076YN}4+Qd!J$lND2t}@S7<}P%T2y7Gdr9 z(7}hP$fBR^WOXZx|)M5-X zI$3a1=4=oV@Wj_lN*}842TgRU56d9&D7mzSjmh!I3w)t8phNXhbaLQ(E?{1x%U>p_ zEUx9(LHNL`P*$TslZ&cYKJY>Krsk5?syq$TDIG!zDFn*fcxoF(dm50lg~B$&3<|^J=w|P0MSsK2sg>!YR`;i3hVpB$8So62-ZK$bQkH z)r;cT0$oOZav9kN(6|Z5$o3?ES&%q}OGr$K30G@sx65{~jJKuwB_f}0W?9Xh6QCLyQ%Ruc`6Ce0>q3GnZ&f4e zza*>r-b;t|`L_X7)cmks>&ptrlOaBzViwimY$|L1|A_l@WyzH+OAw{=en!(!6X>i; zAEt@oQsn&rm?AD0B0==mKkT*ER;ZaBkIwAOsv;upG56yJ1)#$o*3j9(xLC)g_F5#! zp&$_c^7X3HT#zCTp%WlDk9PsQH;&A2y}9byuU81VZfYEnfmP+k2?IQO7ZUP`vIk}Y z^SufI0sQI}^?V3J1)<;0Ea@&G_NPK6OI1-lP`4VBko&d3Fj9XC#Z~p6r^kBS`d1A_!6iIkC&MuLu5HvzvgD=R}GMdb5KvcF+|^ ze5azMz}ScTK@P4mA0$Q`0YN-VbX4zWC?%9+q%b2WwrBuPK(N07f*GCAu%cE2q8zJ> zWI2r*E8LYbvuD;SJQS6;n>HoT|D^^?s@f?iHka1@DDQQM!ma73M1ho<<55f>0?sV5bje~P_H4Ywi_q8 z5LXz2#L>>rMrNsI_WD`oOqZ?H=>>TV>B!WHIH1OtRaeP}OH9yGo;C^yX{}lOXuM@5 zs9pb!+Pn}`u;@(17qIs&4j=5DEw(&_V$vn19#b0X^&&1Vit~qHZ;H+=_T>{QXz@Y> z+gdg_;L>Vo5t-N^j!ohwU?Als?ZCoNX+g`RxM)8^r>(O0iQtXuEm^`s9z7k8y8}J8 zbg)vQ8QJ3$G-cbGh7#XI>jfEf6zUKGPoG{Yi=XRUXAK}hOrG%?S~v#8z;jvfr_T@% zJU7k*lKj!8zW>c9P{&ub3o_pm5*2!Q4B3FoMWk((nqPwBP1Y(SRG8Ye3=T{&6c)Hi z!B?lGg)N$-k_JS^P*=`NMf`K0cY!V1R;bGw++WPAn@e;foXgZ|M|04P#HDYiu+=t? z=9Vf%2Jm9Aiq?`;imT+@GQT2dv9nI52D*H!8&!o)_eZE#QuI~@<{tRHda)CNJqgon zz=IMrEGjZ~N;p%~qdV_)hbm_EdeVjZLn59(3il#4)oL}LgBDlQN!1eYRgndGsuNUq z2h|kRNWv2U`}&}0l&tJg{&c})d3`xh^yOM}1vMWTYMn1fj%KwSn^vg65Tq|5P*=3! zy$-Th#v#LF21M8u5vL_em1p$RP{5fIqe9nffb?V57x)z-3DsxD#-z|PdLmtw)kZg} zhL>qZazaNoim?NW&#+PmR37X2J_HjW{wYYMUaqW}=JG%YG#M|X4WJJirPis;{8UXW zl3z3&5x~-ZRuj4Y-ncXcF`Oz)^GHpCsMYh3yYhHJ-Z>voKzPX^88fA0i4h$awF3&* zAnYaCgDV;WYe9-irYggrE^FXT#UmOfP{KT8qzEinx6Bud8HsW|taWnTu&$`ZpD0>$ zwIHz{isK=5cHcNyM|s~lt9K9`k9!KC)QC%a+yZyrHh%WS=)KPkH(b?PjVCKV2mmM| z7@`6|t^*ROB}N7_heDSr^co&{cj8!(LK_z5j=pkcIUN+blt_v#j2O3&i)C0dsI=_f z^vUI;#PT8YeH>!HLExH0;C>UJUJ{;B8DUZnTz7g3SNy0o8Rg|r?}Qx~PF-BP>iN0; zfACL$*Vr(&L$_Q@`C5lC1MIUNF}b=U`;Uh!8)V59WA=2dD$^+?`RKmcVBc zQO?Y7vZHH#E3bj`>?~~7c&1IlaZ=bR;rN4+ZPZ`wjLx-*3TQK!DDMm*hp3Zb6P)Xw zl(5sz`Xh*5t$M+}KW6JatPQN|Q?}d>mv%BIwCi=F1qjCdHhJ5Pp9wpqt|NPY=EzYc zLOV2{SQbXtRCjl%t#%M?Fd5k5C4@)U6bckZ;yF2+HJ0IxBfO4hB%Iq~)7o#V&2!3` zWzyUyyP!+a|5$oyK~O%=h0=k^n+c>^onx0H-@Cy15AjUem>W!X zC2{gcn9_T5*JH@vRU`agWc`Z=Y^Tib*AW2~h$bf`z5==6=dpAgj`Ne)&E!fUr_*C7 zC4!zmXpEgWFl=Vi)-p4N5|!5Swc93 z^F?o8ZLjDNMq=cyxmseO0W?0};kvS2(h{OCsCqn7;*+_JB~b&58{%f{;dR_4 z{8FO-?Kil$hL$`OHf7(H=0RD_`WkOT zd%!b)_){ih_%jKR!R%%Sk}hk4r);$+BMNt)Y6X>|(7gT^SPoJam_tuSwFJJsHL_ky zGvXZ;>v(*!)>NFTfg0}s47{6%iuTE+;(|VxMw7$C3@V=cHg4-DgXJl&r>SSdDaRnq z5hc!T3XWmgb|&Y*>0wbIFa^TSXP}C(uS`ZBQTmDl)1=i;dpKL7g z3Zm3m&aS`RKfjCLztQp3ddw=sx=|DL1&q(v~K~ulVf*Fl7<*4Uf78Y5L zwBXm15DNh=pek0?3!)*Hgh?OUithD1q5ut36i$`2GJ4ar9uM@(ips|u4;LETT&M6I z^stq-nd%%2AIQ%FWM?U~dJ^LF*H!c1ci_h{Z`<5ZThn?nQ)J{?p~&M{XE5<#Fq=T? zdUD8CNJN&d`X1yg3pi6HNRFDdImL4-8mw1+Z%`1iE?92Rj00@cGbV0@?6>4Ke;ZlQ z0-{&GJp9VF5Vl@Dg)sUx1nmdloO+^YBRbYL34Cb(rPc*1Y6rcH>OpUTDD^RBDvae( z{=T9nFpCI4svPx8Ybzd`XjKw(GUxXS;=Q5yny3r}5c_+=3Ym1JwhelbEC=q96!C^N}k?jOM zhD2*oqGgnYP>+L+yKLVvAy|8Vu+4l{K=-!*=iAo;-LUgazjWWS!V*-@-OVFjadp4C zI-)Xb#?aA!I(=21G;hxUb4}W8@Pl3R*slLQGNxmxdtLEUKd$%*;p_=c&aH0aXlCtn zWIsg4`3j|?);rTMf_~FGUz|FfsOXqw2f^Tg6U0nDoqe)bw}$+6GlTY~R$BR+Dl+-{ z-Hs#sK3=r=M$j(&@AucRa+R^b_b>gvAYszOK;hemlJBFUj`(Lz`h0fH(S~optPIMO{{3fYP&% zpifMCK-;$A{CB;pw_E+~zW>F$%Kv&qX?Q+eFG+D=&4@+9uEBrT@$nZ0$Z7kFfFOBS z)ZVb2rDvuPa+22DNkqak%3qXM4v--%pO&1Lv8-Jbe!lmqe%Y8mr2>cxcrrjYNWo6z z(^H71sPj25q6V9K6qf+wk01zC@L93xk1eo!1*afSVnIX$TN$$5BL9cLaI%Ha-3aY+ zhaPdS!sfcuR+oxe5l!he9qSzcD#PBQvQ!rssULrYDYZ1X6OT8B7+ zN>-(%<4BLB_iyJNAphzIcSvOP-*fZyJh$I*TYYU%KzIBO5uHQ<31CxyNw^#%R;@bgYSDb*LV5ka|*EIk|$I&%OL4-Zl?_% z%GxC?M1E18{uW>P6_qqyjd)`HW&@3mA5QWXGtJKxMS2tmKPzRy&Nx1`HT>kz}q&2C7wKypT`CN?`2LTEy&e91cK@ce) zA~}^sDFDO&4%SWnmI3vBwGR8rNH3vok7ux8xm^I)n-)e6L)~~6m7H~Y|Eix#$Yymj zzQp=E@hwn#O4FVu2?dZZ7!bDHzy4#@4?Bt*lpD5_|EauDY&)v_K#^Z&zpUNfF&BU| zW&48c1*Z%6L?BG%LDF4oNefpxeOUUNi8@)F=}u4RqBmVKh$0<5fU2=I2v|3(nhx+Z zLkF-ew=`hCkXVUBYs7-Xk6%XTD_-_J)jL9LNhr!~3zQkX;g}K$#xNXeaM}(H4ezmv z*!UU}Hu>-4ML>L^zzwaSGLMp|<4l8dQqs7H5=MVE3T*&_a`rG^HLjP_6CZIN&)Qrq z>+MwG|E`331}dy}Rzan&LxA``Jb#9X=AQ>pW(`@>Gkw5%u@SXWgzhCErM%pZpdp>6 z-Z&fGL^V>7kqq80ei-YRjTOzZpLg#J0D|}eA;W0s3ystq>qA!qljajzze{{J0w^BImx4#}34H+>w_q0Vq-%H%pF?Rex6HAZ5X7XC%=jV-cgK6j=U8 zp_O{t?B6lwiOag<- z>MG|RPuPJb+*{Aji@n8@9j}HVlvPtT?VHJJ6Js-Ziz^saJU{ys$76oM9_%omoz8>O z2MHxBD1j~k9S3P)Qn0}I+uHf{Pm^7)z(RgfD!_g;Km@M=`W>!a!H4r7kM(0Z{$GA! z{}If;fBh?VMLS*U?DWnybSOZ3Rt6Z)+l2P4{xnl4_6=rEUEHxAemzeX!PS zTWBn(2`Lz9HBR`HJ@uafs8B_mLzg)GxQ6@x{9k|l+q*wASogIdiohO4amDE+!hY$1 zR2iWGtpX`V?Suir~6E`9eFUZERBVa8YnO_;zH;KPobVa6lXk-s3i3doA zHEkit!9Wj|XMNLQ&`?Sv_^Do9Eiy`XkkSWuVR`TWMG%`;09Z-7>OUQMW9{eBk<(Xb z$!(7lc#NKafo;j{Qpx`=|M8^wqyaU&k%E86tZ5-;d!$9~T25m)pONmgR z_RrR>vj#td5Mn%wqRW9-b1z^9_25JN6J-AoGD zAg-Efk__NMQJ-0WR#Z}!vj9Q9$_tefaW^$_1un8m#7XArbrbP$E7-<(&0SA~$G zMjowc>a(VRys+j}deQS{?An%$#y`73jPiwAKcbKu>?KFpMq(-lU%v4~P@)p_y>8IBYo4Gs8gnpGB`}cEwp5DFD_R0fyEoLVMB_#{1 z+vS?D?RcQJRIBZ3;(`naw8pQdPr&Y6`~mRw@KJMi4OC7ziqcTv#LBG{-;Y%@ zJc^PUf4MPi9#pVnJs0VD@+@nB*w@I8>!QxZOT6eop~6D0Eu~hzNI-0v5-MES=_)|t zCeL>8O;ref>O40;cK*9=Fz+{r)?Y)j&I0b?e2$__D{>d4q?yGJ=DqjR5u#L3VY?~D z=KI`wUWlzU$Wqq?e$-2D)J`{1@A7*ON4UkxPY$$Urcf+%z~}`^!KRrug>yy7VJjuc zPZ+R$meeh_`BRI#J!rJN;(Q_O0dH#R0YnDG(^c}sK+(5lvJ{V3_iuy;RZAVAR4!uBf&dsYo2%_(FNoC%Xlr@4q%;RwkO3msTB-eiTr4NJiQ0(X3L!x ziVXM<-Ahk_2W_7V)c(SKkr51!fItJwOlI=XnggpcN{98g3eGAAQ&r?#umseV?@5~o zIv5!d{-E4owEgsX44;+P_&;6FfZB`Rq6nym%NFGqq zUf4}+|6?D=XLE8;kber3NDg|^KbHxrQXaVhD^e+!!+d2{=cw|ZF=4D=fy|)797?Rm zbFIJr?PC}-(!hpYIe3}}wa8T}afNB-+V=}VL?ATr;bkc-=bwp!ZEWb~&q#Tp^PbS_ zDqokUwD2ABl)nQ-&m`AQ!Fb7s+b#Z0-`|9**zHv4lq4!~!zF(Iy02!i75nS-qpb%C zt{#N-)9yfmc!zX_^yeKkXVJ`lxCO=vjSBlKdOnNkghSqE~-iRimq!TV36Y zloMeB5f)KAdo2Demx&$3_O&LNHlRFEi6Bpk-ZBE02(6v~o_$SJleEIU}H|RW!=ys$V1Oz+zj&D*r95u(~UZyHX*DaeuR$ zS52{S@ZS*-*~w!a$N`dbD1;SEaj^dROYagGNKTGx< zBw%H}hep!b_WfViCSt)B!adu`ku6^MXRpPD1e|V!wkexBq#OO6)Yn|XtLTSt3xV8= zz){=>@G0?=y@_oE-*3YHRj%#@%*Ri`elf)z*H=H^iy%hs3N+LON7v2X4ZfK=`~w?C z&Gc1Y*Zf?ruw;qW2grItA4PqIMQjQ!$MJ{j43u>7+V~PI*=!4&uP7j-n>e1H}qmE6Js4 z=GK%OKl9Z104hHtM{YA{AKqtSfpey}be$@)CbEn&G7YQrH9fSBek9dSBakNDDU1!h zH#4I^ml+fJaHc%*E9`MogMzvQ8L6IC%zuoJYbjAbkIZ@78@_W55BU}%t3E2lOoUW| zBtl|m>3)`>sFNwgDqut|+{670-t(@+3;AlL(n`}w`(vXMTy*h)mX|!eL)l4-f_T^x z%#Z=UZv&`UzJlK2|LZPhv|HP7!ec^Tr6b@pcxvuu3_#o!ROB>-+%EMyc-K*d6cW@7OAeHq(IY!HVF1i z)-+AtGaGitV}QBE0IYpDoz!Jy1__i>Ntt5q#p9{@J@ct4vO`2?FO=SQ3DDbu&c^+T z{QB)Bej%zS3U_5xR!gN+Lp|6b8;bNzN?dZj7ma&(dQABbM+TGS#4neDN_GM2^Zo>2 z!G7UyB1PeEp8wKXb_Wl;mfui7Rdt|t@U4<}Ny`d}9w6FBPuQEOMGc9zm8rx>n#|S7 z-vHvQbXtFp>;ngl<+%+2=tseClFotkSUSyF^*8&^|6~31`FJ4xXY$$?TXOfMl>MVC7~CMXDKnFV(xDO9wp)H5=CFUTU~FOzKF z1(bj!Ta?iaC=AR`rbkrCEvN=sD?`bG^tHrG!IFzCcmh=%Jt`x<*#1=lp5|mjlR~|n zHWZk0=q|jVyC);-`VdnGzu4ZFi%Qb~qdSNv!ZoH!f{rriW}Fio+BHGejI#DI;}}dV z_C;B{roy|t-we&@YFi`)x`a29m7zX)Brg_TVtFs}zM(&0iHIt^iK?5W1b;l9d18}q z&`hcdhwC0O{Hpk9-#~f@sL%4EcR71_i$%M#l)6eR4~>=NnDP^mPbaIGnx76PTtafa z4+Pjb{@p1s0MMI)d{JARYfp(a(tVVylFw4|yU4!7zw)$4tbB=5?E-R=%sIH>>tXPd z;3ZCu6vO$*o@M-)fW3j)COtVYzY=5h?N%tT&tIz-mI3zGswfnPETH>ubhg7Wv($zo z04oR5DgOF5Z|o#mM)53~uAq~-sDihXo4Lp!icd=B@!_Psybq3s1$#FL%)2qTo`I0J(U@0(eeTeDIgesZ6 z*swwpIXMHMP%cF$ajUF?{Q>d-)e;L|G%dmA8z_D?doe?*Qx!e(j(S-@K+v(wVk8k{ zpx*PM-~>ctsLsCkAXhS)bjD{14?wF)dSFfR8I*NFs>O6lWrF(v@zlfFQmgQKtz?bJ zv@CuP8kr8i8bbLbmmN5^mbmBCm+*|x^1;>$>}#g(00sK%vCfgiznPk~5f7&jc)}tz z98m$i#C{RcX3O4pZRlE7wehIX6=(tnREApt7-~jrXuiPAms^nC7 z(o2;FcKwcT!s$|TtlhE5c<D8e_j>(#PcmeBDo2wn{8K(lW6Ehyph0z7AUb*UwFkoS(g>9jz9c`QUjEg6sqx9gkWHo!7D#r-#&Y zfh?P=5cbfBo(P?16GQH8bYGLOGv?_}C6{}WdTv&AlytktC#Y5(^mF~CImVs_>3fCH zLuO3ub~f!LQ;8K+&^c%EC58sG0ile)jqbAqoybdtdvol5Dgyq2*bkwwsri7$YmrSJ zFN&}fL>L8H(4>bzDLpC+k)HgA7?i7xHJFS?cV|lysVauvN~oyJ0Ln07wvYy&`kN*X zVeF((QlvOE0n&u$!^4HSQ=-YP#8{}OYNb`u(vIAhueooUZiL#lkkcvp{aEs(O?85- z|4zZd5!nsl8tA)1Nn`0y+O7@25=FlhLL#jf>#Pqqyksweafo}syS*{j)q0qnwovfmO4pA~g;$m3i z}m zv26erF35IP3Tg{kc2;*I< z4sm4`SL(o z0HR6D67FEq4GkZ@ewTP6hl-+7@{eypn`56%TW3b%q)zA<(QWuV+2wz>HNdNp6wJZ* zJ=B~b(G&CH!Uj`-&wzRb8cPWhbm#a@{bMByMd?y=hbsCc6_z&_al?TtA3)H{78H=O zBTTDJH()X|C1W%5r|lo(e|&`PCF*rjncVbGVCjGi;%LwooI(v7-?UrLy+iitei)#i ztS1A$2a+iByR4GdLi~TQc0Lat%7;8EWvh@~=^1qS98HZks3`!g!e%yAOI0^M6_nnZ43Hm5W8sgn0O2p=^{&! z+dynw9hF?uHywW~W=fxAFH@$o(&wEN**Vid?SR2>MAXA#jOU9{vT^qL#sL6eZgC?t8L+0W650G58h+JfJ)B-4oxvKVI+>4PON~X#yO(9@HYkX@vtL z82Hp;9wULGnnLdY9Ps4>iJRZIlc(%MiVOSma{CQLOfv|PiaU<2d&f8^qY3gb>c(AK z!q_NjpKR|rlCLvZTZF(;zPG#cV!uk<05f7cU?Y9s#()SxKd7y{D%>ZJ=W?;2G9-md zgGYduAALV=YB6Zf!1E5 zz(`@FVyg+q@Aw%FnZXHbI|4q^3F!87S-fn6RM^KXVFQT&APks_63Ix+D#qILgyxjQ z{Zt8}!WG0jLn9{whbuyfdu$Gktyui5zL7R~Z+EbqC}EOyg~PuhXH1?VF-**e>~X0p zt9;c6`&CSs)rcdxW%6$#hs(EI9562v!iJYda}#=wB)n%fU$DdC5TVFsd-<%hBCF85 zXKKKvz|+HY@yD@0Rj#RtP56vOg-+^ch*Kj^wIoO!Ju1W>@B+ z91{*WC(^^`YI?`amCi=gXATU_NyQ?9cq{!b=0gxlwE64R{?!R-V}CoM{&&aE3w<3G zab$tKz|Oc>f^+=LJXV>5SbSa(&lhjBNcD@9K28vnIovM%r3ZX`VLy+bD3tdE3uV@WG ztzpc&!4n^*dKC47i!~1hnjqT4&6$AXWFj5X?iZdasPZ8Dgy?Y&%h2qR5|7DFWpfuu z16L6PBsP)Wo}gs1DPb9M3f>siu$&iy#1{yVSn%jHvOTC!Gf9Mba1GwO@4JZFD)u-{ zQe-&3Z=9wPVLqj!=~=^81P@fVA_rF`plhyYU&;OQXCDQjhGH)INM3}0xi=y)UYrEz z;v6i=GrG=R151SA!@WME`-V^^%LxHJ=s?l!Dfs(uV=7Lc_KbyO8GCBoktG@W=Wxgq zOwro}th11yU;b3V{PeQg;wNmpMHyO_qqP+%mK4pxNa0N9LHPunE+E$s{W$rxas9mT7LB$$V@J0BGJ zBoN(^Hn+Bebr7)qK{z2mfH0=57g?qAIKogUW)1CN^8gl8=074WR(j2uF2p^wO#X+! ztCmZgbYa~Fjb0>nb#PMRRt4ST>;fKG46>SKLn2XokwvdW`!jqsDs58^#z$vY2;-jY zLwZ4+{BzMQu=xS@iXI}y2aUoC^2+fx&QDTzWFuu3P5FU=LqeH?*N@7M`)pwzT$@;! z=aX#4K4f9+I1ky?lRBsSzNsHNltoN57wU2oR(4N1@@9g=Ne&nU8~yZ1VE`~RIuzpW z51<0AJGAtaj9e3N8<%>|Nqu)pioKh+eHOI6vWFeq8^Sv-$A0@B3~l6LZQoG@v+E!G z)jz?QG{*pe^ok4lNs2)AV}liY0)ogdnwNSKmIafNUc*%3+ro$Nusc8%#DeF+*j|i> zCvlK^s+1UOc;4ko+M(oEdyp?w)S()hCQKD<4rW+-!~rXejA?s+uubZ@zt3CG0H_XA zx=~$>01XyyQ5(AiZc^`X9gT4E1p)-!0Z!y*vbA5F|8x^osGf6>7~h}>Ro z>r8J4c5$e0+(f^%U5-E|V3+`nZ=B1#z3v>9Uj;E$)^`(Hro2J3O$!RE$kbw@|K$#hGEaPm*Ffu@Eol{&)Cw%Hlg|XJEPAJWY+&y3#@uXNf`i(b}xr%B^3_ULI3Tj0%DBMeJV~gV+~4o zHK#N|QfY~Z=y)N_DG5!(groan_v2JXEMO4)0x)MQ1AoGvnVOK7bLXhIoRo!6C-;ot zpb!}xJq_Zw&cLP9p*vllOnk4R5l08l73HDu6hJ`JUfTZH4Vs%EqJwIf!9Az}R4N@G zd*K8_1m6X|CLH(T%gV&EaRW9R$?NG))bMBnx}xL`Pe2HKu^U<4n8Hq=I~= z4J+^G{F8{mpE$*m>hBeGt8GL1VtisqIXibrQ_orVLQ?892;2t|a9ts;EQ*rc1rAe0 zl(>>#J=)4cQ=njCQ3!ayu^+qsdc0%zbw2lLu7r z8FyK=XBeOz81g~(O9t3{|Nd{lKxN6Vp#SEUIb1gd9WMITC2@@l%hEwx-Xavsyr~;*gZZ{A0gBHk==nmO(*1#Hjva~C zo)nx+$Ugf~X`Rp?l}_&2tIl?xR3>E(KYGNM+!yHu-4ImLdM9QPKsgIEF94`r6l_-h)#q{0%B(I3?V;u+!=G3A9_YK&+N`GAC~A{k+_7a68d zVNqdKpb}*i{^dLU#S*xL_JyQ)3`vf2(Vlm@fZMUXA!m^spi3OGalnk}frJXxMdIq5 zQF>$@B^?bKU{)yR3}P5tMC+`02`$9nkxD{x@?+?R+gcKi ze5LZvwk8pbf2@_0nr!DglF7!-@xJ(}d5;jWwN)b})`7_9ta5XE|BDlk2Ep3pNH)Sz zsfLtgkSjDd@!}{oXOA0`5ULRGJC?fHuaV|EaG~md!@(pBmy2Rf8Y%3u(MjH|+U^x= zY556$FDFOYwu!yFvH;;(+mVi%2d!0BU=yDBqw5~At;ws=cMfr|{JV^~}cp1?u zPWohBg6)ma1r~>9N52xxnMef$;|!hLLK0eI2~%RV!S4A6c{BjB&`0I&pd^2LN>%@r z;rU!BzbqiGioAUESrHbJqKi)N0y|q?%a}Y7D2DzTnn)6cvLM)uyTPCAY#H32__IBW z?QY2^Lv^8@QK_mBm=@yV?uVO@LmH8GW6l-51A>F%d2|Y8_HYm>+7VOBU)^&7$KTb% zi;c7#mm%#vy>ZaNfOpBldp58PUr|0rFmI4AtUKCZq0mAP!zpL>BdXxzaS1mAWtp4S ziBfb|xZrDwA~F>9t%jFubl4qgwfP#pLtCtrf&-5Aau)xq3IJ2#c==c8<=uvojQZkT zj^WG@;vyV)%&DVNR)}gpVlbFN5~;EG*{%h(P?ii!33Uw}9X5lAzqo89?JOId)B0zj zKw)0ycdWOxF*>D&PxHHm#|o)mX|+eP zbBMqc9C&PJJG*C$#fa4LU5BNzh>dPsZVAN_L)?lgou}75zfg%n5fEg#Mm0Ks8S;yY zlo^!F`BC%KOoh-5Mdy>+nQlN>-GGoM2D_dEyn)QpPSUB*QqZ%aXn++3rbL?%vn#*k ziVj8o5n!DV-G-CvP45}<69zrhehW17iAb#fBi=F)!Ec1(Bgew_d8> zFe|4~m0hu$!ufKJ+FbMb>GbB+cjCCcoe@Q_PpSlyL)1WJK+rO1E0Q5ECQ<9e0PdHh=Eu9DVS@za#hr zp5XVM3-gzB8Veb((qkb=;-^L|?|!y?!|G9u?g>5i$)^#Lm;ux&7!FGG!m3lo^HmnU zhI^CHJ3Rbh?QnlJndco@Tt}1n?Xq7(q7a{{ksB%$O+K74=0wx};1h`7LdE=~E(`Axxna)N3>_7R_e2e zE2BX;2-VII)LtX_c!;$kViWt4Mi~Ge^ z!T0Ma)c=M_mK&t$fNwHFJGj~|_I+N` zgpqPk*j<&9p|r)KMp)ICAS_J@1hgWw3IyG{g9(wH2NMAYdsSh)2g{a<_Qf%EgWWAU zv4GB^6UFIM;(V2V|Dxdy*akL9STe{6C;by#THfyObNdE2B6W}%R>a%&xRsF=5r0%k zBW2W`j--A7kC_v}YbQ3rs-FluC?j8(^&{enQ80%{?fDGZ0@kW=Vp=sgLfx0x%*Ku- z8-TGr=CTfYZC)X`1Tlf7s-c=Py}*I9XMNn1w^(47fJXH~ZxMg{z95p+`jXHR_>Zih z!-M#uZ>Owz8q=OgZdU=7k2E1KS#}4Dc)5MA*0qa<_i54lCXHcXr%|YjLzD(ZqKBpN zsF{+&wUpVR0ulS0#<3$W2s5CR6{(i@uIcsE9W&O#gCn+Vco69q20IK9%!g<-AFBc% zBJ=~yBZ^{CYa7!gOKXCiAfR&jdYquvFo6qk#i;ghwhn@$fGkwI z9eA8;6@3#5V=kC8uScw*(CwCukc)Ox{&oqHtg3AId4VihumFbxD0yW&;Tmc?K;cg8 zQRw3R*dxeF+u(;W`QhFnwuf^+t5#Sop5#zTP7X{o^kLM2LPE2>EZm7ORFkd^>U$C0 z7?oRP(MB`XaVfOm*5}hqpZ_7CiJE%67!eV)OM@KFp-R0kbA;XlVMx=7wPy$@4qY*- z%aRhS(x$mceiRlCjN_$0AcBS+3@eTyRjQCKt@V__UR;x%h8(Mk|B2f1S zH)8eS+v+I%JM2O>u_^YDumtkau#MP}a+2x<&_e;2(w2CepLDp6VpL=mCUzD@GWG^| z;C2H2Nex76w!a7-{!=^D{+-Y&_cF3Ap@1v_-N@o*!OQ}edG4K>MCPINzRM>oE67u} zd$wR3u+G%F1D^tk4Ad%6U*CaGL?n5Jo}4exgF~))+#zYFTMn!FI!5_0%eF%LONv90 znkQ7n26_5 zj7Vx9fSB5zjXkQtr7)=7bFu|bZ=@IMq5YSHmmYac5h}Za#ZT|V9qqS&k}nq6Sx}y$ zCnVpJv5i?#twK@2exoN^rbrOq8ZHuMsw|SB&Oo4fH|XmOP9&pdSC$+Gos%dbN97@& zdyO&)O%mP|t0zoNg_5j#JCDZdIInS^SGMZFmGY-JQAF4t>1S{#Ta7W?{TAmHw4x9M ze?W)+fK_r?Q1K z29AEUpGuCe88l=$72;OPvELVHVl{)#*6wv#F9!4K2m&9(vh=)M=Ptb-A!I2FqaxoN zu)q>mxfJ=5TFE{a7@B|4^8wUo9)_>M;7(*jF1KP&DiM7#G;4nB5v9K>Dc3ONk-$*|Hrgx#<9%Rp=&C{?r%QMT3Dp@XeZwBjq_6wz>N*~ku|M23=W5-bs?S(pU8NCLUeUW`Zj8m z{OPT$VjLLTv#(i&*9;VShVX#BPJ11 z&8Nm^>#R6dEhcE8T|GPak)!={KKbb0!DaUlZET0*&qF@pJ6@cs{wow`>;fXyQ;Ip& zI!}V17e~fKaccMrRrQh%1F+Q5{_2%U$N)Kcd%<58w(7u4a%uv=3xN={NFFNtkX;ml zve5{t4r;cPDLl5pguAjV;(Z#%i2c070N}nhe~iaIjL#7g8r(Zw0Sh)gi|5aS8fx*^ zK3HILI|g#f2P+qF!ul~~b$d9?HmVMlFaKjj{9z(z~33I`!@? zKM;IZRmUkRVTnFZz=WksSR!vIG=iE?0OIi$NNH{Cwnw&a4Xwm&3S4{)P;`fP3@Mh0 z91#jjDQOUWP>_%iV2^MDC8PvImHku*YytEGf*(j1fhYkIi(VikOQTNc%mUf>lhE0GbKipmso8Uk`$37%84O4^l3kU)49 z){#?uiK)vT!CaKLo5wh$92NyBnu1Z#4~U901Z9!qTvfV)b{8sySSt^qhr-o!(?@&r z8@QDBF>@JA6;0qe9@P5)9$`?>BU0TLq*ttO$~+#>kOy=2Bf-broEKHuWTAJU7X$Q| zlwF%@d&y~*P&2^W!m-Z>om_VYK`FJ;#I%<*rIjrwUxL&5Q*hB#^kCROu#=>z;4%=< z;rFL{*bbS%uz2ml>A>g@3kY${E*g+1n2y~cU9>34NSs#z_>{sr15C0!8{SpEm^V&h zk+EAXqcMe!C2WxcuX z4yya%-w8I=#a(J*;$$g9y0ZzQlMpXS2_D)v57M>-LOVPbdYr~43qBJdmI?8!WEN-b z*bhoH`tJa0oE_U`J6vD6h&3wIS`JUs!vSZQ(ZVx!-!!?@mJSn&KiIlx7JHp2Y9_22 zkQ1(`BlAQ#QE0^Ibt&M|$u9}y>Q0x9V=~7)c;eKq*TU8*DndN>GZ0DKVS{x%Mn|Ez z!w~Sfdq~5vq~3;;R)~m(o*^ibssSPDWC-Xsa|W!!QC@_q$8k}s;JlO>?saZHH%Q3gwd zpg!ppo16C&_07?BdNF0QD5YyFJh-WnFTlVgiUMyZ;J-+A=yiYqPgOmXJt+gLx?mC( z6Dtg~B36C^+hP@OlEwEeaLeRw^7n}buuexjkJU(jhcqE7!f7AGT0*`NT}1r5v+raE zk}xO&L`KOU1a;8I3T|w~3P)30fUrlG07~qKUBtn==o^9$%FA&Zi-Eg3@m)g^a$|$n zaGNX;=Cs@c%dvQTA?>~9=2Kg1aKio#gg|=tO6nCj+;kPS-&I`^i%AlK>~@I`OFWKc9^0aUcuxzA0xBP0MeK*_&3E|nU@qf*3-S2_-s?z` zy`2mO=W31f+i62(st`x=h6fciB6a>7V`cB#Bc4FlUVS2)7UQR9ykx5&+-D!e&+iZR zil5hlcLd(e$fEIoY@Q-8nCeP`ZX_nYczd+im>i3yv?8A7NOML}_ur0-?~4*vk@UDs z7nbp&p9Iy#5fCXzcH~YX%m7VM>6LBl|An(~W)wY&xgbGfy(cZgJpdC>DhT8!5ET28x^v?>%w-y*@@e8iB4wsyC{8A!03VJ^F=N0q zVfLA&C2VVlv`v*MDvixZ23ZEn2*Pj%X%6$)!9Kqh!Y2jNks@}4Jz_ITUnr$PIzwch z55N=x7XAqtqbREuti8g<%8QbfBtDA&Sy2i@7CuEd8tnWIjv;0h#1c_sHV0U*=P4Hz zhy#lvECv1P5MvUjqa!XP5tXV4X@==fk!_`Dv{V#WtoDf7H?q9R@u2`N|G0`6@X}!^ zg~TrH14s`oasQ4$q48u!#9%|nV*OL84Yk}TR0za&E#}Pl&5GW6kotR}QUZPl7yxVr zhSmlfbT9^dDpPhY6>RJG!PJO_dS+-2BJ)m7UCimqbqxi+$;72xPaIUWT|dqG~lp!8{a`aN(4gNA^qrYUM{3 zx}{Rq@MFOnvV1ZFHW3LNY^JEzj_1Yv(rW={#NK53n~ksed!O>}z&6_a>F^j!CQ5xT zrxsZ$hr!AAZJ%ZH$-intU0!JCDMwP27q{jD(HXLocqGAcScmmbpX6sW7|G4ZxCTnT z+r>Vi;S))YS@W=$MVgY614)hx2a!N|71GU=|N23ouyH!9^w=G?9JdyZlV;iWSiX6tpoA7E)L(=N6qWk71*l zol>U!6Q9RR^&S=vrQEdYQuTELVcH0k<$K#{(T^pW2&7CjkJWsQS{F=4sCG+-9}S6( zcY12!$QZmGU_gf49kalQG-y)o73JHhKW%}Y2pj8@7{Q_NdU=W?Kh{EueuQ5PgDO*2 z=up{9v(2)38`~c%d$rYN-iXv7t?*4|)&F4Vxse}zs-XNH?4xKo61z^m zIctVVj?UwQ%`7iyC$u~9-nsj%_p>+{QLB%@!(`y{A|ifj5knzyHnJwz5YDp97M`W3-!jyq^3tbDL$0bApW?=! zRn6OvZwi8|b2po7Di3elpaQ9HIbCLR)WJ}wR&(3ph^lA?AQ~uhW>RELoA|zjA zsmS|>ChIP`$X$wdw38|9Jbt6nK5^AvLSk~p+QXFE8;q9UY6cHh{6hX)7%?zNNS(pR zQhxVIGWDq6j__Rrvi?Q;q@+Tt_o0&%vs6@Iu~G6Ee`qJJAkw1~MkN;GPVxu)7~1GE zcY}KDTf%^JS8#mJ_69dWoPHw;KPC_PhzuMm>v+w7iUf25I7yKFvpO zqW%B>wD5d3)Jr;&(e=SHxcy5$zrP}D?5Jlvq7EcA0Ss|zll%^&+_jG>9(CVlL9wPo zk<~Ol zEy51B-{)H2!|1Fm=S*=7f5!wBSRnQ{+F+}fey%2p-o*ddzv2t~gvn@_+&@WRICI3E za1m%;;{F400R0_lMe}4S)LIcqNI~IqFjjPjdZ<5>Mn`u2a!f&IZ7|0^GCRKuVbE{{ zKh@OZsUcj=rMaC$Q8NOlJ3pk~kl)e$D7kOk!$AF@Rrsb9;$)HQ@7Mj7HbnV;q`6Al z+~3`%yj&`P-aEjgOkKv`5bcrG?Evu+V)PFn#%4Ig=4OE21eBhVdf1e(fG{&6@E z9rec~zQk3X>vpoq&AxW@16epa7V;LB{&~b+{;PpKxuMcuY>wkKh1g%q3vco*(!d8v zHWJ%{;t;hfM`5RHn|DwZqu9M^AdCyjW#Ctmt~!~OqG$51y@QSO$nw_c%Q7)5Y-k=n zosa+a+oWh}!4gftbcwCO}4k=g8+j=}176P6}sH38#9`7yfM$UEDl+HfXMC_0wC)03(1=QRma{S)`S8mG?lbs{6eO}7Fjs9LcC}6 z4UTR_DB4O62%CxEJJOH>hZ$_Op8Aj>v$z&Gr*|F4}9U zcue$T^qbaGpM>Ti{v_Jr3&M3NRzU==>TB9~Sb*;Z_Vc*{wvAymxMhVYW{2scmrf#O&pmN%|NIA*tTTU=wHH)1` z2?ZQao>-OC(~J5q?)UzE z0WhP}X^aXDX$ISgKs$|T@uqz09`p-HIfLOmjVZX9YdOO~p+1K-gqe?O#(B!q+td3HX7ph_= z#{<15DfM_zQIxVg-Jm}4o8iEh0QtmqY((2tzehybxI9!3)ytHX>}zrvdU-=WIrh>n zSGmM)g(|S>;+m~g?Zj6Ql(fDF-+@HxzCQbKh3)p#I2!E0``Et5Z7$HGkjNJp0?|6$ z=LRPc4QnZQodI9|m1~4Y2&wt|OL=j!5k`>!s$cGFAO(|bRLO$BtFhLga{2y3=*%j@IhklV7U?|H#^VF#Sy{kYRg8>%%@xUG;do&j0h*zkQ8j z@ZZ&osRK(sXq{>|i=W5uKh~0rtILDPhV>tT@1M$K)-v#(FvJY?xFBZO{RP^?TLb!f zU<3UGTMp$p_jFc^0eLy9Z3YL3IRwlJdcKhiKl`#4$zn$S<$gx20%*szyh-h>L04}qeOVHkeESUA5f)=h+Ehk^wg<}coEiwsdjZ3{*1z>=HL4M>3d(A z+IjCe@i(xEzZByU4*yLAl3fUdI|8)u)tP9Le!P9%Z~9S#$z$@Zn?4(=S%d{3eqyNf z8AJUhS?bEuQ|}xrS2^YR`Vuq!feIsT0n^t$RSv8iZ^QiF#T!q~s!C92zPHD}o$~A~ zABc&+w$!fPE`(;70xG4UTo3RPh_;+DAU+?FI6w&XOFD~{-4(Q1I?o1g5q6z(9=nfA z0?MFf08xcbR=Ws*83zq`h~RAMBR2&u(PCkE&8nDxFcGJNd*)GO^E)x3$WY_O6FjzO z_M6_NO`WC?mPqoXkUe|B-~EUHScCTu_1A*qoiiRn3UZ|5exmyk*hXIN5BV&qsKS$% z*v~ACv0zu%6X>%XL6T&@ibsLof|BIWxEz(56pe^mFC!I13S3i!7N9HMb3F&mgY8iR-?3;F1AEG62DN z#0WJ7eubhqlw`jzM3v@pyj}D=B%V;Jz@82q0@+1;3Fg6gc~kRaVY?*D5FS)8NsB-! zzmXUU-~#*4`TT0P;NMIn?&v=l>65BNGk1UXI6qMD;~bH%&C%i&CYKg z$99!3V^Cvy9}4WTDkXeM{k2f`4I}mZGW?P7@uqsbytBW%KX5-7L`fKyY+Yj$VQnrL7guV5@ z9FiusiqCb-^uf+FFxB@b>~{SGxXPaZXE}ikXJor%#1to9CVmXV}-#9^^g8y}r4e3Bxi!3no} z!aYjlBsuK|Z#qU%d7|lFG&S9)h|*O7g@jxYf5R+_Ms*KZBGvQa%3oY;l zhhhu84Su3P+cwOvNjtHhngW!PgL5T!3Z$QdLKR)qWkXVCFK&L2+3|G>(?gMhDlhcO z4L+PIJF>)vhWow66CGCz2|*`jm<`Ex&uxG>SWawowTveWa7~#q%HcT#*v8e_)ClPtVU-afU0omoI zNqi=N^s7+Yb;|<|fr*X9lkP*L1C0}@#XgiTksU0IQq(T^)=XY=FKtObdBAK0Q|$Id zT@wJb5t^Yo>Rx|;{hP2KRjxIT{pde^P>dPGu|6m{SI%P}nK8*m;;)UzYm@A3A8PWZm=gR{qVHvVFiedaIE<+rB-$SxW91!)&S@zofR zC$);waX+fLEY^Qmxunnmw``p5r?XJoZBBj`asC5G&`xKwwFZjjP}G^-Srd5ur+msFWZ=eNf*{x?3Jk zC97z5=DzV5)B;LC>Ft;Mno%f&#@YX~kKzCO$@ey6f6QyTFt##vmcl>_;JGz6n_4R2 zpOvCrzn^@+KFQxtzB|~<8DWB5`d)vTrnA`J_p5ydTr}#qgIvX^#5mxhsMr1yrM{v+ zG5QEHBPNgBpIDP-*gPnWp4T&Ln8s8stycPIkw(`>HC3`h6>J}wMPA(8<51~`1g?UM z!@)wS)qfyXP^1tmb>e`NjdTIAoXc{+=USihiwtQ~(~tkhW>}&o09>Rp^N<3{<~}-` zV@!eT8L86xUyrUbbbWB?`~4;W*Y2-B_A7lx3$y_<4bya?NDYxmTNjgPRxpg0HjMeIfUsFA3+;D79B$6QvH>h-ESL<{eLMlQ9>c1?a5^J%KEs3aVShJ% zc?(&nQHoZzQGO z2127LS-;S4Lj9l+rke@!q7YQUw-mHQ`in|4fdC&6unre-7u+ARW%Y56hK;v?TLi2& zc)-$vyRWtxiungoN9Z6ObaRD?tukq^fGh|pQg7js4<(WWZ!Jhl-0B6G9amH>yqXjt zT!inz7h;g(1(p)}OF;X9um?y6O2?4LHWnI-=`M7rep$zkDme#qo(>3#Q1GW7adF0| zm2X}n()dX)igp8u4Y3g_bKENq99ekRfZP&DEv66$bQ&Txq)R$kEJS@e7B3^-quSQ< zy~iZr_EU?K!1pAIHTA7tWx1CZ?;~i_reBa+kCS~P?d9SSv-z4-H(_O~1X%$qg-646 zdz(f7!?b1L}|-@ETRu|S2JvEl@7bbavK#9gy+9+P^QRrQ6aVlEtb z@F0prO4zH!)BYo`@~v=he|BloM=oUIZK0KxeiD0jW>axro8>bbpG~i4bT-(IVsuMc z79{M;qLu<;6Sh=UY&j2Da_TtJ*>C4kDZ*D{*}A(n1ye?l^3C)cqzgh-*HuphJ`c}q2ri*2x3IsgNEgkaDPm=d3kRoLo?bcWuEwd| zi*P*?dqk!dV!koF;n2*p3%h1Uv)kHpP#lG?9GvCx)Dg+ukpjXvObzDBa7F8vdFX;|8hr{d!-S4a&(4tk>X5|7_mfi}^@SG!%6is~3>RzwbwQ&t`oy7HonJ zQ3Jts|KhJ}^3=-mTX*qF=t>4w)g{s=1m2Fsdr^y+&3YcC#3EQu1Op75m41!45ABy) z6disV&8Y$vVkk{jxjB4-K6h{~H(a&(sMhjo|DH36gbk7Jy296`IjZ97xd+dus?OVR zA&)-^_vi3vRu*6D_8{cg1=ev^gjygQwq5dbGzIMB)&!~}O8E`u{f|JXTM<>^oy@Sb zEd&p&?*Q+A=<5jU#wanZ@9BEvLQ}4Wo8AWUOB#;hGd$Udc>cYYGQm%I$MPS$rN4Cx zSWPmmv3ZTHgg-tb_!wN8h!~AZTK{l0KY5&!`QP#&|HppeuZ`xs!@^Vu^>)1(61vC{ z>cZJ^e$mlyTuJTn%uN_d%yRl-4~|K0sJAV`)^gNRRipg~SZd#EGRt}Uab558EyB|- z_9BSif8weAUO$ihZ~hC4W)_961aJ>qRV7Jd};Z941|{D8PbaJm@M(9gW~O(vYvyvs;9KDndByi zM38#!6eKi0pfwX-u!iVRfdi=!+0h78bnh1NOR_{F zw8yUPgBd__aBz6DkUQLUkfY@oT4NAc!-QPaYEHWfcvRt||3GgsSx-q>2Y$BauBU2D zcrKnOTYv;voI$J{spU|b^V5TlhF0BDA}9;Qg3wiOJg0_;^FoEKPt z$WT6PjI5jFFr~Q#;ZB1yhGcfqL8)q`l?ODkteUl4nZeFgjiyGL_&5W14t;h-I+QhIc&uY$t;V2R#}jx z7BsY+nwWQ5EHp#$t0maBmD9(#y{!Rp$Kt7wFbh+DMg$HNWgqa{VJBV z_s?UA+Z-Z*94tsR1qRj2l6=At%mTnSNL@4kzz2}yI4XVuisTs`H1jY6%{k|yku7X- z4-^kC4@9Lfr3xIlvSLY9af0qy|5Md=1XLNCO=X~7_gv$%>jhk^O@Q*a@^sbGCpTgG z?PjriQ5SwemdEuATv$tb1k0Gg#kRViqX_Rwa~J@JP)y6Pia&$cnA0BFKoVcUi`+(N zoi8xIDvPgtFrJ-6nT&{BowVUllo|et+DC};K^YltP4`3l84x(G)~`7RU_KRb{C2%B z-!%RfJV;xHsjS{djhO>Q3HSoA(rK)gc5DsANmc5Z3TyD}y9$Jf;j5nFu&D?%)NM5I>QE znQ21w`o0=K|Fe)Lx32y9Kso=+6|b}8LTNMl7G{J+YA7UB;}G!J`4F8-mjs4SvJg!U zf&W0{Bj4|8F_^nd!G3ukvFwQ9dA9&_hT`3v@NlKOFFS_agt9jtgk*0Q9vmo)udUOS z0v+O+{9H-Os|Y16>K7=i@9NG_RXIC@O>K>!AxMUOLB^_hBNB2rQKYYYViC}GNr*$V z7mDVSvgT}r;W(K(3Qffm{gXszpP{=64m|8{%HNzrhZK^hS94GcJQ-39*zT|jmtIn; zMu#z>f?4GrMDHF_ux z=1UiReQa`61V0dOfp|2@R-6B;qU&20J`>eG2qVdsj?ke^{66` zdr;vFstN0NNn8M~h#Iw|#xd(E_5-2QugIPxT-f1pbw{qlahyvj=Xi2DTBtA`jR&_) zG+wIfY95ZmMz>DkfJ;B{kwqzc;KV}=KJ^eI`y*gg9c*-FiMTIlfol{mXBQf`N)gMe zpBXe!cAS{f6faV{qdQuXVNhrTvw2Ps) zONn3HL`ciPm}buGry~T85)T@PBiW0W>N!f)Xe#nK3@q5`dY_g1Ra~@6nzt}JqMjfp z;6NY*at{Y_zMAyS>3h?ilG^;3#d(T0^t_f~Ng}Zu!t-=Q5U(Yk-fTK~MyD$68|j)U z*XtLPm_$WP3g(2&<9_UO&e0H26`-#6XEN*-Dpl!NOTtzrc{3wE^&Y2hkfMD0Inh+Z zOw^6|lfVq}TXclsdX@qN_?vi+pZbS_wWDi7?`hBtv~=27HWOq5-0r1RKDZCh9e z5vU1VU{hk4G+AUjp}A@GCHI@jun2@l}-IOZS`)78ObtjM|L@Mt6W&Za?#6oc>9&4O;-Ss0~wQmkRBnJWA8PVD=*4! z$6i6p(TnepYNBYcVg9lw0VC6(`UX_`-#WdkR-4(Q|!LGn65Nn zE;Yxi%oZEFRK`w7-K*n`>syubbxYql4mv8s{qPRXe`(RKv1L8k$|i+y_mPDi^lH>{ z6yJ>XGpTz}C>XT?mWdd@@D{6BJWXw>J5Q1vQ$5@nQ*M9aQF_M3d>q@>&tvu8P!QqI z_1Nz3>(0qh=#=a=6^g`|qQBh#E~BGmdRI}hdvt`OcZLN?G_8*=;rm`8Puh6`olfN4 zJhWq{flkANgnH;{X)C)v21a}W@Ux2)O1EAE-NmXfOo{xGLb7@QA&7c6*w~}yW@6{t zV2rjf4~B14kva%yDVORIv~#owjk>f%;8a*Vn!0zOTt8nl38z>a^xgzo47;3ll4bNl z!ZdA9z$=Q1fwOFQGLOx1QB&XMv;^5IWfl!BE7|PkaYa^$#QcS>7n7?1f1D#$pE=uD zP+>1bTzAaKe5qh%Q3GnbQTSiYV7$hTs&m8ZMCw`zuI1$?PIl(23grhuHW9>srtvcC({Y*HNb2@U(AQj6byymoWfUsffAyJdgd3aEpb7 zAS0i`8+lnub($zdK$}hh4sarz*!50I_oWY-)T3-IBgjml59-Ai1USvn8xr7jxjcsW ziZ^kr4t8kOw4{9&R>>v3D}+zwMW984mnK6hNuC9{f{jP~+w0#=pXX1p3av>gSQ$^s z30B>Eo{VuyPt@v6(lL=shMdO(O!zUgh8bWAT!|hzA-k_MnRtwn*-Z=xVri zayf=Kd7|KbCz9I4b()BRK;>=#yT`~JAU)*dP>{WXgF$)o?Ejj$76CF*V`B~`bnG%9Rk0Mpk)<3Y&7-j;F)T z0v7^PC3OL!aD3FNK=BSeCRkOm7ZT~mjCK=EuL}{zI9f6+&tXXo7>fc~t}XsIa=`~0 zWZmN;whyn&wiKwVW1XW`5mAoq%TUN|SwZr==rYf)6)Kc$C#|{7DtHu5BT^F4n%NbZgs7>P>br?S=Lh}%p#**6&E zN@!S=9@?xLdxq^Q>YxoBwaDkng3EW#1x1k4e))*wPS z)*#XVXs|NpMPcIwonOpT?|T!zvu!lxVoB6pdl;4^Sfmm#(z!;hUpTWc~I1 zxC#Dq#A9a~gTk`lRz%q%$q1_zfi3vW)9q1nLDCx7!0H~2c;U(QOw#pWoV!lv5gr|5 z`Zw_`N79Y!{+gw_{6bg#q!DE;nPW^S2q>c$j{wQr7ZfWjj-=HKW@X0Tr;LGv+nL9y zZb>?yyYsZs12T|%h$ThkU*3!?hw^Yn062))$ftXUvwnoKBgD%x*!+X#{h>PrYm9c7 zG{H=MavWPotsc|Cb2=gHQdUSs8s_N-RRjYlRtYW58!BSJPb*Lw)p{fm z=u>FB(ryBHOgG-43n&3mN%4qq2#5wxp5}2o`k#R1WTP5eyAnR`{pBgrdU1C3cpU4$ z|4&(>>daO20M@oQX>^~%Ho7k2Z`jK0>^p^6Z_qMp9JEZOps^c>ZCRaT9RBsF#L?ysqmDLX1eY@6wTd`4PDsF zyX6lE3t>6Lcm%S7dugT^k2-Chma3^*@?0hwJahX@55ND;9h8*y60c=Ldb1z0h z2IAG&6r#I2w%6_$Qa7qnf=8A>Mqe9U7j6^Of>nRHvEr4*_u?_h(`1H)uqHeOuna3z zv6(p){=aLOCt`AHXq0vbrl3k?@~#| zBqbFBD?367X;ad{kFz)sAy1d4Dzf|V%o2wjrQs~lw0}79mhdg;siVA?@XRlE6grbV zN|l(r#bryaUs9q&^Gb=U>t(a~r6)9};_Kn$vb z493u&$Vi6oKRb%H+7#yUU|hOb>dutQwRtM*k0|jhm!YpWkNq?e+CvlNfqcR~_2cb+ zcz*=qq|V{eF$pa%o?FcH6;#ZFW#7Jn(yqU$${X{S^$|lIHmLaxut>h%Gw$YfFpC$? zsUc(9p2KEUqEgH@TnKfYe32-C>lgyy7;zNx%6BUge??btyJDCo0uEHg^Xb89L)6j- zYyFCvz_cutv4EO8fRW)&Sk$kVSN24WIOKZZ(U2jWBGJYtw3{Y73H$x<{s#GRP4P$g zg;;P2`$H6|^0Gi0KVobgb1Zy|59?sFqI3zZ5U!SEp^Jm-bUq=NL#-x?m5flED!Y?r zuy%utUFPI1p=~{($nthWUs^~^BnJ)!v@Yy0uS~64Bc*JmRi7z9WV~{+po=5W@$Q33 z*2}Fj>QgaVA%Je1wz1Tkqa~r;L?cu@>P2Su*>ENm0bg*gA$&T~{-xx|WVsUi=ppVh zQ#!X!K9J|*oCafxrMOf5y^O>MrxmJ=maBFmb0$hLru~)}A(?E_^8^hzL!%q>y`vNT z;sc|c01Qy2CYb@#PPJPsA zc88}@=<5W{(hKmqXaq85asXWtiDCrL$-+rxCAk>S5`0gfib#8!U;^|EeCCAw|NcO} zCLdnTJWqnsBjR9Vg-<4Kq!yF<4KgSgvG+*+4$L)#x}&%S_xZGm{wBo_h>1dT4F?xy zBwiks|I>9!iv&wB0_f7Z+H(?BHww_p&XzW%E>v>G8{Px8akzhhcLHc$hVVNQXM?6( zyW)az61+CqzZC9s>Pwoo22g-6x?*>sMLT<%!eA_IL;k-dErB|s6H#wtXMRGC%nm4U z1x+6eAJF?)ugH2lY}?N?G$2NR1?9T(&Zcx*4^6OmJkH3!v*DA{Nk6bE!lvPk03vf$ zVxw;tx|boUOrD8QVEKt9H=;@kSIkc%KYOCO*9cgiFdf?O3-YLwI9cELj;G7rJ>=eb z#Gc;8CrxYNA;ou2WobGHWX!_Dc_|4X#rlz+H)1#U>G^{CX?T zYhR5&_WBZ+vQe1_2O;4=w1mfpRuZdFRw=8=mZjy z9US68**~YQWmYf?piJQp^-Ahyq;>EhpSV1jWquJ4wo)0D6&^UKG+VhTa(=$|ex0na zJNC-T?u{Ui|9tN=xc5PP9x-!FO?5quw&0Rr}a z&mcgHCZG*%cH-6VHM32a&m!%4V#~KavB|7MFIN@1D4kOAOp}V7MnWpg`W}5HXUqLb zxf0`>le){0?wAwzY`tpBrnX@ip=z??QR$7n!|;|}@waG{w3f@Uyw_P1$E6$V?iQ`s zr6+Z%@7#8~)E9P(+=VIYA2jmS0<|V20qYOjX>aJ}2jE@w*UeLLI+0bLiox~Tx5-JS zhgC2SsE0}tSy)DvU*_X)&gM|iOTf?N`UWR)!UocAu7A;!sjndi(@KOi&)7& z$u;a*d%k}Hi0-+|&-<^~q&k(fnr<~_O=c9%3k60x@+w92zLPMr_5KYOYe6m(qty|EviqAP>PJreq{ch&i>!0~#O{e!lGq$5ZwcmoIh|Jj|t29F=sJvpKc&KN%>9r_^ik>t(ei{u_tN(1r-VV{P!nRf% z=4edwI<~wz28$^zXZA!{?`M1%uHJ`j!>a3wIDjzZ5j)Dl6N^jqwl!;GUgASfFS4Ue z$*D;MDGtHI%>zwD2r~r-h=j+D_H*nbgB}%S$i14&!U79;lxcE)d{%VI#+W*X?B)o* zN@&86W)rtG?%?UDPblIUq(k>eYf271gqqeGl${~#L)$-mi6>+#+E``vS}JTW=Ww`{ zSX1Mpu2K*yBJRrxjPKqpMN^yTlNZG&jZm1fq}}iT%Q*LJ9+=YBGm0-=0IJNG0^#56 z$5%ni363D~WBHho9v0OJ_B#ks4J@2SjP1Q_?QC=QeUXrZnBRF-aCI?i_9M6Pd>sll zMeOgLz?RhQEn0KUuSgZd=t-qkIkD+(7|Q2+YMVaQcy>^g`_aYVZ1{#5P&fpzHMtdl z^0S8a%lo(PM&|n;dJ^*aeM#BtH^q;CgfEGWp%+p~Z^6r#hn!nCY?>eceqWncZpS{1 z&k+)yX*G`3gPEYxO)X+pypHJoX4dXh)}nllG#fd8?d>M6Y8rMW?VtB$wu^l|Da_Pf zn=eAXUt%Dz#a!W$Z1u|9o1>dM^f|+vjtVNKA>>83_AmEy^S0&V=aw?MCA~t#AVYwp z!_j&l-{;UHx3V%Gc`>fm^Pxv-YK9M&!hd*8ce&n@cA{bcVD^WTEc&-Y@lRq2suzSY zfOl~u$3CpDhn@IWYHBql`fk7r=)|SROtL|KIX4eRwt)o;RysLX5a`jc%?`+kS!b`F z9-iAJzZNzPsjNu&Hy6j$)cSBubv}~o&#+u{{v$*^4>_Scax{-^D-KF}0@+as*1LbO z75t3hOKb-3znc~mixfvy&*_dY`NFA00x}^I@v^EbTe?$^)9KbZb`qlfOpfrPJ*-_8kKTsaVe|-LYsmr{v!;p--dMQaKR5NLp*HWYUk2qN& zgOfP>tU}7CTM7pFTCQ$NTz;g|EHRtPTsk zV`tyTB^qp&H<}Roc)vs*Lg3)N`uvnF-gCy^pXg7_T&#`sQoC}aW!`h$uj)eu@TE*9 z6NkF%gkPgVGn_Zo#GA^SvKHklDK9;Q5P}2SX-=|bV&gfbt1+gxWO>D}u~0#<%HEQ#4hm9O^Suu))bn_|+;7M^{2fCB#cxIRvBqMV zSI}H-`!Q{VagHcv(Q)5wJfV_mB!T;9$$wPutMQ6oW1%o&HHgv${cmRCEdVN9)S4ZN zT&rVU&@hXcocM;cwVZ@r++nEP*_N2I?T5Z^JYC2|dXgZ*pR2uMv@8^UDIn0=)5!fg8O796o5yy%O<2^MZj~cxCeWK6@3!!8g)otz}JbbG8 z5s8e;4lIdmhk$oLs@D%}r)-W^BHo98PTl}L0%Ek zd`iV9@`)9-$_R5R1SUZiG+n|EDGg?DI+!CH7M;zDB1TtkK8+g|ER!xOjNuVxj?(Vv z8T0!mnruZXFI9+zb<{GQxS0tfY)+QjG5PRg@R0nQ>l;aaGi*A0t-<#0&?RJ4|-M63bA$Y{pEiopKDU=%p!D-n4oydCe< z2NPw#KS^9M0)WyF&@`ZEpbo>@WBbGha1CCb(;w_vGTrEe0Z2MXsL#Yt_PDo;>GBZj z#bO(j3p-!(aV0D`IE+?-q|DJz|Cgzu&}ZerIK8PO)eLC~iiy-G2F zeq#rV5H2d!c7S|kgvy?P@z-z`!tVpym7RZS@Y&j%*q-#KT>_ygBX!-JwEHr)G|A=; zC}C5kLQ*X_JL0t+6k=gB`+)-dM6nNeZov@KSSnP%I=)u^{;Afp^++v=-CI$t0Tp2r z0GMN8*?73wv%8|~t_dwUvC60o12TlUrjRR~!5=lf339j!OOq+U!z81jUe$)h!2%5D zq~PIrN!lF6OOdv0OZOd9HV&FHnKh8XgO413W4nVELpGy5yNM_MQz9*vONUBuq8)02o*_khsiVOm&r}sOlwR z$DgdmUj;k6H}A?lw`Dqaj8yxi)pFLqpX`SM%gg{gU3-Sk^TX&iEr?CH>H6s@5q*nHp? zN|o=9lM*rj9ByPL15_=LXg}GchkA!u5u}YUxcjkfBgOHMBMolPNL3byX<=buBg*$} zAb4*CwOW)&;|>TG@q~)nA&6;Z(zLfXT{)ns=yb1}AhvKM!y5se z?nntKf2Eb9!I+-$V~Qix1L*-*Qup2VAe+&dg^4N`hs41fI1Ckg?DGg8DBcDjOI4Y2 zqDhqj_l4XlB0B14MIxg!!2&DB^}Yx02qHCAf_va-`Znb+a$Ge5>6hGsT6g~ zCWA03t-B`obG;6qrvn2mg&knj)>-dLV9xY>+3|)wR5CE-iB%tml z1Vi*ym2{GK3_fghu1_NZicATFj~V3}fCEwzl&S6P-;&*f)Z^aJvB?+;4pG%;@z~$k zXMt>B?HIujgjU3CQg;}n%D1Q8l{dsYVZQKsgHvc%O0Hj4g#7YWHIzMq*^9#l>4G_l~rU_w!c3OGqP9A0z`1L?A6NK{5WRE6#v{2JSozBE=XP zSk^VV(-|-MSm3$9;<~XN4hQ)-HZm{DbkbD^t~!XT2P)v8HF-3n#Avq`u>->J86V8X z;kmPW2mHA0&Su82X~D|)z-#H=)*Z-2Qq&&I=Nry z|M|cE`nUHnz~>F1o8g^B?V@4H{q3l~On+B;U=UnexRv~a5{?Cd?0p0OaG#Mv5|&Nz zQy94j#4Juy;@kIe*v>i!v1HXVlT#517&IY1J$LTjbSa7I?0iuA{`$AK-g$A<8t_)< zqC!}-_FVQ8S&DdRoZji|q8fou6s6-bNgYH~c@X+;1x)*%Xt+lpz5 za>oZdt?Iv%%c}}RJhf-VERJpo&O>K8w2Bb@o5*@yIlOkLK;|($e3D3@ybLh@fzO*X zufj4Y@MefH&4%lk44$FOv!<8{(^0=>w1ohEjye5zL)ksfwZ^aC6#` zHO)JyA)+LR<57#f266+8*DNcrbBROl)qxQnxTgQly`UZ>=v!s}a!ima)`^u;`0~Vy ztZeB&;p{I=nKYNPDjDp_36Syo{uCEJl~@--V*AfzlXHLy0YYaVHa)f}@wrQ4#dp(l z`oDYC)xuiE_W%FW)Db#SGaYmX{R}|y^Y6cO9qex`4BrYuQO9EodX3JLF?2>;?Oy>_ zHo*J!%nk`0IjrX*M3R#dG2;&b2m=I|nwbEgyz>m{OUJ>^{PeiVJHE68xxDzu(k~-( zC&4L%y9B1W!yK|5a~#XUO?V}59*&%-*xg5@A{E9;qjit>ZHzg? z=|_i!5cvNB5P$VvDO;9*$qg})@+axk37s!-=6Rx1wFoF0h}DP&op~oMc=WLpXjP$nMfWW{C?SHUfTMhV90)3y`99=8 z9LZ7|E*RxIY{~{(3aP6cSOl*hl7G#BerHFeNB~DbxWDxXW`$Q${fi0~5U5qsU35h& zz!fDU=Da8tC~~_4HP!f&*y}WX5mYysFko$M6B72lEOSMYWt~9b<{8)s*rTfGL&TSi z^?FE@Fds~*qbkI4kOH2CT`?E}x=18e^{YF=8Qn)Lee9V@r_9$z{-(-F(=gTCme(oG zH712wUh~STcNAvdJo%E^?ob+{xo1(0_Nz0eg5A@m9Nrm3w3fv?Z)_7mkhL8Gbg?iG zy}5gZhmxfh4n{H5k?agkK;_xTJbvdEP=6X*OtF)QDNrUH`gv>i5(@?EDK8dP@4YW! z2dAkV1_)qR_EU&xJsG9i`C}V&7Ooh@P$=FVK)%E`MESx2=xAeBQ^cSmNSqdiklcz@ zLtiCx%&SMkfmG;Id=RpR5{r;WXSD=5f)I|rARFXqUgIism+DG za$wmK+pP8ceDCb+KStTeA-^Pq$&pz_&33TJzTAizi!w0)I;;@}JgioIr*b4VG6c(X zh%F2=P~5pF<*HPhxLE62!1pw=fRS|Cz=3Oje7`_appG$VPmheiq4d(|&Q~O;p;Ij{ zVR>Lu^ecK)IN4@oGS)!(DX716r-Kq5?#y76;8DXb>O2*J_F<-LI~R>XDYTtIi)xCt zSYr?qP(trZGDS>P#*AGrd`hZRoi3uv*$z`7gH$8&%E5gdoD1wlPUd2jm;gG3$QZ2bch6Mx@qY*KGDj;!pDN|89y>2d09M|KfOA zau{6Y8yf?;t)2SlQXZ><{`mU`^arq@(Ta;-Qs}x0bpWlfOVt_BDw_%>QK(W{*f0Q0 zdgeIn8xI^LLV9}qFS(_| zt1~Qxa4P^b*pe$M+@N}U(JJ6x)gW$ABw30Bn2Mc{bMoe7sstTQ2@Jyl`4|p(muB`t zWp}d3KxB7#I? zNoYXJZaTJBn<37OK^?jRR2X&*03x=z@Wpq^WJ-TYb}lfEQ5_?)cUn7fPbsVQ7a6coIxpF{XAS-Occ1fEqdy`bxy`pnC z*k?Xp(xuIb?lsLZM5j)rpmj<)@1gj(^5Du(5nz?3p!|QS9fyiF=}xR7UJ?StE<|t$ zwwiin)!wA?MP7cKO2A}bf{+Ql0dBKH=TK5fE6HMepnZNt64k)vUoFQ7$O;)RXM6Nt_{PR5A6={VTv@GGd$Sj+9m)n_ys#K(+_E7chO@g%m4y() za=>luU_*-)MX68W+1}^Lk6=Xe#1vPoc~XD$86N;fh;(O6PH_f`DR3vTcO1W@Zt%_= zvHF%ipi*Fn8(xBND@h9d#ISXU9t`U)>`(oVkkv@2%Dt#3)-DF% za2Yu$n}KHZ+lpinhq8O=2gvMu5O+kL7CZ>`ds)}lo)?<~0hn~uI z>g>Gs5OYk8J>7r;RO}X{?q%-Qu09W$C9ijM?_v z_@8^?9_jz`%zw&hvEoFYR?dmRw~&ZF|GjdcE)N_PsZ6wyN-fdrk3k48|jh)}N z>Zb`*l&jOWyHnh(IpHnPt2a@qDvJpx6dHRF+j{iv4Y3c?`%_0LHr9AVkDrMXpp*ii zl=dMOsI!6tDs>VE0<}}b?Um@YCz4y*4TqSrOj4mRo7n0{OH$h^H!7H$*weg}d|6T= zksOLI#)a6wM{=+jP}TY?Tdxf+^U}URd?NCkldn$|m>tt~5;nYFn3A->BK_F=zn50F zJZU!Qio<_=n-?a@0K0`w{2zN91BGjwN!v*|SL=vrClORjGiMUU zi@`%3$tfXt`hoAa1hVhb<#0+t9#$Ldy**V_;HZ}~NQ)Sroeb2!+*vuQBSNQSCL#NR z^mwCPQByOD&3?!>Gun^)#gx^zE(f_Mc-oR^ryqoSHyjCb`QDSE z05E0eTKW~ypdUBCKnF~H> z3?c%&@l+J6qD%Q^KpXWxN~#9wX?J$*l5h-v{hJy)^pQwxqFZr*JMiI9L|XsOuSBLP z9$34eb^;(7NNZ0w2ttqz^18+~i7rlt6c3tOPW*DW8xp_P zAGlIjbfRb0Dr*eOp*M5i+D}HS%%&sL&ydjnPf$r_P zeW+F+l;q-be}n-1c*X{g(w3~4xPAj$Zg>uIW`Hv>CNW{kbP<@iC#yWJInN5_I6M)i zlnW2n2y_lya3$*u3!W8CqFjVlqp&<&!lVGvJ3DF%>}(rw6Ph}^Oy-QGc}3Z;H%634 z`2C=yLekX9zrk3F{>$>CX1Vn!59&)UpLaTzvtNr~<;PxH`edxebnN$Gw>2=+;*8FdRltRK zk7|<86(l1RkDVQfcQlt5d1Rlxa?QgfQKIYH!$y?;k4RU3I!%=0goGB3+!Vo?*awG6 zOeu^ri8o5wK|0o3>?kA+j;Flv(PRb&2Rge%jilD7H>iRe^?O#eBcTk~sf~AkIG!8%MR?axBc(4vDUKh zRlEikQjYWS{-kqHAsr%sm-Q~EYZpM@;{JCC2|7vAV7u(!_-V&ekkXsMQ2Af{02&b& zm1?I2v}76^?Sn8GP!u)qk8^3#|A!txEBF$iV^AZ#KNu=%|Gv)>n+<=)4I%iy=;jMZ zkl^28XcKs?=kiuZyMG}yvReK_xBOEq`J2GHm|FAwBkFhhp075^q(4U;uCkw%Q{P*B z7!E^V4o)}%RDH>^WUR9~Nl7w&UObE9PYCnnwJDa3WiLalidS^lARa6n#J6$~C4wj} zmoHIE4$68LAYX_aFN$_20)L7Mvz=ZQBo;|5((gpHBE)5bEqCHCvZ!ugn<8dMUG4{L zWf1fUY?%nmBC5A<&r_}kGxN7qgC&raXOmb59`Wb!D33!6O1dpHdn8<(q1m-U?j$`E zHq2Ri44fU#z=K4rW-#KTKxF4?+O(B0ib(GU*-3Co`b}n6?&^VVCRxOdM6}#f1Hd}N z+{l|0kTiCmqw1V(s^7_3=a8N20+7$f97ERZ21w!DF{~<58ed#w|+@d!+!eC)Dhes6|GRrB}L+@N@ONh=|!`( z=?lYMI(Qx-5t3(hpjZ*j;5?t?BnYJ6MS?n_!#DMESW)E)J0yF0&;g?z4g)!ufmXK1 zC|<;j(9BHqHK^&U8rv3?a1xBP6k(09y-pYxAXzwR`Z~NuuIdLGI1ck7 zJ-i5p=03}K1O5;K)D|!IB1H{EIq1|Oaeo%y2YTX{w~ilI0;(fLMV&-7OIb=~X4pXl zVz;pA{^bsjEZZdEjn$fI2T=*s-pr2@{js`d&H*67C#rmx*1<*qD2_xcwJmiYaRS`A zo<`LU5%hYht7hR@0i9O8=(gh>D=WnVf< zoMd;SOU;@FRFf}}u&}HqXB8BU0;4AG^bqTiurUFvSsj_`R$LtWHJwgtb&h_R{>d5@&3Az$Jz;7)rst5Q-R?yR~Qs z%-!u|oRTO3oojCpN_^J0q5=*&i$gS3q_?{MP_AK|QjyaJ*xH1(jY(q_fo%$X!k{Md z5u@*pYc=aB1JW5MW2p#9~W}!UHg-sPK_RJ6$Gh8B`BI>c@?GnVz3qslJN(-3` zD?y+Q1}D88)nAj+LcZu_GzT7~$2KA28hU%qqf*TP;RSSxiz;5=V zGkn?3v#d<^$t$`;LcKi7#G6J=*RDtL*9*A--3a~Ru!E}Z>=22CxoTTM@Dx2-qJnsN z=!&3rBj_pc_E|k8_osJPhPsGZLtu`f6QDkA&4;h62_0FRM_(NW$<>W4Aco9Bi2)$m?SqN7KJ)f-6NA-AN)zx3%z~`*7>r2HAm6FDmm(iQmpd?H zVLQ1$EmF1qUsWx!?sz8`6xRtA=!eKIr)G9j$pDC2E~X^zcGYe;_8F76`T(82!zrNE ziFgIG&8bvpU@tqXC#qFUX9voeFn5v8@R3y@nn&d?v!*l^HQ7E~JdUk6$FsIWmXpRI zDYn4u6>s`VipCiGOY2B*)2WjlL@k@)Dpw_SF7Iza*}y$Q`FN2OM5)+APsnyMvok=# zkZ6mty=|alQQk7q;dKvQ4JitB@`EJuttAK153+)R7M!4wy{oe9EcHLUUEgzD<86fG zA-Z&-UUZf*owlAdAR(aw(U#A0(DV&V5jxMxp6b^rC=M5Qe|2GnEQri$a?JLmY+J~vlH^F z*us}5mkHa2=MYidBp&ueLq<)W_sY`aSp6LE?|S)Nn+@x6_2r@n1%!Hb{#cnxi}0)5 zL`RzJ>zYslSUt#Mx(AAw5yzrlTyNmv!xbl@5^7p~Lc;W(+a{uPqDE6u3(A6GKU4X$ z?A0+AYv8g}niZ>)jx!GldAm6PormySk$|wFmrU<6(TR{KB}W(@7W~>W3UvWsB4-YrO8z>jU?-t zeNc3q1(;px6C9$O9Gx*A<)*Vr(*w1YEXh?i^SIG<6_Q!zO;XROf)vrvsgSJ6`6Vs_ z>I$oQQ`8nLk~E;|brte!ifd(mjy4kTP10r0s&atoxPRWrZttnMq z68+~16^Q+DQ*YUnRAY9>g(#X2>a#~(odk8kq>X@wAQ_4mb+jK|T~bYz$5)h}*t~@D zru-4A56hT{YDasbBKGl9YiPlx51ztr)Q%1m$b;0hr(eZ?LT^4 zrcI&9#_x=nV?L)o7kfbfQzP3x|9TCvhKg$Ee`W;%!1o_nLwrKp3c>|KzaCwkp>7Sx zFMr&exU>AWJ$-LQ3RC~H8xeT#xSdL$^MQQW;U${yAVT;o9{r|j4 zJ%{o6FW@SF*rIH571l%{kYXRK<{kl+-e%JmYGl|%&$(T+&q*qV?LWQ4pUfj5V9Tg`|JO7rp2LO&tURL9?o#(YaM{0^n6ig_1fs zWWooT6WSf5v5jF#d@rh21d=G$GyB!dd#UvcXuj$F4;xU<;Az>1jt}K{ULTmp165hG zMN^01V0A@iaay5!c*%*s*>~x!5kC;fHzrQ4siEGL$q!TWWi~^9a8}S4#c0>}ZXxco zddHtL!_qW@V`7>ns6A%a3jGzfo5qcETZ5S zx(<+ml#x6*JO_aQvbxnM(;qA*qjdx7KvF3PokDS0@8@>71hML74||gNb713{n|f9* zDR{cdn{+g$Gd7wcq)2#XaTHHexruqj3Sw`NlG?QtJR(4u*zex2lMD{!69^mMIZbU0 zU5B@c_0>OZ6yZ4~T9`0uDt^awzqZw}%vJ-~Xrb8vC&WG$%Iuau|ed&|V;UKc!6eaDiKLDy4?G^!6~N)w!-nX`rqOsM9mYi!5lgO;)>c_jM}4_q zftns#nT?l5!zl}JkJ ziV;d(xzyGBu|NNZ%DzQduooiZOO67UH|J6l@K-{Kyh49PwW!p z8?>k}R};Pgmhh^Ym}msZSmF5Y`$`G4v5CSuF*;0)bCOaUB6X-_GI<6aMV(o@Y*U$N zVmqtQ^DjSRK;V}sjDdBYsK>TH9aIC62G}o7N0&MR&TU3jSm1#(AkNE(LG$jQQW|`+ zJo2alBzR93$_Cd$%!UUcu%hFx>S!YGS=h8t1V3s-uF@V4AxtoE&r4t5f;539tRX>@M-SjOJ z5<+}z_lEd0*czhz|Q@{uM6LkNt{YgOS%P_p;qwYDv;=0o!U4`Y9iAN+urdS!~unm0u#vD^c`OI1z||gXx!?=Ko|i4ur{X zC|=Lwd|#;Cc3#G_wcDC7TBF*}S(!7$;-Bnz+{VY!AKW0$!e$5SmM5deqsq90RYf!w zh!tu|%s)*kk_XIRA|DtQGVK#a#`mYjfv7(D4C9l50uk3jB$uD$MgN1X>_tq;0Cq&e zk_fynvYa8iEyXk{YD|lYOlRoc!jJh|a*5LaWm2c0mm&j$2_h1&$~iU!+oFCu3&akh z1&EJz9mJ(D`eEl3&jE@)G=7Va;zbHKSXrV)3zA2i7KUDh!W~2~A*ltt3@SGR9X%w{ z#0&8?;@H_#6H<^ZcHp4X1ICUg(+99axYr?FAhFxZ4bi*tpK&LXFCw}J#3qU2=uq%< zG=Pv>Tds&Q7eyR~nq$%JPqe@A`;!iOmyirmvBLdU3QSb&ofHtrm>aYa3H9zoP+4?y zB1ulf)7wMC@mhXb8TK~skQm0dFmin+oNI3e4q-ijaVVVGp$0!KAG83jj;5fYZwP^n3-` zp+|4Rk+AqM0zp=BuaISJgrt~+)6xmt=|Me9=A8mET!w6Un0@ScQHd zC54EP=DDCvcgW-b3hXuDmubHGhYmENV=auS^i5tD*AV?FQraZj-Q2g^t|F`%WLBH1 zz$rgQh^kSko?d@C;}}v|xldEPc67 zrCr=z#b)`jZ#9Y`wkHdOr-cd6wZOSRr6@0t;@_&UMPXLcnuu~oZb~&NyTnRIdP{QS zYSVLnqV28`LhQn3RA(=aV}P&a8jd}buG81v>jX?F63A?ZrsVpI-$9csHj|=)9cAMO z%XMG`t;Ro*eazcgnI>d)F8@tda^qIf|225~EvhST9$zbr;*=(hg4sP&kwPm98OunW zC?R(vg2>s8_oK7wPNWtAqkJy8G@d>rGX@Gad+Gya1k{H+H`uZQo=;_b34<`}QoQ^C zpW-!M@|kNdI=NHHH9HrC0?Sa>iSlA3d4TxeZZ;2zd*EONveHZ9xg}S39yez^>*qaTYiBC$dA=OOt%EG z1_L1O`$IuN?U`pLJqXxi>}OUV>UqcOG`Sv5Tf-pHJH03u(q58zW-1joH5B@FW9)c< zw2WAWP?o6+pxLdFa;)quiU5OYzM;2tjV z{N~QKZQqRT@XB|sxxK`YFUp%{xOSN2<;0ojMr?<4IAz%*-N4S+j6J77VXnsg=iva5 z>)6%CDFfdixl)yn{Y zmMtyjuF%=5Rz-&pG`NDqUGOZ>;^>&Xb^%?z9sAY3%EvH%&O@{c9@vmNH-8whtthWSH!>rGi0H(`m1p>@=NY1o++$4u!Z0LYH#2;HS8Wz7ghE^|He^He#y_TX@H}!fW(tJ9$ z5pAV-;=Wf#=7?$!59!wqMO*u!r(gN_Q4THAX2*U+^MY-EiQ4e1EJ^k;+JU=E_7gc{AljS&gWwi|qZ_ z4nCNdv)i&x>7-KMeX)PHVb~xT^KC==8g7KPK#wG+%>MHC~8;U+qdPn ziO4wFYARUP7CyPD!HLW~`_N>=tbSrGZoN8&)yo$pMV$+;DvTA--~Y4w#0;^c*D^Bt z?pU+LwxjJ{zV0(MPFAwWqsly62_|k}(j?@9)YmOva+WCe*UJIS47{gqzNnNtStLt# z)>S*5;Tb&s^uPv*KEMfJc}(k2miuN?WgJXYOTuZ|*?@d*=zE1Q9ZhT)Q9`CD_MJN5 zDJ?<>awab0Qi-fvVM-93?s5T`e^fRoOiAwHos0t$=iJF$H-W3Y58^XM1Y3XPp;-7o5Roq<4reZiuXX~-c}s&_FnSjarbTT zCEFiu9^VYd;kY!VmHN9OFdOBi`%8K?Mb%quN&V#{aDyu{EbnaEZ^^n7L(3a}Aa6sf z7tYb_1!BxzRC-EepA`{AW&xLy;&4x;DVDW8V7iLH31P4FE{>J9*^PI$=o=AOsk8BC zE+)ic>>?x&q91=SbO0lHw?TAvLaSiSaPN*ydCoI2;uH;D+Y4@P$4d|e{gElo4w6(d_L+F%!qI5J;kn?r) zs7^S(;P4;GCdamDEeW4+0GQ?VfxSL>Shlw)_~|Gz#RLCSy%GH(aZUmviOuAIRn(&c z<4R^AS#@VhX=JG@6i3b8E7{966ex)*L}_Ep%ICAvMQuu0`zC@b;{@M!rmDox5 zO4;H}R@Ld9H*w&^Lt5H{&rw;>-n^F@;?{dm_Xek&Q(>Rw&yeGMkIfx|stVfvV#E1X zt=*R}tqY<`h)JlhB5psS8mm01E)&7{EI}r8eL=i38S>YD=2n)DZNvIv zJi&^(w_y?2_Tl*BhdpXh+3`cF_gk&_a#{Zd=to1UC1j%nUPV2~ENCD{VB?#b0Jdw~ z1I$oSq=dBL>#~jMZFr#m6lgb8+DYOZLF=~h6rwWG`y5Y)mc-j1+Gl$#K+!k$9@w|9 zNC~$KeQGTO+y>cTL=}zR<#6P-WZ=ln#Y-D_2!vI3nrt4JUx#=p2n0^TG*?$Cs zjA?k27j#3J8;^&ak*lLrP}rTGL^U*I`;_imowNz`Q4gxbES#1bE2OK=@e84yPCN%E?Q?iJo;sm!Y*H6u5whXJv4MSEd-h@=OcMS-xfXo zGt}bZ72hBUoU1#m;w^%8!E6%~xVJrf{vh0}8D#i#?4^avkJ3yMM?8ewA1*bNmq3FyvZlkm1o3jjQ)4Zdd)c)`yj>9j<7oXs-x@m3j&-UBrKVANKmbXx zPnEl+tFbh{_k;3cV#KXqB)*^ZIPM+pmmi_4jy zV}T(GyWK$M0)m_i1A=U*r}CFP1_3!i<0o504ya_NBnqd%us>tpF%&e9?|=PMkR(lz z)^NB&-ToQumskugm7F2qfNbaajf+8JL$!yz^T^zm+D(d%4}$N<|9HOetDs*rvUIt~ zQ4BtRu49SS#_^F7(yjh$q@`R&=_II!O3x zRq~icWSoMx8d>sW21MDLeu$jAKdkJ(X(<5Gk<(`DB)S~st>>y=o&u;eTFy3K6vK;H z%>s3XdO3LT#IhtcjvG2Me3bjalq6KK7`lZSBcL}(P#PG!>snvL!>P%a2&CtNGWZ5d z9kDD>{(I~wZ)bJ0fx(AiwY{(Gh>W+kiThc;=Q!_$47P=-FcP!Z(}qrW1*A(8rg|Fp zwDRYn#x8OOddS;ZhrVUzer*ptp?eFsR}wvKoe$ea>^Xvg=+V|Bd>0A-y#rank%t(9 zXZ$po8`MY0W;YbVHg^RP_EEbeQ#_MVmYwaEnkY~1msJs{;7C!=H&UjeB00OS zglBGp74XO!c!u6j7gcd#2|>Uc2)mXsP_!~qliicX1mJyt(bmomO;$IOm&^mWKqUpB zhdLfDHws&%6{5OC@!e7GOTL{+I6oE_n`$_=cjljI>k*uxX^7NgEfdH}*v%Fy+UyO& zHRHX4kQQAQv6#aeNylJOfiiED)}(aty`qu8sE_8_A^l4y@M@QxET38;~g$?R}tpzP;E2ZG5$Hf^Ym45Va4br#t= zY+lcC6D5E`SGphv$o{}Vvz}YgbBo#`$v~wW8lko2;AUjCR0|TVhpP0u5q?caaxUg!}Kyz?5kKY&UHpe=iAPfg%S!$ z@blr(;FKGlj3MA?TP~LR?3EeCnx$bd$?@(H0uvetTg#uA5fHn$#ym2e9eqWy%{D3b zZE#-{xwyD(i?+kA*-n^nFtN4|MFpEKw(k*c+J%_FQVSH|!;XLFWuuE*WCwLI)@n@M zz8aEE!>ge!yC?-XT9Ra^9f|ArOY`~1*xiGP)yZbFg(SKQ+cK=Vf@yd0yqVh77$8O@ zs>MNCUCC1xR9sTw?@@GB6g`L$vJfDl{9KDq`)1cmg>SyHebO-dvKO2_cP_7nb0b)F zpW}2`{o2fecKx3?a5x#K8LdiNwSKpzyqPDD#d%SKAQ55YvV*t+ ziBlU*8AWAuV54A4&tRo-fk^-Js9NE388C34684YjFc=f4AlsR4JT%?)oqz_~=iva$dk(-mG$rr zELimVA0x9izK)cETLn3A&0y4sY_GA6;&d`r#YN%Ag6V5WkyvOMjGEmvnp3m5*mMLB zvJct)94{)usZ;^Nbmd0ZLqpX<{KdoxT!1J~X(6SFr`5)`rv#9!nW z)hAE{EqL&Vir5pPR}}X%_Dl;w;uC?kRFn1KAb8Vp!ercNfA;iM=J+i;)Yu|oMVyEzH?)6j$t3P%SKVSd#yzqrq9m(!o z4)IhGlZ-jU{52D~;k z0U$`&E~gp{X()osEC%#oT*$z~CXqoq&?s9qA9Klbz+YPxp*o} zq1l_RB*y3!nXnGDpwW#>0}ex349!6}K4$6=7tdh65TIa=2`R=3m}?Jm%63(|D9nly zW|qny@OPF7IXZoyVB*=^+eDJmLxU|6b%YiJ$3ezYP^ZTgNtGw>2N~`^s^UD}3}PvrhbR zNUSj8jib$;Kgka!`Ub|f`Dt5!uj6T$Z?aX-wyQ&Kt_w*=&SkHqC>qt+N0`nX0*1NVJ-U9&@%&2=n)6M2QxF0((cRtcNZQ*-F$fiUf&Y zXjkw$G3x1o~L%-=NU`+c2%sHrLlvHDx$Xv^d`+*;N9+J2ppX8sv2+;VAb8BwrzkL*O`hO(d0wn0e#xe z-x!T<*Zdw2vKg}}mvlP?maSNZdQd;;YN#R^ZT;9&ofnRFE~1n0mnPZd6Z5WjFfr^R z*Wn`{(#}4Wgtsk{h%~OKRWr~ zkx2X^#8U>_%}U!r`D%hjBHU4u;N&(wr+tpx*Pj@V*8qsd;ry5s(#i$urPzI z?2LAHL?O?73uVA1`}Ww z+AiL$KmE`+8o^8|-ImKWIg9Gqv=qvFTKP!$pDWO71gRW3p^JZ%yt+$Yz|75_4Pkc} zY)$>-V&~L6VMbXj0GRL}UN>YnH*EJ9whOajqk8#)mIAebOfXG(F&j7sNL-*ALCl6c zX~aPU58DWgY4?*y#8d5P%%Y^#0ZV!=YlFyO<+UguO*Rv2c(e^FF+4QF&Ze^zSq*H+ z6=(qz`4AdQX7v{z%wJ(NtHai{X}KQbDh%7ZuziSaCLJ*%vSh)3+l#&?^Rd2T_s7+& zmy^R#ZJK9BqWQ(a0ubn%nk>x;8(#w8pG=I# zB|()AmL9YY>~Y?kDKbRvIy;F4OREs+9NCpg$dXQLNyVQ#Bz-}b!txTFdUlRJFZR=V z8<3AN*yxu;GsG8oN&_ly8cC!XW@T%{@dDy!MbV9SoHk*VOdK5>dCA-GRu^TZGpjR! z2kQNO1NU9SNh>aA0Ap#85pm+8y>U!{m1JGb;IXPM+K5775tO=G!@Ev#Hymi2H*gu{6NjgFtaB80nMX(6a!X2$PEWjsoSIdj!>a>J>gNO249pw zATmZYOe+7D%6|3$*d0FsqoJ*{3mYMpv{{D?359}54f;sXq{$f`miJTNbgG5R3MFbI zm#f%Qv=k2U39XF+Lb7y$kniAiSc}qD8RRer`#AVNOmUfCIyHt;fnqVDxqZ(}9_dw4 z1|Y~E(E-zdJMg#q%WTZGP+FdBNIegdxhfjAvoKn!T6ZbLUSPzjW&d&!?kF zlNG^+>|nScYCt)4YJQ?M9;n|6Tnx>%@j&|$eN}s|2a3;x&O%6YvIYcKY{qb4k;UUg zMUYB`@58k#t~TkMR3@b{FI-(MNeYzZDzeQlR7=`t$8x%eO}%t>}$Yz zHMgh7x|}8ToULvaDD%(a=RiD2*UO_Ea)d;BG_EW#LT8%=?+vOWKXXh#(C$Tr)V{%P zcpHE*V+LVrgH{DBd{8N9Dn!2HtH8!5ZQ`n=Gv21QS0`{;yG$zpCoa4$_1hkD zA7-`u3z4u(nqr`R1BNhxfVSf7Q7@p9Sj9l6YiGNe%`LMG9x=B|(iDSaEVsmAWE%bMwxCPz%b8$uowU(Q4Tr_m?gh zQXaFr6XOMK^iYL2YeeK@Qi)?Eq@c&0s=b*+$9U0!AHsuEPYGQ}#hfpk0cL1y=@;iPEsH_fMr)R`=Nan&Dsuwq1Z{ZV1Lo%^?yf5cG05}22e$injMt579oqXW1 zWeNcN6Pd`zK(GYyIE&6UR~Uve#0RK5xI_SRhVw-SEG~!)88ykNe^OfTX4d~8;tAL@W9ilft+^?B(cC=s3!EMU0Wd>+Sk^f|~=U#}JlI$I;ay|La zov-0-!2nM{u)ib+-$eKcAC_08%11Am#Xkfx_EzpW+)zr6=oVSwBT^>h-lNv{e_dF^ zb7@KsD2bDeLU{6Mrq`^z`ouhTCuWyx%gbp*X1n}T0_2D(X8(brhE~2AjneuZN!c@? zw14>0kZh>OT4!7x1IO$L`gg=Fk0kW0NJFPR`K4NS5`!=$G^6tw+rge76Pd)VI^)#zry4pK31Zn)3@3Z9{G zs?*V?3Jj4hZ=HJaj?qsQNP{5F56?npbNQr%cpgSRI0zeT>!to!A3>;2^G><0j=~4eiZ`|LXZ1J{2j$P zxXv|)oIe%9t!eO~Ks>Np~z332^TX(y3fFt}(S!bHUD z`#3RduDI5hHIL)St;L6hg}T;B=n4gAtqN=*iu5l!m#4TJr$T< zWN^!l;qDk*;8rjq^z(jjKXn3se^y|uCb2NZGTZ&d-P5g33V_?`sM;p@rYtZ>sIDy@ z-x4|0|0Z`@#TyXcMyQ`eAh!Iqp^!WSomu!&lR7DRA+|}7qH;TYg5VU#q8L+|s&?`^ zCsER7qAN1{5`1u~UDdmqzL`38t?9pSb~ih%(P|-*ExwoEz~#CzDOzY=0DS+SYfbM2 z;Ps97fiZQoiv@=cgOWQehLZ`DrgfC!ES*DNs54Xg-@tnHZ~jdM%OL&tMILf>C^Tlyj@Z0owmvP^NulR_|Q; z)LL^F%U}E#i5n+N_vrPpNP&9v!DJq;3f1NQnAM_0NfTjH z!*^ZS8abFA2`?MMD!2t^boJQ}vSx?!C+IwoI>9m?46I6F6DSjKE{UuPTn}X`FgDe_ zQ&7%GHc|R9@xIC_kdK~G={TWxyiX3(eBcHabAGC2a>RR4v0Gw+K96PQ7m^ZhLYU-u zj4Ei}0$+u{*KallQ8fse6&;GD?y>!hgaTyD=V3n*(QY-HHCh`w4csHCGW5ZS%U`)5 z>RCRDQ;DkJ#*e_wmvZPOL;{1RMpgu5rmj7d&tdJ_PWaR#6UBC%5dC&VKX$q_LS z#cXJeXjZSB+eQ8srs!S6Hk|6*p06RTz^6Q!S0Dv=;*}M3HLvVK1M+8-&N0K3ySbbMO?~ik%%{_5c{!+BQ^F146`Dcu<)q1fl$~O5Ni@ z{<3R(B3)yKG12K|rxwkk>l6jXoiMU*nNhQ*qAO@~o4pg^{A2 zLxnkjrwK}t6!7f}j)Vj`xL^$Vo(jv^sXZhv<8_d2#|x*^O?*rOY8`QNir8X1DL#oX zy#Ra-|LZjK;9q3?WqZ-sj8TI4t!Z7yidUwOj#&ry!pvBzmSdldp8>(-qB*^wH?&!G z?e<;`att$jP1U>TP3NDCVs>hCRd)*0*N>3Xb1bwXjPu+l(GVwn>?VKg$1}3eiVf88 zyMsPwcuwINs3E+(ib4By6oV~AZK3m!;PBzUd}LwaXxxF2f(7A>%vW0KK-C~vq0h6P z3Jqi+`*fX}^UX`BM_iWm1o5c6zRIP$7irbu=QODvTn({aN^uTupOj7Xt=7}Xrp=ZW zJb{A`N(*H5Tgh{CI-bK)zBS>KS4Se9H46PoHLZUD{B*Ns|B6*4-F+j_C2K z@To(%d8Ih0sU)%=BZrk74Xr3IX>j`!u1Ui&EwjPGB0C7STYwnOA0(LsYyG#iUZqF;SL1J z1cn!-O`2LGP%3S3Jt6#T;!Z{tFcII5ha^JDov439)m?#ej#?(%D=i}I}jo--pdH?hMXL~laLMBqu_UEff^^^9JOFLr<^&)f& z2Koj4yRSL)-S?;((iPBB*Hu0dQ3XKEB;Vs9jy&0jOisO@^PA+xAifbrOG-&Z@V*L2 zDNtj=6`GW}o~wP0BWHp@8X9mj=#mUv_(o2|mopHv0$K#H&HDfI2j7yR1AO>5j$`}o z@2djlJjrm=ITHhQVNk$y=Uw40Uv7QjiF6d`cF|9WzAR{(kPBP@I4%T+uM2(-r4qW9 znA6>F8S5CMlKu%W%#`IxZs8P)SKWaywq=>+)_K26ODvO2H67OPTV|5}Q939cGANiM z9p&*Rcd#m+>GB>xk=^D=I2BC4l@P?GzKI;d&N}jKSnK8c!53T3hINJ<0y{${Go-UC z!w@%XU3B)pQ7^a}+qOx_3t*iqyI@;DKR$QAKBcg(9b&2>IcOl#3R7(d?cRKPnfZD9}-iJ2N13{-u^P z zYRApq6zl1bkSs&y^bltkMV9@XNHja-n*wD+ib^3w$xwm`wEqAA+Rr3k%4DdZAjP_O zIkr25N*wafGXclx2+!jD^FlxSj0!Q~-i;XM{&X#z;zHpwd4;+I1#n|H!QgsP$a5p| zkhP;Taf|hV*r+O`3+Gr$#&5@cW_&w@ymiH$z%M#ig%suFlRL?Mh#he{kZ7pCLtSs+ z?T2djjT^nGuDxLR?V;Xkon#*h%djVkR_M0{qDKkbs=(iNRaNa$l_>B|;NgidA+og$ zXr(;KPin|a3hh``W%IQqvx=I-i5n71;}Gtl{}PxtkzPhDZ^FIK_3AnR|5O}7laD@| zC$=!qr4H&6CHI-@`l^g*r@WlVNq3rt#`nNtfrg>!akpc8hhGS0#9=4)#z3N|;eGLF z!OI>L$u97vIf*nk`YiYdPS*C0-zoxKjeTg6cb%!^EM5@huqoNTW0Nqk&;ASsMn`CB zn-Vv9Dzx}L*_kIRMgjV&!-fZ0k=Sd=tj!|;>*OKOn5)pX`4ov3-DNYr!C`+=!kYeZ zXND`x8qD`Iyn~@J@NNJo7IL7iqifNKp1S&!eh3n7WuY`YFXHmh$+~J;bjhj^Psx*z zb-GNTalW=4&r2ml8*E$R{-h$e#giRl_DIqjqpc`irL-WEg1)yjy^SH77+dw76*;IP zQi-)}DVkO%nj5>b=R%GBZBl(g zW!x4h2Nzhl!)phRN%X4z+4k$Ne{*#%d;!VR%3PnLodyk2kg!L0q8_eh$d!?fEKERM z-E<`FWQ8k2OiP(DxLzh@W60Tka{Q*#nX)a9^u>-t$v;3VTgF9^paE)IrIOM!1E_l8 zMTts%ES~yIJB9D>vID0X4$|vD15ehgpe}r5;4tveBnQ^H0l(_s^tV!}^Ostmidp2M zC?gN)dH|=`0S}f~@}itmNUG8c^I|gqT4eH5Y;ul%xj0BYp2j~5a9IB7pr0G?klTc+ z!D|yLty5t!tFTk}7b*M>Fr~B<)$Y^52(OF%{{GTBBa(ORPkvQ;rn&t3pg5peR|7ZCXDlb_gNZKNQUtu_ zmQY0Y%rf$iT%QpaR`WGd1tM(a+-=Av4UsWho za9a}532iYY-V|om^o%N=a>H;u>5{`?t13L4g(1Kz--n`Eh8hVWw^)6j3KR;2+51JY zfs8;#hzoJ;09eR$tM~15nDgWw><;Xj*hKg=U7IBdz>jnBNpI4x~msumR&KjY64OYzX!KBGr|&+f8_ok#U_9~cs2_q z$xSAm&szBO87-jP)E6lr(0s&MKi&In${0iPn?~QXAjlrww5zsCu;hR+ZzGc6c|Hg) zfr#kmbo-yER*ZIQ7gTX*SyJs4P)DXB)J|pMx1_bbz(wQ-PlH9H?`kj>eWg7uDT{M) zPK8~Cc+kJ?*X(>O+F1})QHS1~3o{^55aPiN-G{^pN5t*!{ATY5VJ@H-6i`&0&C;C# z&-e}F_7*YzM)_0-$!&rX*n;0=3UrC4(@C=}gx?t<=yF8&hb=VX66)g2#jI;W>;2kO zt(15{^g^*4mKYmj3p+@fIBD%qmcE8p(g~X}y_D~bG z`)2zoim>B-iFT6nHXTJFNe7wbm=Gq~e1$#hy5!eVH#pk;S7iw^y1fA%pYDhMH?$oU z(#5*PojD$u5p|_EGn!2 z&!XHE*RcYV%s-XIK~?Psrq_WksRaQvmL~GS6FDl{A3v~)y$9HtAfI^Kolp1~-~WQyJj~5g3d{5!gYDFj7k4Qg+-eIqwFM&oKB}a(ZbFzZs-mGM zL7jH^RD=h$&_9k(2OF19{@=?9dYSp-K{M=b!bMgplSaRnm}u-^VMu#P#Do|gC_-2; zg6c}vArAa;Bx-3;QkT>LWNXvqs3`kFIA9F|3orK~AHT+nC4IOG9SsgllOmJQ$A(Iw z!Xzp3P#Ks92L*baQEer?TYzH8+U~lND=Uo-zUb(MQhX}M+az!jVDm|l6u09lR2tx& zNR#v^`fHRqP9lZU#G5u9VXulZOq7pOS0vjvo>qH7S@9(IDDgq=|DGlQXQNwsc6Xll6;eH& z`~s|HW`4&|Ju#9)n6^}~9#2oc5ps%zgcT$Q%eHGx+7~CCN`m#GF*j_>1)?ef-Vwu* zwMAN{V?7$aKVTg2Ujra&-3 z4I4h}=vo4qL2qD{Blp7u+9_sBpmZ}6xM-YL#SEq6ItCTR6;M9wqR_Mbc zDI~VNZd5i_8zqUsRY*IiENvP~=j1700xSj+aJ!S`!@7!GI1I^LZWm)K_LV?rwT2U` zntw?3@p4&MNYGD3(=1RvF(LFxT}>HO?UO*|+dKO@j3_^ldUZ{96r5R7L=s)$fU<1a zz1%^K@2slBa70g*nj=Il@wF)aGgj;rGukfsJscKmM|Wtmr%D~DIG`w1PFHXPy1Afq zQj;5Cuj0$>vSebP(JneBhwxnH+mMU0Gcf_vP7kC=!G65u#*SfDmtEE)%HK(7pvElQ z^i$#nKLGdJcxrrLp7*DP^Ym+e%YUHJWjgKYa)xIYNF)*5NBII0uVZkLEH@8)g!b%g z&MwVjQ$*U>isqkBe!)+7Fch(8b{dD2NYrG9UCXs(LCA`53XJB<@-ym zB54>qFUH28n5JOY?$mE$IWu0^zO1ooJ0M%e(bjI4VUN8|sA}5#|LK&#fGl{!c{xG( z+#cvxjB7`DEvzr&y{Z=-5qq30bm|yO6mf2dux)Ywv_UkO9L-c0 zJn?DrDa2DeIgcfjbm@|vz4Ua#0U7FPKV~0Lj#^p3wl!Z%<9g!_!Fa}=X>CR67y!JH z(({e`=KZ>t?4TF11h2o?HseOftse3uu@m4x@6q^@K1pXC*h+WJGb1gGh8?e74^f@R zi7Ou^B?R~iDSKNdXWn;dcV8=FkZcdMg7mrF*%#x;vSw6E$rkarxKp&BYq%lA?Mgd+5V$+ME$8OFWAF?lwm(D zM&pzG-npAW59EW|E8wQhJVV8>gZ%9i>#;~zFQOyIM0&m?7w=YG#C2yxMcf#p;!EsU zlc2z6Pyiqka;Li55T4N%Azqv93JquGsWN*Nj9nVT);cF9?ouw#YHCx7;r+F3I^j@( z!}cYMdUnTvCHk>z8n%ftYp}c|S@jtU@Chi{jVy%qo8x3S|AU+u4?eX z4c1TTEXUT5dqbK9&JBW_F~D8Fbt%10@=!x?jYb+ z_2&~kBTERX@Qq1Y%HBR{f`gOnxi{Wqy-r}o2m;J=`%J=P?@r_QP<~flt*Nlw7rbBw%MkEjOP1l#Yu6Ld!bc zv9+gA{*3w2iTh{%!6Y3IIBo!eq9^kilYoGtUS-iyO(438-v3NnJu*GjA01x~1EbC3 z`Ir&z?Q|@a#v(FXBJ`6uBkMcq!g0l{*9{2-Ib zl#8th#}MN2Hots^A+-tfh9nem1P8XDj50l$ILMTnst_+nzoHdQ*zx@)|9`nnIcqkZ z=w72QI7(fMTt=UmQ1zcg_N|A!O1JR`$lE^AnzEq|fWkEB&*=~BAzvpc#Z9y|xwCW# zzWkGtVGKoF?GThcq*(a}a`QcBB2?S`VcQxnK5r!#ltNem8&#Dj`+2v}IrW1y-7HKgAL46(JJXv_mkDmx@(d+n=4(EYKAJuF{!ze7CeQtWrrKz|NWaY zD|!h2Y%z-fa`Ew6KZG<;0yoYH5O$*4AS}5(WHT)n}Q&^o9Y;iqPM^U%+9KRW<2sn z&1OPZ*%pSq$&cP-Ngo=eCtldQ&%0l5%Np<6n+T{SEhGJyL zenMC5qEeuCNgxPS`ti|FlR?=*7qYC#Rgh9ZS95$7!Aj<^WaIlgsvQ5v@2h-+fz)j) z9WZFmTL=)#e-n(hFhtChC))izT*1xw+nAx z8!9<-Pd|h7Gy}zsB{hmdXh%$i(outFU-SYBy}3w$0)gYRZ>urv!2BKJyPWO&XH|>5 zE=p+Gx2JnuPQ=FBoBv++aCWsy#oxgNf5Nx)Cu;tGbD~;B5KUM6XI7vC(WG?z*7k*8 z*P1Y)IE5MeovDix(!OYLJAB#g@b+Kh54$?fuOiB;9o7H^!nvg6?CKpx3AsNj~7Mz^RUFRpu2XzR|<>43@w@Pt!;waJ4Xws+T5Ug>GSLl$2-vxxG7MAY(94n z57_70E_n)jNE&hcLMW{e3OH#i8JT+~n%;nb2-WIH%ZiuVQ=XBnJXg9lH&BLyX2Gl{xX3q-1|0iZEqH3?~>o_Cjs=MUd?uV2MM(O5ra^KB&bcCn~~UGGF?=qfThI z>0l_l?y9)oKUIzbRZh>x@a<@j9sT=n?()~E-U1Fuyu_N?zs@jIRD0s?XX{qeq8&hl zl+q499y2N#guH*!w*LIU@1i>q(+=`~X00&fXbR+~aS7#wir40iW4x}+6EIR!kC{MSK614 zd;D#tTO-tL{Qm>^A3lKEl*MvvlY6J4ZQrM7z-a8Mnc9VwBt!shdg|? zsoj4bHbz`U7I{hkyyG3*5-dklX!=jPz$>!j|Qmq{n{s=uW~UMY20 z>P4e_bkdmqR3>!`fxP?g3BC*W*D=7{F!6xWRN>U3D{n-}8)KXW(;(gHdF!V(D9p372PUdP@c4BOSA)_l3y!5+Gx5!XFat|-CwQ-i^D2d< z1!VdV77N)H3(bD72QnO${I2sE2$G_D4;#tu1$PRz=(u}U?nHH4wZnD&3

t0!v)r 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 ZkB>LwU;gp?KmPT{e*(6W5ZZjc2LK4%VwnH{ literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Sources/AppDelegate.swift b/submodules/TelegramUI/Sources/AppDelegate.swift index 91b4141efd..557e54cefe 100644 --- a/submodules/TelegramUI/Sources/AppDelegate.swift +++ b/submodules/TelegramUI/Sources/AppDelegate.swift @@ -640,6 +640,8 @@ final class SharedApplicationContext { }, getAvailableAlternateIcons: { if #available(iOS 10.3, *) { var icons = [PresentationAppIcon(name: "Blue", imageName: "BlueIcon", isDefault: buildConfig.isAppStoreBuild), + PresentationAppIcon(name: "New1", imageName: "New1_180x180"), + PresentationAppIcon(name: "New2", imageName: "New2_180x180"), PresentationAppIcon(name: "Black", imageName: "BlackIcon"), PresentationAppIcon(name: "BlueClassic", imageName: "BlueClassicIcon"), PresentationAppIcon(name: "BlackClassic", imageName: "BlackClassicIcon"), @@ -785,7 +787,6 @@ final class SharedApplicationContext { self.mainWindow?.hostView.containerView.backgroundColor = initialPresentationDataAndSettings.presentationData.theme.chatList.backgroundColor let legacyBasePath = appGroupUrl.path - let legacyCache = LegacyCache(path: legacyBasePath + "/Caches") let presentationDataPromise = Promise() let appLockContext = AppLockContextImpl(rootPath: rootPath, window: self.mainWindow!, rootController: self.window?.rootViewController, applicationBindings: applicationBindings, accountManager: accountManager, presentationDataSignal: presentationDataPromise.get(), lockIconInitialFrame: { @@ -793,7 +794,7 @@ final class SharedApplicationContext { }) var setPresentationCall: ((PresentationCall?) -> Void)? - let sharedContext = SharedAccountContextImpl(mainWindow: self.mainWindow, sharedContainerPath: legacyBasePath, basePath: rootPath, encryptionParameters: encryptionParameters, accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings, networkArguments: networkArguments, rootPath: rootPath, legacyBasePath: legacyBasePath, legacyCache: legacyCache, apsNotificationToken: self.notificationTokenPromise.get() |> map(Optional.init), voipNotificationToken: self.voipTokenPromise.get() |> map(Optional.init), setNotificationCall: { call in + let sharedContext = SharedAccountContextImpl(mainWindow: self.mainWindow, sharedContainerPath: legacyBasePath, basePath: rootPath, encryptionParameters: encryptionParameters, accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings, networkArguments: networkArguments, rootPath: rootPath, legacyBasePath: legacyBasePath, apsNotificationToken: self.notificationTokenPromise.get() |> map(Optional.init), voipNotificationToken: self.voipTokenPromise.get() |> map(Optional.init), setNotificationCall: { call in setPresentationCall?(call) }, navigateToChat: { accountId, peerId, messageId in self.openChatWhenReady(accountId: accountId, peerId: peerId, messageId: messageId) diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 649c3009fa..a69a17c6c1 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -685,7 +685,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }, enqueueMessage: { message in self?.sendMessages([message]) }, sendSticker: canSendMessagesToChat(strongSelf.presentationInterfaceState) ? { fileReference, sourceNode, sourceRect in - return self?.controllerInteraction?.sendSticker(fileReference, nil, false, sourceNode, sourceRect) ?? false + return self?.controllerInteraction?.sendSticker(fileReference, false, false, nil, false, sourceNode, sourceRect) ?? false } : nil, setupTemporaryHiddenMedia: { signal, centralIndex, galleryMedia in if let strongSelf = self { strongSelf.temporaryHiddenGalleryMediaDisposable.set((signal |> deliverOnMainQueue).start(next: { entry in @@ -1009,7 +1009,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G attributes.append(TextEntitiesMessageAttribute(entities: entities)) } strongSelf.sendMessages([.message(text: text, attributes: attributes, mediaReference: nil, replyToMessageId: strongSelf.presentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil, correlationId: nil)]) - }, sendSticker: { [weak self] fileReference, query, clearInput, sourceNode, sourceRect in + }, sendSticker: { [weak self] fileReference, silentPosting, schedule, query, clearInput, sourceNode, sourceRect in guard let strongSelf = self else { return false } @@ -1086,7 +1086,20 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } - strongSelf.sendMessages([.message(text: "", attributes: attributes, mediaReference: fileReference.abstract, replyToMessageId: strongSelf.presentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil, correlationId: correlationId)]) + let messages: [EnqueueMessage] = [.message(text: "", attributes: attributes, mediaReference: fileReference.abstract, replyToMessageId: strongSelf.presentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil, correlationId: correlationId)] + if silentPosting { + let transformedMessages = strongSelf.transformEnqueueMessages(messages, silentPosting: silentPosting) + strongSelf.sendMessages(transformedMessages) + } else if schedule { + strongSelf.presentScheduleTimePicker(completion: { [weak self] scheduleTime in + if let strongSelf = self { + let transformedMessages = strongSelf.transformEnqueueMessages(messages, silentPosting: false, scheduleTime: scheduleTime) + strongSelf.sendMessages(transformedMessages) + } + }) + } else { + strongSelf.sendMessages(messages) + } return true }, sendGif: { [weak self] fileReference, sourceNode, sourceRect in if let strongSelf = self { @@ -5780,9 +5793,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } } - }, sendSticker: { [weak self] file, sourceNode, sourceRect in + }, sendSticker: { [weak self] file, clearInput, sourceNode, sourceRect in if let strongSelf = self, canSendMessagesToChat(strongSelf.presentationInterfaceState) { - return strongSelf.controllerInteraction?.sendSticker(file, nil, true, sourceNode, sourceRect) ?? false + return strongSelf.controllerInteraction?.sendSticker(file, false, false, nil, clearInput, sourceNode, sourceRect) ?? false } else { return false } @@ -11381,9 +11394,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G default: break } - }, sendFile: nil, - sendSticker: { [weak self] f, sourceNode, sourceRect in - return self?.interfaceInteraction?.sendSticker(f, sourceNode, sourceRect) ?? false + }, sendFile: nil, + sendSticker: { [weak self] f, sourceNode, sourceRect in + return self?.interfaceInteraction?.sendSticker(f, true, sourceNode, sourceRect) ?? false }, requestMessageActionUrlAuth: { [weak self] subject in if case let .url(url) = subject { self?.controllerInteraction?.requestMessageActionUrlAuth(url, subject) diff --git a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift index ea1418dc23..254f60d331 100644 --- a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift @@ -62,7 +62,7 @@ public final class ChatControllerInteraction { let toggleMessagesSelection: ([MessageId], Bool) -> Void let sendCurrentMessage: (Bool) -> Void let sendMessage: (String) -> Void - let sendSticker: (FileMediaReference, String?, Bool, ASDisplayNode, CGRect) -> Bool + let sendSticker: (FileMediaReference, Bool, Bool, String?, Bool, ASDisplayNode, CGRect) -> Bool let sendGif: (FileMediaReference, ASDisplayNode, CGRect) -> Bool let sendBotContextResultAsGif: (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool let requestMessageActionCallback: (MessageId, MemoryBuffer?, Bool, Bool) -> Void @@ -154,7 +154,7 @@ public final class ChatControllerInteraction { toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, - sendSticker: @escaping (FileMediaReference, String?, Bool, ASDisplayNode, CGRect) -> Bool, + sendSticker: @escaping (FileMediaReference, Bool, Bool, String?, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, sendBotContextResultAsGif: @escaping (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool, Bool) -> Void, @@ -305,7 +305,7 @@ public final class ChatControllerInteraction { static var `default`: ChatControllerInteraction { return ChatControllerInteraction(openMessage: { _, _ in - return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, activateMessagePinch: { _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, activateMessagePinch: { _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, chatControllerNode: { diff --git a/submodules/TelegramUI/Sources/ChatControllerNode.swift b/submodules/TelegramUI/Sources/ChatControllerNode.swift index a063395154..07ded9549f 100644 --- a/submodules/TelegramUI/Sources/ChatControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatControllerNode.swift @@ -371,15 +371,15 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.addSubnode(self.historyNodeContainer) self.addSubnode(self.navigateButtons) - if let navigationBar = self.navigationBar { - self.addSubnode(navigationBar) - } - self.addSubnode(self.inputPanelBackgroundNode) self.addSubnode(self.inputPanelBackgroundSeparatorNode) self.addSubnode(self.inputContextPanelContainer) + if let navigationBar = self.navigationBar { + self.addSubnode(navigationBar) + } + self.addSubnode(self.messageTransitionNode) self.addSubnode(self.presentationContextMarker) @@ -738,7 +738,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { inputPanelNodeBaseHeight += secondaryInputPanelNode.minimalHeight(interfaceState: self.chatPresentationInterfaceState, metrics: layout.metrics) } - let maximumInputNodeHeight = layout.size.height - max(navigationBarHeight, layout.safeInsets.top) - inputPanelNodeBaseHeight + let maximumInputNodeHeight = layout.size.height - max(navigationBarHeight + (titleAccessoryPanelBackgroundHeight ?? 0.0), layout.safeInsets.top) - inputPanelNodeBaseHeight var dismissedInputNode: ChatInputNode? var immediatelyLayoutInputNodeAndAnimateAppearance = false diff --git a/submodules/TelegramUI/Sources/ChatEmptyNode.swift b/submodules/TelegramUI/Sources/ChatEmptyNode.swift index 3ba8ac369f..811e20d392 100644 --- a/submodules/TelegramUI/Sources/ChatEmptyNode.swift +++ b/submodules/TelegramUI/Sources/ChatEmptyNode.swift @@ -134,7 +134,7 @@ final class ChatEmptyNodeGreetingChatContent: ASDisplayNode, ChatEmptyNodeSticke guard let stickerItem = self.stickerItem else { return } - let _ = self.interaction?.sendSticker(.standalone(media: stickerItem.stickerItem.file), self, self.stickerNode.bounds) + let _ = self.interaction?.sendSticker(.standalone(media: stickerItem.stickerItem.file), false, self, self.stickerNode.bounds) } func updateLayout(interfaceState: ChatPresentationInterfaceState, size: CGSize, transition: ContainedViewLayoutTransition) -> CGSize { @@ -291,7 +291,7 @@ final class ChatEmptyNodeNearbyChatContent: ASDisplayNode, ChatEmptyNodeStickerC guard let stickerItem = self.stickerItem else { return } - let _ = self.interaction?.sendSticker(.standalone(media: stickerItem.stickerItem.file), self, self.stickerNode.bounds) + let _ = self.interaction?.sendSticker(.standalone(media: stickerItem.stickerItem.file), false, self, self.stickerNode.bounds) } func updateLayout(interfaceState: ChatPresentationInterfaceState, size: CGSize, transition: ContainedViewLayoutTransition) -> CGSize { @@ -771,7 +771,7 @@ final class ChatEmptyNode: ASDisplayNode { private let context: AccountContext private let interaction: ChatPanelInterfaceInteraction? - private let backgroundNode: ASImageNode + private let backgroundNode: NavigationBackgroundNode private var currentTheme: PresentationTheme? private var currentStrings: PresentationStrings? @@ -782,10 +782,7 @@ final class ChatEmptyNode: ASDisplayNode { self.context = context self.interaction = interaction - self.backgroundNode = ASImageNode() - self.backgroundNode.isLayerBacked = true - self.backgroundNode.displayWithoutProcessing = true - self.backgroundNode.displaysAsynchronously = false + self.backgroundNode = NavigationBackgroundNode(color: .clear) super.init() @@ -798,9 +795,8 @@ final class ChatEmptyNode: ASDisplayNode { if self.currentTheme !== interfaceState.theme || self.currentStrings !== interfaceState.strings { self.currentTheme = interfaceState.theme self.currentStrings = interfaceState.strings - - let graphics = PresentationResourcesChat.additionalGraphics(interfaceState.theme, wallpaper: interfaceState.chatWallpaper, bubbleCorners: interfaceState.bubbleCorners) - self.backgroundNode.image = graphics.chatEmptyItemBackgroundImage + + self.backgroundNode.color = interfaceState.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic } var isScheduledMessages = false @@ -891,7 +887,6 @@ final class ChatEmptyNode: ASDisplayNode { } transition.updateFrame(node: self.backgroundNode, frame: contentFrame) + self.backgroundNode.update(size: self.backgroundNode.bounds.size, cornerRadius: 10.0, transition: transition) } } - - diff --git a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift index 513a553c59..769d6c0ea1 100644 --- a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift @@ -305,7 +305,7 @@ private func mappedInsertEntries(context: AccountContext, chatLocation: ChatLoca case let .UnreadEntry(_, presentationData): return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatUnreadItem(index: entry.entry.index, presentationData: presentationData, context: context), directionHint: entry.directionHint) case let .ReplyCountEntry(_, isComments, count, presentationData): - return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatReplyCountItem(index: entry.entry.index, isComments: isComments, count: count, presentationData: presentationData, context: context), directionHint: entry.directionHint) + return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatReplyCountItem(index: entry.entry.index, isComments: isComments, count: count, presentationData: presentationData, context: context, controllerInteraction: controllerInteraction), directionHint: entry.directionHint) case let .ChatInfoEntry(title, text, presentationData): return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatBotInfoItem(title: title, text: text, controllerInteraction: controllerInteraction, presentationData: presentationData), directionHint: entry.directionHint) case let .SearchEntry(theme, strings): @@ -350,7 +350,7 @@ private func mappedUpdateEntries(context: AccountContext, chatLocation: ChatLoca case let .UnreadEntry(_, presentationData): return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatUnreadItem(index: entry.entry.index, presentationData: presentationData, context: context), directionHint: entry.directionHint) case let .ReplyCountEntry(_, isComments, count, presentationData): - return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatReplyCountItem(index: entry.entry.index, isComments: isComments, count: count, presentationData: presentationData, context: context), directionHint: entry.directionHint) + return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatReplyCountItem(index: entry.entry.index, isComments: isComments, count: count, presentationData: presentationData, context: context, controllerInteraction: controllerInteraction), directionHint: entry.directionHint) case let .ChatInfoEntry(title, text, presentationData): return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ChatBotInfoItem(title: title, text: text, controllerInteraction: controllerInteraction, presentationData: presentationData), directionHint: entry.directionHint) case let .SearchEntry(theme, strings): diff --git a/submodules/TelegramUI/Sources/ChatInstantVideoMessageDurationNode.swift b/submodules/TelegramUI/Sources/ChatInstantVideoMessageDurationNode.swift index 49b16264d4..263a553cbc 100644 --- a/submodules/TelegramUI/Sources/ChatInstantVideoMessageDurationNode.swift +++ b/submodules/TelegramUI/Sources/ChatInstantVideoMessageDurationNode.swift @@ -35,28 +35,25 @@ private struct ChatInstantVideoMessageDurationNodeState: Equatable { private final class ChatInstantVideoMessageDurationNodeParameters: NSObject { let state: ChatInstantVideoMessageDurationNodeState let isSeen: Bool - let backgroundColor: UIColor let textColor: UIColor - init(state: ChatInstantVideoMessageDurationNodeState, isSeen: Bool, backgroundColor: UIColor, textColor: UIColor) { + init(state: ChatInstantVideoMessageDurationNodeState, isSeen: Bool, textColor: UIColor) { self.state = state self.isSeen = isSeen - self.backgroundColor = backgroundColor self.textColor = textColor super.init() } } -final class ChatInstantVideoMessageDurationNode: ASDisplayNode { +final class ChatInstantVideoMessageDurationNode: ASImageNode { private var textColor: UIColor - private var fillColor: UIColor var defaultDuration: Double? { didSet { if self.defaultDuration != oldValue { self.updateTimestamp() - self.setNeedsDisplay() + self.updateContents() } } } @@ -64,7 +61,7 @@ final class ChatInstantVideoMessageDurationNode: ASDisplayNode { var isSeen: Bool = false { didSet { if self.isSeen != oldValue { - self.setNeedsDisplay() + self.updateContents() } } } @@ -87,7 +84,7 @@ final class ChatInstantVideoMessageDurationNode: ASDisplayNode { private var state = ChatInstantVideoMessageDurationNodeState() { didSet { if self.state != oldValue { - self.setNeedsDisplay() + self.updateContents() } } } @@ -104,10 +101,12 @@ final class ChatInstantVideoMessageDurationNode: ASDisplayNode { } } } + + var size: CGSize = CGSize() + var sizeUpdated: ((CGSize) -> Void)? - init(textColor: UIColor, fillColor: UIColor) { + init(textColor: UIColor) { self.textColor = textColor - self.fillColor = fillColor super.init() @@ -128,11 +127,10 @@ final class ChatInstantVideoMessageDurationNode: ASDisplayNode { self.updateTimer?.invalidate() } - func updateTheme(textColor: UIColor, fillColor: UIColor) { - if !self.textColor.isEqual(textColor) || !self.fillColor.isEqual(textColor) { + func updateTheme(textColor: UIColor) { + if !self.textColor.isEqual(textColor) { self.textColor = textColor - self.fillColor = fillColor - self.setNeedsDisplay() + self.updateContents() } } @@ -168,12 +166,22 @@ final class ChatInstantVideoMessageDurationNode: ASDisplayNode { self.state = ChatInstantVideoMessageDurationNodeState() } } - - override func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? { - return ChatInstantVideoMessageDurationNodeParameters(state: self.state, isSeen: self.isSeen, backgroundColor: self.fillColor, textColor: self.textColor) + + private func updateContents() { + let image = self.generateContents(withParameters: self.getParameters(), isCancelled: { return false }) + let previousSize = self.image?.size + self.image = image + if let image = image, previousSize != image.size { + self.size = image.size + self.sizeUpdated?(image.size) + } } - @objc override public class func display(withParameters: Any?, isCancelled: () -> Bool) -> UIImage? { + private func getParameters() -> NSObjectProtocol? { + return ChatInstantVideoMessageDurationNodeParameters(state: self.state, isSeen: self.isSeen, textColor: self.textColor) + } + + private func generateContents(withParameters: Any?, isCancelled: () -> Bool) -> UIImage? { guard let parameters = withParameters as? ChatInstantVideoMessageDurationNodeParameters else { return nil } @@ -196,20 +204,14 @@ final class ChatInstantVideoMessageDurationNode: ASDisplayNode { return generateImage(imageSize, rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: size)) - context.setBlendMode(.copy) - context.setFillColor(parameters.backgroundColor.cgColor) - - context.fillEllipse(in: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: size.height, height: size.height))) - context.fillEllipse(in: CGRect(origin: CGPoint(x: size.width - size.height, y: 0.0), size: CGSize(width: size.height, height: size.height))) - context.fill(CGRect(origin: CGPoint(x: size.height / 2.0, y: 0.0), size: CGSize(width: size.width - size.height, height: size.height))) + context.setBlendMode(.normal) if !parameters.isSeen { context.setFillColor(parameters.textColor.cgColor) let diameter: CGFloat = 4.0 context.fillEllipse(in: CGRect(origin: CGPoint(x: size.width - size.height + floor((size.height - diameter) / 2.0), y: floor((size.height - diameter) / 2.0)), size: CGSize(width: diameter, height: diameter))) } - - context.setBlendMode(.normal) + UIGraphicsPushContext(context) string.draw(at: CGPoint(x: floor((size.width - unseenInset - textRect.size.width) / 2.0) + textRect.origin.x, y: 2.0 + textRect.origin.y + UIScreenPixel)) UIGraphicsPopContext() diff --git a/submodules/TelegramUI/Sources/ChatLoadingNode.swift b/submodules/TelegramUI/Sources/ChatLoadingNode.swift index 6cb7638a0b..3daab20983 100644 --- a/submodules/TelegramUI/Sources/ChatLoadingNode.swift +++ b/submodules/TelegramUI/Sources/ChatLoadingNode.swift @@ -8,18 +8,12 @@ import TelegramPresentationData import ActivityIndicator final class ChatLoadingNode: ASDisplayNode { - private let backgroundNode: ASImageNode + private let backgroundNode: NavigationBackgroundNode private let activityIndicator: ActivityIndicator private let offset: CGPoint init(theme: PresentationTheme, chatWallpaper: TelegramWallpaper, bubbleCorners: PresentationChatBubbleCorners) { - self.backgroundNode = ASImageNode() - self.backgroundNode.isLayerBacked = true - self.backgroundNode.displayWithoutProcessing = true - self.backgroundNode.displaysAsynchronously = false - - let graphics = PresentationResourcesChat.additionalGraphics(theme, wallpaper: chatWallpaper, bubbleCorners: bubbleCorners) - self.backgroundNode.image = graphics.chatLoadingIndicatorBackgroundImage + self.backgroundNode = NavigationBackgroundNode(color: theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic) let serviceColor = serviceMessageColorComponents(theme: theme, wallpaper: chatWallpaper) self.activityIndicator = ActivityIndicator(type: .custom(serviceColor.primaryText, 22.0, 2.0, false), speed: .regular) @@ -37,10 +31,10 @@ final class ChatLoadingNode: ASDisplayNode { func updateLayout(size: CGSize, insets: UIEdgeInsets, transition: ContainedViewLayoutTransition) { let displayRect = CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: size.width, height: size.height - insets.top - insets.bottom)) - - if let image = self.backgroundNode.image { - transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(x: displayRect.minX + floor((displayRect.width - image.size.width) / 2.0), y: displayRect.minY + floor((displayRect.height - image.size.height) / 2.0)), size: image.size)) - } + + let backgroundSize: CGFloat = 30.0 + transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(x: displayRect.minX + floor((displayRect.width - backgroundSize) / 2.0), y: displayRect.minY + floor((displayRect.height - backgroundSize) / 2.0)), size: CGSize(width: backgroundSize, height: backgroundSize))) + self.backgroundNode.update(size: self.backgroundNode.bounds.size, cornerRadius: self.backgroundNode.bounds.height / 2.0, transition: transition) let activitySize = self.activityIndicator.measure(size) transition.updateFrame(node: self.activityIndicator, frame: CGRect(origin: CGPoint(x: displayRect.minX + floor((displayRect.width - activitySize.width) / 2.0) + self.offset.x, y: displayRect.minY + floor((displayRect.height - activitySize.height) / 2.0) + self.offset.y), size: activitySize)) diff --git a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift index c8d5e99b65..7a354853c5 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift @@ -427,6 +427,8 @@ final class ChatMediaInputNode: ChatInputNode { private let collectionListSeparator: ASDisplayNode private let collectionListContainer: CollectionListContainerNode + private weak var peekController: PeekController? + private let disposable = MetaDisposable() private let listView: ListView @@ -440,7 +442,6 @@ final class ChatMediaInputNode: ChatInputNode { private var animatingStickerPaneOut = false private let gifPane: ChatMediaInputGifPane private var animatingGifPaneOut = false - //private let trendingPane: ChatMediaInputTrendingPane private var animatingTrendingPaneOut = false private var panRecognizer: UIPanGestureRecognizer? @@ -525,9 +526,6 @@ final class ChatMediaInputNode: ChatInputNode { }) var getItemIsPreviewedImpl: ((StickerPackItem) -> Bool)? - /*self.trendingPane = ChatMediaInputTrendingPane(context: context, controllerInteraction: controllerInteraction, getItemIsPreviewed: { item in - return getItemIsPreviewedImpl?(item) ?? false - }, isPane: true)*/ self.paneArrangement = ChatMediaInputPaneArrangement(panes: [.gifs, .stickers, /*.trending*/], currentIndex: 1, indexTransition: 0.0) @@ -544,7 +542,7 @@ final class ChatMediaInputNode: ChatInputNode { sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, false, false, nil, false, sourceNode, sourceRect) } else { return false } @@ -817,7 +815,7 @@ final class ChatMediaInputNode: ChatInputNode { let packReference: StickerPackReference = .id(id: info.id.id, accessHash: info.accessHash) let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, false, false, nil, false, sourceNode, sourceRect) } else { return false } @@ -1133,7 +1131,13 @@ final class ChatMediaInputNode: ChatInputNode { menuItems.append(.action(ContextMenuActionItem(text: strongSelf.strings.Conversation_SendMessage_SendSilently, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Menu/SilentIcon"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in -// strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), nil, false, node, rect) + if let strongSelf = self, let peekController = strongSelf.peekController { + if let animationNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.animationNode { + let _ = strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), true, false, nil, false, animationNode, animationNode.bounds) + } else if let imageNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.imageNode { + let _ = strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), true, false, nil, false, imageNode, imageNode.bounds) + } + } f(.default) }))) } @@ -1141,8 +1145,14 @@ final class ChatMediaInputNode: ChatInputNode { menuItems.append(.action(ContextMenuActionItem(text: strongSelf.strings.Conversation_SendMessage_ScheduleMessage, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Menu/ScheduleIcon"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in + if let strongSelf = self, let peekController = strongSelf.peekController { + if let animationNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.animationNode { + let _ = strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), false, true, nil, false, animationNode, animationNode.bounds) + } else if let imageNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.imageNode { + let _ = strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), false, true, nil, false, imageNode, imageNode.bounds) + } + } f(.default) - }))) } } @@ -1172,7 +1182,7 @@ final class ChatMediaInputNode: ChatInputNode { if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(file, nil, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(file, false, false, nil, false, sourceNode, sourceRect) } else { return false } @@ -1238,16 +1248,28 @@ final class ChatMediaInputNode: ChatInputNode { menuItems.append(.action(ContextMenuActionItem(text: strongSelf.strings.Conversation_SendMessage_SendSilently, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Menu/SilentIcon"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in + if let strongSelf = self, let peekController = strongSelf.peekController { + if let animationNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.animationNode { + let _ = strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), true, false, nil, false, animationNode, animationNode.bounds) + } else if let imageNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.imageNode { + let _ = strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), true, false, nil, false, imageNode, imageNode.bounds) + } + } f(.default) - }))) } menuItems.append(.action(ContextMenuActionItem(text: strongSelf.strings.Conversation_SendMessage_ScheduleMessage, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Menu/ScheduleIcon"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in + if let strongSelf = self, let peekController = strongSelf.peekController { + if let animationNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.animationNode { + let _ = strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), false, true, nil, false, animationNode, animationNode.bounds) + } else if let imageNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.imageNode { + let _ = strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), false, true, nil, false, imageNode, imageNode.bounds) + } + } f(.default) - }))) } } @@ -1279,7 +1301,7 @@ final class ChatMediaInputNode: ChatInputNode { if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(file, nil, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(file, false, false, nil, false, sourceNode, sourceRect) } else { return false } @@ -1317,6 +1339,7 @@ final class ChatMediaInputNode: ChatInputNode { self?.requestDisableStickerAnimations?(visible) self?.simulateUpdateLayout(isVisible: !visible) } + strongSelf.peekController = controller strongSelf.controllerInteraction.presentGlobalOverlayController(controller, nil) return controller } @@ -1821,7 +1844,7 @@ final class ChatMediaInputNode: ChatInputNode { }) } - self.updatePaneClippingContainer(size: CGSize(width: width, height: panelHeight), offset: contentVerticalOffset, transition: transition) + self.updatePaneClippingContainer(size: CGSize(width: width, height: panelHeight), offset: self.currentCollectionListPanelOffset(), transition: transition) transition.updateFrame(node: self.panesBackgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: width, height: panelHeight))) diff --git a/submodules/TelegramUI/Sources/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/Sources/ChatMediaInputStickerGridItem.swift index c65e85329d..96b8f7ebc8 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputStickerGridItem.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputStickerGridItem.swift @@ -342,7 +342,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { return } if let interfaceInteraction = self.interfaceInteraction, let (_, item, _) = self.currentState, case .ended = recognizer.state { - let _ = interfaceInteraction.sendSticker(.standalone(media: item.file), nil, false, self, self.bounds) + let _ = interfaceInteraction.sendSticker(.standalone(media: item.file), false, false, nil, false, self, self.bounds) self.imageNode.layer.animateAlpha(from: 0.5, to: 1.0, duration: 1.0) } } diff --git a/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift b/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift index d8b37e863b..c678ed9039 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift @@ -327,7 +327,7 @@ final class ChatMediaInputTrendingPane: ChatMediaInputPane { let packReference: StickerPackReference = .id(id: info.id.id, accessHash: info.accessHash) let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, false, false, nil, false, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TelegramUI/Sources/ChatMessageActionItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageActionItemNode.swift index bd21d88018..5de1a424d7 100644 --- a/submodules/TelegramUI/Sources/ChatMessageActionItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageActionItemNode.swift @@ -17,6 +17,7 @@ import TelegramStringFormatting import UniversalMediaPlayer import TelegramUniversalVideoContent import GalleryUI +import WallpaperBackgroundNode private func attributedServiceMessageString(theme: ChatPresentationThemeData, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, dateTimeFormat: PresentationDateTimeFormat, message: Message, accountPeerId: PeerId) -> NSAttributedString? { return universalServiceMessageString(presentationData: (theme.theme, theme.wallpaper), strings: strings, nameDisplayOrder: nameDisplayOrder, dateTimeFormat: dateTimeFormat, message: message, accountPeerId: accountPeerId, forChatList: false) @@ -24,7 +25,9 @@ private func attributedServiceMessageString(theme: ChatPresentationThemeData, st class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { let labelNode: TextNode - let filledBackgroundNode: LinkHighlightingNode + var backgroundNode: WallpaperBackgroundNode.BubbleBackgroundNode? + var backgroundColorNode: ASDisplayNode + let backgroundMaskNode: ASImageNode var linkHighlightingNode: LinkHighlightingNode? private let mediaBackgroundNode: ASImageNode @@ -33,21 +36,24 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { private var videoContent: NativeVideoContent? private var videoStartTimestamp: Double? private let fetchDisposable = MetaDisposable() + + private var cachedMaskBackgroundImage: (CGPoint, UIImage, [CGRect])? + private var absoluteRect: (CGRect, CGSize)? required init() { self.labelNode = TextNode() self.labelNode.isUserInteractionEnabled = false self.labelNode.displaysAsynchronously = false - - self.filledBackgroundNode = LinkHighlightingNode(color: .clear) + + self.backgroundColorNode = ASDisplayNode() + self.backgroundMaskNode = ASImageNode() self.mediaBackgroundNode = ASImageNode() self.mediaBackgroundNode.displaysAsynchronously = false self.mediaBackgroundNode.displayWithoutProcessing = true super.init() - - self.addSubnode(self.filledBackgroundNode) + self.addSubnode(self.labelNode) } @@ -124,7 +130,8 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { override func asyncLayoutContent() -> (_ item: ChatMessageBubbleContentItem, _ layoutConstants: ChatMessageItemLayoutConstants, _ preparePosition: ChatMessageBubblePreparePosition, _ messageSelection: Bool?, _ constrainedSize: CGSize) -> (ChatMessageBubbleContentProperties, unboundSize: CGSize?, maxWidth: CGFloat, layout: (CGSize, ChatMessageBubbleContentPosition) -> (CGFloat, (CGFloat) -> (CGSize, (ListViewItemUpdateAnimation, Bool) -> Void))) { let makeLabelLayout = TextNode.asyncLayout(self.labelNode) - let backgroundLayout = self.filledBackgroundNode.asyncLayout() + + let cachedMaskBackgroundImage = self.cachedMaskBackgroundImage return { item, layoutConstants, _, _, _ in let contentProperties = ChatMessageBubbleContentProperties(hidesSimpleAuthorHeader: true, headerSpacing: 0.0, hidesBackground: .always, forceFullCorners: false, forceAlignment: .center) @@ -172,7 +179,15 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { } let serviceColor = serviceMessageColorComponents(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) - let backgroundApply = backgroundLayout(serviceColor.fill, labelRects, 10.0, 10.0, 0.0) + + let backgroundMaskImage: (CGPoint, UIImage)? + var backgroundMaskUpdated = false + if let (currentOffset, currentImage, currentRects) = cachedMaskBackgroundImage, currentRects == labelRects { + backgroundMaskImage = (currentOffset, currentImage) + } else { + backgroundMaskImage = LinkHighlightingNode.generateImage(color: .black, inset: 0.0, innerRadius: 10.0, outerRadius: 10.0, rects: labelRects) + backgroundMaskUpdated = true + } var backgroundSize = CGSize(width: labelLayout.size.width + 8.0 + 8.0, height: labelLayout.size.height + 4.0) @@ -260,17 +275,76 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { } let _ = apply() - let _ = backgroundApply() let labelFrame = CGRect(origin: CGPoint(x: 8.0, y: image != nil ? 2 : floorToScreenPixels((backgroundSize.height - labelLayout.size.height) / 2.0) - 1.0), size: labelLayout.size) strongSelf.labelNode.frame = labelFrame - strongSelf.filledBackgroundNode.frame = labelFrame.offsetBy(dx: 0.0, dy: -11.0) + strongSelf.backgroundColorNode.backgroundColor = item.presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic + + let baseBackgroundFrame = labelFrame.offsetBy(dx: 0.0, dy: -11.0) + + if let (offset, image) = backgroundMaskImage { + if strongSelf.backgroundNode == nil { + if let backgroundNode = item.controllerInteraction.presentationContext.backgroundNode?.makeBubbleBackground(for: .free) { + strongSelf.backgroundNode = backgroundNode + backgroundNode.addSubnode(strongSelf.backgroundColorNode) + strongSelf.insertSubnode(backgroundNode, at: 0) + } + } + + if backgroundMaskUpdated, let backgroundNode = strongSelf.backgroundNode { + if labelRects.count == 1 { + backgroundNode.clipsToBounds = true + backgroundNode.cornerRadius = labelRects[0].height / 2.0 + backgroundNode.view.mask = nil + } else { + backgroundNode.clipsToBounds = false + backgroundNode.cornerRadius = 0.0 + backgroundNode.view.mask = strongSelf.backgroundMaskNode.view + } + } + + if let backgroundNode = strongSelf.backgroundNode { + backgroundNode.frame = CGRect(origin: CGPoint(x: baseBackgroundFrame.minX + offset.x, y: baseBackgroundFrame.minY + offset.y), size: image.size) + if let (rect, size) = strongSelf.absoluteRect { + strongSelf.updateAbsoluteRect(rect, within: size) + } + } + strongSelf.backgroundMaskNode.image = image + strongSelf.backgroundMaskNode.frame = CGRect(origin: CGPoint(), size: image.size) + + strongSelf.backgroundColorNode.frame = CGRect(origin: CGPoint(), size: image.size) + + strongSelf.cachedMaskBackgroundImage = (offset, image, labelRects) + } } }) }) }) } } + + override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { + self.absoluteRect = (rect, containerSize) + + if let backgroundNode = self.backgroundNode { + var backgroundFrame = backgroundNode.frame + backgroundFrame.origin.x += rect.minX + backgroundFrame.origin.y += rect.minY + backgroundNode.update(rect: backgroundFrame, within: containerSize) + } + } + + override func applyAbsoluteOffset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { + if let backgroundNode = self.backgroundNode { + backgroundNode.offset(value: value, animationCurve: animationCurve, duration: duration) + } + } + + override func applyAbsoluteOffsetSpring(value: CGFloat, duration: Double, damping: CGFloat) { + if let backgroundNode = self.backgroundNode { + backgroundNode.offsetSpring(value: value, duration: duration, damping: damping) + } + } override func updateTouchesAtPoint(_ point: CGPoint?) { if let item = self.item { @@ -347,7 +421,7 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { return .openMessage } - if self.filledBackgroundNode.frame.contains(point.offsetBy(dx: 0.0, dy: -10.0)) { + if let backgroundNode = self.backgroundNode, backgroundNode.frame.contains(point.offsetBy(dx: 0.0, dy: -10.0)) { return .openMessage } else { return .none diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index bbc72d23c8..f6d3a3ba48 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -51,7 +51,7 @@ extension SlotMachineAnimationNode: GenericAnimatedStickerNode { } class ChatMessageShareButton: HighlightableButtonNode { - private let backgroundNode: ASImageNode + private let backgroundNode: NavigationBackgroundNode private let iconNode: ASImageNode private var theme: PresentationTheme? @@ -60,7 +60,7 @@ class ChatMessageShareButton: HighlightableButtonNode { private var textNode: ImmediateTextNode? init() { - self.backgroundNode = ASImageNode() + self.backgroundNode = NavigationBackgroundNode(color: .clear) self.iconNode = ASImageNode() super.init(pointerStyle: nil) @@ -95,19 +95,22 @@ class ChatMessageShareButton: HighlightableButtonNode { self.isReplies = isReplies let graphics = PresentationResourcesChat.additionalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, bubbleCorners: presentationData.chatBubbleCorners) - var updatedShareButtonBackground: UIImage? + //var updatedShareButtonBackground: UIImage? var updatedIconImage: UIImage? if case .pinnedMessages = subject { - updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage + updatedIconImage = PresentationResourcesChat.chatFreeNavigateButtonIcon(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + //updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage } else if isReplies { - updatedShareButtonBackground = PresentationResourcesChat.chatFreeCommentButtonBackground(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + //updatedShareButtonBackground = PresentationResourcesChat.chatFreeCommentButtonBackground(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) updatedIconImage = PresentationResourcesChat.chatFreeCommentButtonIcon(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) } else if message.id.peerId.isRepliesOrSavedMessages(accountPeerId: account.peerId) { - updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage + updatedIconImage = PresentationResourcesChat.chatFreeNavigateButtonIcon(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + //updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage } else { - updatedShareButtonBackground = graphics.chatBubbleShareButtonImage + updatedIconImage = PresentationResourcesChat.chatFreeShareButtonIcon(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) + //updatedShareButtonBackground = graphics.chatBubbleShareButtonImage } - self.backgroundNode.image = updatedShareButtonBackground + self.backgroundNode.color = presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic self.iconNode.image = updatedIconImage } var size = CGSize(width: 30.0, height: 30.0) @@ -144,6 +147,7 @@ class ChatMessageShareButton: HighlightableButtonNode { textNode.removeFromSupernode() } self.backgroundNode.frame = CGRect(origin: CGPoint(), size: size) + self.backgroundNode.update(size: self.backgroundNode.bounds.size, cornerRadius: self.backgroundNode.bounds.height / 2.0, transition: .immediate) if let image = self.iconNode.image { self.iconNode.frame = CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.width - image.size.width) / 2.0) - (offsetIcon ? 1.0 : 0.0)), size: image.size) } @@ -174,12 +178,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { private let disposable = MetaDisposable() private var forwardInfoNode: ChatMessageForwardInfoNode? - private var forwardBackgroundNode: ASImageNode? + private var forwardBackgroundNode: NavigationBackgroundNode? private var viaBotNode: TextNode? private let dateAndStatusNode: ChatMessageDateAndStatusNode private var replyInfoNode: ChatMessageReplyInfoNode? - private var replyBackgroundNode: ASImageNode? + private var replyBackgroundNode: NavigationBackgroundNode? private var actionButtonsNode: ChatMessageActionButtonsNode? @@ -635,13 +639,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let actionButtonsLayout = ChatMessageActionButtonsNode.asyncLayout(self.actionButtonsNode) let makeForwardInfoLayout = ChatMessageForwardInfoNode.asyncLayout(self.forwardInfoNode) - let currentForwardBackgroundNode = self.forwardBackgroundNode let viaBotLayout = TextNode.asyncLayout(self.viaBotNode) let makeReplyInfoLayout = ChatMessageReplyInfoNode.asyncLayout(self.replyInfoNode) - let currentReplyBackgroundNode = self.replyBackgroundNode let currentShareButtonNode = self.shareButtonNode - let currentItem = self.item let currentForwardInfo = self.appliedForwardInfo return { item, params, mergedTop, mergedBottom, dateHeaderAtBottom in @@ -836,8 +837,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { var viaBotApply: (TextNodeLayout, () -> TextNode)? var replyInfoApply: (CGSize, () -> ChatMessageReplyInfoNode)? - var updatedReplyBackgroundNode: ASImageNode? - var replyBackgroundImage: UIImage? + var needsReplyBackground = false var replyMarkup: ReplyMarkupMessageAttribute? var ignoreForward = self.telegramDice == nil @@ -903,14 +903,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } if replyInfoApply != nil || viaBotApply != nil { - if let currentReplyBackgroundNode = currentReplyBackgroundNode { - updatedReplyBackgroundNode = currentReplyBackgroundNode - } else { - updatedReplyBackgroundNode = ASImageNode() - } - - let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, bubbleCorners: item.presentationData.chatBubbleCorners) - replyBackgroundImage = graphics.chatFreeformContentAdditionalInfoBackgroundImage + needsReplyBackground = true } var updatedShareButtonNode: ChatMessageShareButton? @@ -930,8 +923,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { var forwardPsaType: String? var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)? - var updatedForwardBackgroundNode: ASImageNode? - var forwardBackgroundImage: UIImage? + var needsForwardBackground = false if !ignoreForward, let forwardInfo = item.message.forwardInfo { forwardPsaType = forwardInfo.psaType @@ -956,15 +948,8 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } let availableWidth = max(60.0, availableContentWidth + 6.0) forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) - - if let currentForwardBackgroundNode = currentForwardBackgroundNode { - updatedForwardBackgroundNode = currentForwardBackgroundNode - } else { - updatedForwardBackgroundNode = ASImageNode() - } - - let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, bubbleCorners: item.presentationData.chatBubbleCorners) - forwardBackgroundImage = graphics.chatServiceBubbleFillImage + + needsForwardBackground = true } var maxContentWidth = imageSize.width @@ -1056,18 +1041,18 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { dateAndStatusApply(false) strongSelf.dateAndStatusNode.frame = CGRect(origin: CGPoint(x: max(displayLeftInset, updatedImageFrame.maxX - dateAndStatusSize.width - 4.0), y: updatedImageFrame.maxY - dateAndStatusSize.height - 4.0), size: dateAndStatusSize) - - if let updatedReplyBackgroundNode = updatedReplyBackgroundNode { - if strongSelf.replyBackgroundNode == nil { - strongSelf.replyBackgroundNode = updatedReplyBackgroundNode - strongSelf.contextSourceNode.contentNode.addSubnode(updatedReplyBackgroundNode) - updatedReplyBackgroundNode.image = replyBackgroundImage + + if needsReplyBackground { + if let replyBackgroundNode = strongSelf.replyBackgroundNode { + replyBackgroundNode.color = item.presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic } else { - strongSelf.replyBackgroundNode?.image = replyBackgroundImage + let replyBackgroundNode = NavigationBackgroundNode(color: item.presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic) + strongSelf.replyBackgroundNode = replyBackgroundNode + strongSelf.contextSourceNode.contentNode.addSubnode(replyBackgroundNode) } } else if let replyBackgroundNode = strongSelf.replyBackgroundNode { - replyBackgroundNode.removeFromSupernode() strongSelf.replyBackgroundNode = nil + replyBackgroundNode.removeFromSupernode() } if let (viaBotLayout, viaBotApply) = viaBotApply { @@ -1078,7 +1063,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 15.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 14.0)), y: 8.0), size: viaBotLayout.size) viaBotNode.frame = viaBotFrame - strongSelf.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 6.0, y: viaBotFrame.minY - 2.0 - UIScreenPixel), size: CGSize(width: viaBotFrame.size.width + 11.0, height: viaBotFrame.size.height + 5.0)) + if let replyBackgroundNode = strongSelf.replyBackgroundNode { + replyBackgroundNode.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 6.0, y: viaBotFrame.minY - 2.0 - UIScreenPixel), size: CGSize(width: viaBotFrame.size.width + 11.0, height: viaBotFrame.size.height + 5.0)) + replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) + } } else if let viaBotNode = strongSelf.viaBotNode { viaBotNode.removeFromSupernode() strongSelf.viaBotNode = nil @@ -1101,7 +1089,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } } replyInfoNode.frame = replyInfoFrame - strongSelf.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0)) + if let replyBackgroundNode = strongSelf.replyBackgroundNode { + replyBackgroundNode.frame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0)) + replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) + } if let _ = item.controllerInteraction.selectionState, isEmoji { replyInfoNode.alpha = 0.0 @@ -1142,16 +1133,15 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { deliveryFailedNode?.removeFromSupernode() }) } - - if let updatedForwardBackgroundNode = updatedForwardBackgroundNode { - if strongSelf.forwardBackgroundNode == nil { - strongSelf.forwardBackgroundNode = updatedForwardBackgroundNode - strongSelf.addSubnode(updatedForwardBackgroundNode) - updatedForwardBackgroundNode.image = forwardBackgroundImage + + if needsForwardBackground { + if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { + forwardBackgroundNode.color = item.presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic + } else { + let forwardBackgroundNode = NavigationBackgroundNode(color: item.presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic) + strongSelf.forwardBackgroundNode = forwardBackgroundNode + strongSelf.addSubnode(forwardBackgroundNode) } - } else if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { - forwardBackgroundNode.removeFromSupernode() - strongSelf.forwardBackgroundNode = nil } if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply { @@ -1162,7 +1152,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize) forwardInfoNode.frame = forwardInfoFrame - strongSelf.forwardBackgroundNode?.frame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0)) + if let forwardBackgroundNode = strongSelf.forwardBackgroundNode { + forwardBackgroundNode.frame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0)) + forwardBackgroundNode.update(size: forwardBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) + } } else if let forwardInfoNode = strongSelf.forwardInfoNode { forwardInfoNode.removeFromSupernode() strongSelf.forwardInfoNode = nil diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleBackdrop.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleBackdrop.swift index fb5b2a3923..d679949ea3 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleBackdrop.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleBackdrop.swift @@ -82,6 +82,12 @@ final class ChatMessageBubbleBackdrop: ASDisplayNode { } if let backgroundContent = self.backgroundContent { backgroundContent.frame = self.bounds + if let (rect, containerSize) = self.absolutePosition { + var backgroundFrame = backgroundContent.frame + backgroundFrame.origin.x += rect.minX + backgroundFrame.origin.y += rect.minY + backgroundContent.update(rect: backgroundFrame, within: containerSize) + } } } } @@ -132,6 +138,12 @@ final class ChatMessageBubbleBackdrop: ASDisplayNode { if let backgroundContent = self.backgroundContent { backgroundContent.frame = self.bounds + if let (rect, containerSize) = self.absolutePosition { + var backgroundFrame = backgroundContent.frame + backgroundFrame.origin.x += rect.minX + backgroundFrame.origin.y += rect.minY + backgroundContent.update(rect: backgroundFrame, within: containerSize) + } } if typeUpdated { @@ -147,7 +159,10 @@ final class ChatMessageBubbleBackdrop: ASDisplayNode { if let backgroundContent = backgroundNode?.makeBubbleBackground(for: .incoming) { backgroundContent.frame = self.bounds if let (rect, containerSize) = self.absolutePosition { - backgroundContent.update(rect: rect, within: containerSize) + var backgroundFrame = backgroundContent.frame + backgroundFrame.origin.x += rect.minX + backgroundFrame.origin.y += rect.minY + backgroundContent.update(rect: backgroundFrame, within: containerSize) } self.backgroundContent = backgroundContent self.insertSubnode(backgroundContent, at: 0) @@ -156,7 +171,10 @@ final class ChatMessageBubbleBackdrop: ASDisplayNode { if let backgroundContent = backgroundNode?.makeBubbleBackground(for: .outgoing) { backgroundContent.frame = self.bounds if let (rect, containerSize) = self.absolutePosition { - backgroundContent.update(rect: rect, within: containerSize) + var backgroundFrame = backgroundContent.frame + backgroundFrame.origin.x += rect.minX + backgroundFrame.origin.y += rect.minY + backgroundContent.update(rect: backgroundFrame, within: containerSize) } self.backgroundContent = backgroundContent self.insertSubnode(backgroundContent, at: 0) @@ -172,7 +190,12 @@ final class ChatMessageBubbleBackdrop: ASDisplayNode { func update(rect: CGRect, within containerSize: CGSize) { self.absolutePosition = (rect, containerSize) - self.backgroundContent?.update(rect: rect, within: containerSize) + if let backgroundContent = self.backgroundContent { + var backgroundFrame = backgroundContent.frame + backgroundFrame.origin.x += rect.minX + backgroundFrame.origin.y += rect.minY + backgroundContent.update(rect: backgroundFrame, within: containerSize) + } } func offset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { @@ -200,7 +223,7 @@ final class ChatMessageBubbleBackdrop: ASDisplayNode { transition.updateFrame(layer: maskView.layer, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: value.size.width, height: value.size.height)).insetBy(dx: -maskInset, dy: -maskInset)) } if let backgroundContent = self.backgroundContent { - transition.updateFrame(layer: backgroundContent.layer, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: value.size.width, height: value.size.height))) + transition.updateFrame(node: backgroundContent, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: value.size.width, height: value.size.height))) } transition.updateFrame(layer: self.layer, frame: value, completion: { _ in completion() diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift index 8f716ff1eb..c91e035fe0 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift @@ -201,6 +201,15 @@ class ChatMessageBubbleContentNode: ASDisplayNode { func updateIsExtractedToContextPreview(_ value: Bool) { } + + func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { + } + + func applyAbsoluteOffset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { + } + + func applyAbsoluteOffsetSpring(value: CGFloat, duration: Double, damping: CGFloat) { + } func reactionTargetNode(value: String) -> (ASDisplayNode, ASDisplayNode)? { return nil diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift index 69d3cb8cb5..abdaedc7f4 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift @@ -3763,8 +3763,13 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode } private func updateAbsoluteRectInternal(_ rect: CGRect, within containerSize: CGSize) { - let mappedRect = CGRect(origin: CGPoint(x: rect.minX + self.backgroundWallpaperNode.frame.minX, y: rect.minY + self.backgroundWallpaperNode.frame.minY), size: rect.size) - self.backgroundWallpaperNode.update(rect: mappedRect, within: containerSize) + var backgroundWallpaperFrame = self.backgroundWallpaperNode.frame + backgroundWallpaperFrame.origin.x += rect.minX + backgroundWallpaperFrame.origin.y += rect.minY + self.backgroundWallpaperNode.update(rect: backgroundWallpaperFrame, within: containerSize) + for contentNode in self.contentNodes { + contentNode.updateAbsoluteRect(CGRect(origin: CGPoint(x: rect.minX + contentNode.frame.minX, y: rect.minY + contentNode.frame.minY), size: rect.size), within: containerSize) + } } override func applyAbsoluteOffset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { @@ -3775,10 +3780,18 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode private func applyAbsoluteOffsetInternal(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { self.backgroundWallpaperNode.offset(value: value, animationCurve: animationCurve, duration: duration) + + for contentNode in self.contentNodes { + contentNode.applyAbsoluteOffset(value: value, animationCurve: animationCurve, duration: duration) + } } private func applyAbsoluteOffsetSpringInternal(value: CGFloat, duration: Double, damping: CGFloat) { self.backgroundWallpaperNode.offsetSpring(value: value, duration: duration, damping: damping) + + for contentNode in self.contentNodes { + contentNode.applyAbsoluteOffsetSpring(value: value, duration: duration, damping: damping) + } } override func getMessageContextSourceNode(stableId: UInt32?) -> ContextExtractedContentContainingNode? { diff --git a/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift index 0c19b74988..bd2cddfa54 100644 --- a/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift @@ -151,6 +151,7 @@ private final class StatusReactionNode: ASDisplayNode { class ChatMessageDateAndStatusNode: ASDisplayNode { private var backgroundNode: ASImageNode? + private var blurredBackgroundNode: NavigationBackgroundNode? private var checkSentNode: ASImageNode? private var checkReadNode: ASImageNode? private var clockFrameNode: ASImageNode? @@ -227,6 +228,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { return { context, presentationData, edited, impressionCount, dateText, type, constrainedSize, reactions, replyCount, isPinned, hasAutoremove in let dateColor: UIColor var backgroundImage: UIImage? + var blurredBackgroundColor: UIColor? var outgoingStatus: ChatMessageDateAndStatusOutgoingType? var leftInset: CGFloat @@ -236,7 +238,6 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { let clockMinImage: UIImage? var impressionImage: UIImage? var repliesImage: UIImage? - let selfExpiringImage: UIImage? = nil let themeUpdated = presentationData.theme != currentTheme || type != currentType @@ -326,7 +327,8 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { case .FreeIncoming: let serviceColor = serviceMessageColorComponents(theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) dateColor = serviceColor.primaryText - backgroundImage = graphics.dateAndStatusFreeBackground + //backgroundImage = graphics.dateAndStatusFreeBackground + blurredBackgroundColor = presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic leftInset = 0.0 loadedCheckFullImage = PresentationResourcesChat.chatFreeFullCheck(presentationData.theme.theme, size: checkSize, isDefaultWallpaper: isDefaultWallpaper) loadedCheckPartialImage = PresentationResourcesChat.chatFreePartialCheck(presentationData.theme.theme, size: checkSize, isDefaultWallpaper: isDefaultWallpaper) @@ -347,7 +349,8 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { let serviceColor = serviceMessageColorComponents(theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) dateColor = serviceColor.primaryText outgoingStatus = status - backgroundImage = graphics.dateAndStatusFreeBackground + //backgroundImage = graphics.dateAndStatusFreeBackground + blurredBackgroundColor = presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic leftInset = 0.0 loadedCheckFullImage = PresentationResourcesChat.chatFreeFullCheck(presentationData.theme.theme, size: checkSize, isDefaultWallpaper: isDefaultWallpaper) loadedCheckPartialImage = PresentationResourcesChat.chatFreePartialCheck(presentationData.theme.theme, size: checkSize, isDefaultWallpaper: isDefaultWallpaper) @@ -416,20 +419,6 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { currentRepliesIcon = nil } - var selfExpiringIconSize = CGSize() - if let selfExpiringImage = selfExpiringImage { - if currentSelfExpiringIcon == nil { - let iconNode = ASImageNode() - iconNode.isLayerBacked = true - iconNode.displayWithoutProcessing = true - iconNode.displaysAsynchronously = false - currentSelfExpiringIcon = iconNode - } - selfExpiringIconSize = selfExpiringImage.size - } else { - currentSelfExpiringIcon = nil - } - if let outgoingStatus = outgoingStatus { switch outgoingStatus { case .Sending: @@ -536,6 +525,8 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { currentBackgroundNode = backgroundNode } backgroundInsets = UIEdgeInsets(top: 2.0, left: 7.0, bottom: 2.0, right: 7.0) + } else if blurredBackgroundColor != nil { + backgroundInsets = UIEdgeInsets(top: 2.0, left: 7.0, bottom: 2.0, right: 7.0) } let reactionSize: CGFloat = 14.0 @@ -584,10 +575,6 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { reactionInset += 12.0 } - if !selfExpiringIconSize.width.isZero { - reactionInset += selfExpiringIconSize.width + 1.0 - } - leftInset += reactionInset let layoutSize = CGSize(width: leftInset + impressionWidth + date.size.width + statusWidth + backgroundInsets.left + backgroundInsets.right, height: date.size.height + backgroundInsets.top + backgroundInsets.bottom) @@ -621,6 +608,27 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { strongSelf.backgroundNode = nil } } + + if let blurredBackgroundColor = blurredBackgroundColor { + if let blurredBackgroundNode = strongSelf.blurredBackgroundNode { + blurredBackgroundNode.color = blurredBackgroundColor + let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.4, curve: .spring) : .immediate + if let previousLayoutSize = previousLayoutSize { + blurredBackgroundNode.frame = blurredBackgroundNode.frame.offsetBy(dx: layoutSize.width - previousLayoutSize.width, dy: 0.0) + } + transition.updateFrame(node: blurredBackgroundNode, frame: CGRect(origin: CGPoint(), size: layoutSize)) + blurredBackgroundNode.update(size: blurredBackgroundNode.bounds.size, cornerRadius: blurredBackgroundNode.bounds.height / 2.0, transition: transition) + } else { + let blurredBackgroundNode = NavigationBackgroundNode(color: blurredBackgroundColor) + strongSelf.blurredBackgroundNode = blurredBackgroundNode + strongSelf.insertSubnode(blurredBackgroundNode, at: 0) + blurredBackgroundNode.frame = CGRect(origin: CGPoint(), size: layoutSize) + blurredBackgroundNode.update(size: blurredBackgroundNode.bounds.size, cornerRadius: blurredBackgroundNode.bounds.height / 2.0, transition: .immediate) + } + } else if let blurredBackgroundNode = strongSelf.blurredBackgroundNode { + strongSelf.blurredBackgroundNode = nil + blurredBackgroundNode.removeFromSupernode() + } strongSelf.dateNode.displaysAsynchronously = !presentationData.isPreview let _ = dateApply() @@ -834,34 +842,6 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { } } - if let currentSelfExpiringIcon = currentSelfExpiringIcon { - currentSelfExpiringIcon.displaysAsynchronously = !presentationData.isPreview - if currentSelfExpiringIcon.image !== selfExpiringImage { - currentSelfExpiringIcon.image = selfExpiringImage - } - if currentSelfExpiringIcon.supernode == nil { - strongSelf.selfExpiringIcon = currentSelfExpiringIcon - strongSelf.addSubnode(currentSelfExpiringIcon) - if animated { - currentSelfExpiringIcon.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15) - } - } - currentSelfExpiringIcon.frame = CGRect(origin: CGPoint(x: reactionOffset - 2.0, y: backgroundInsets.top + offset + floor((date.size.height - selfExpiringIconSize.height) / 2.0)), size: selfExpiringIconSize) - reactionOffset += 9.0 - } else if let selfExpiringIcon = strongSelf.selfExpiringIcon { - strongSelf.selfExpiringIcon = nil - if animated { - if let previousLayoutSize = previousLayoutSize { - selfExpiringIcon.frame = selfExpiringIcon.frame.offsetBy(dx: layoutSize.width - previousLayoutSize.width, dy: 0.0) - } - selfExpiringIcon.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak selfExpiringIcon] _ in - selfExpiringIcon?.removeFromSupernode() - }) - } else { - selfExpiringIcon.removeFromSupernode() - } - } - if let (layout, apply) = replyCountLayoutAndApply { let node = apply() if strongSelf.replyCountNode !== node { diff --git a/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift b/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift index 966cf27ff6..4f0d22fd15 100644 --- a/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift +++ b/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift @@ -92,7 +92,7 @@ private func monthAtIndex(_ index: Int, strings: PresentationStrings) -> String final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { let labelNode: TextNode - let backgroundNode: ASImageNode + let backgroundNode: NavigationBackgroundNode let stickBackgroundNode: ASImageNode let activateArea: AccessibilityAreaNode @@ -116,10 +116,8 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { self.labelNode.isUserInteractionEnabled = false self.labelNode.displaysAsynchronously = !presentationData.isPreview - self.backgroundNode = ASImageNode() - self.backgroundNode.isLayerBacked = true - self.backgroundNode.displayWithoutProcessing = true - self.backgroundNode.displaysAsynchronously = false + self.backgroundNode = NavigationBackgroundNode(color: .clear) + self.backgroundNode.isUserInteractionEnabled = false self.stickBackgroundNode = ASImageNode() self.stickBackgroundNode.isLayerBacked = true @@ -167,10 +165,11 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { let graphics = PresentationResourcesChat.principalGraphics(theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, bubbleCorners: presentationData.chatBubbleCorners) - self.backgroundNode.image = graphics.dateStaticBackground + //self.backgroundNode.image = graphics.dateStaticBackground + self.backgroundNode.color = presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic self.stickBackgroundNode.image = graphics.dateFloatingBackground self.stickBackgroundNode.alpha = 0.0 - self.backgroundNode.addSubnode(self.stickBackgroundNode) + //self.backgroundNode.addSubnode(self.stickBackgroundNode) self.addSubnode(self.backgroundNode) self.addSubnode(self.labelNode) @@ -200,7 +199,8 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { let graphics = PresentationResourcesChat.principalGraphics(theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, bubbleCorners: presentationData.chatBubbleCorners) - self.backgroundNode.image = graphics.dateStaticBackground + //self.backgroundNode.image = graphics.dateStaticBackground + self.backgroundNode.color = presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic self.stickBackgroundNode.image = graphics.dateFloatingBackground let titleFont = Font.medium(min(18.0, floor(presentationData.fontSize.baseDisplaySize * 13.0 / 17.0))) @@ -219,12 +219,13 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { } func updateBackgroundColor(_ color: UIColor) { - let chatDateSize: CGFloat = 20.0 + self.backgroundNode.color = color + /*let chatDateSize: CGFloat = 20.0 self.backgroundNode.image = generateImage(CGSize(width: chatDateSize, height: chatDateSize), contextGenerator: { size, context -> Void in context.clear(CGRect(origin: CGPoint(), size: size)) context.setFillColor(color.cgColor) context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) - })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2) + })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2)*/ } override func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat) { @@ -237,6 +238,7 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { let backgroundFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - backgroundSize.width) / 2.0), y: (34.0 - chatDateSize) / 2.0), size: backgroundSize) self.stickBackgroundNode.frame = CGRect(origin: CGPoint(), size: backgroundFrame.size) self.backgroundNode.frame = backgroundFrame + self.backgroundNode.update(size: backgroundFrame.size, cornerRadius: backgroundFrame.size.height / 2.0, transition: .immediate) self.labelNode.frame = CGRect(origin: CGPoint(x: backgroundFrame.origin.x + chatDateInset, y: backgroundFrame.origin.y + floorToScreenPixels((backgroundSize.height - labelSize.height) / 2.0)), size: labelSize) self.activateArea.frame = backgroundFrame diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift index c4bb25cfdb..b98ea1e721 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift @@ -47,7 +47,8 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { private var secretProgressIcon: UIImage? private let fetchDisposable = MetaDisposable() - + + private var durationBackgroundNode: NavigationBackgroundNode? private var durationNode: ChatInstantVideoMessageDurationNode? private let dateAndStatusNode: ChatMessageDateAndStatusNode @@ -358,28 +359,51 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { if let telegramFile = updatedFile { if updatedMedia { let durationTextColor: UIColor - let durationFillColor: UIColor + let durationBlurColor: UIColor? switch statusDisplayType { case .free: let serviceColor = serviceMessageColorComponents(theme: theme.theme, wallpaper: theme.wallpaper) durationTextColor = serviceColor.primaryText - durationFillColor = serviceColor.fill + durationBlurColor = theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic case .bubble: - durationFillColor = .clear + durationBlurColor = nil if item.message.effectivelyIncoming(item.context.account.peerId) { durationTextColor = theme.theme.chat.message.incoming.secondaryTextColor } else { durationTextColor = theme.theme.chat.message.outgoing.secondaryTextColor } } + + if let durationBlurColor = durationBlurColor { + if let durationBackgroundNode = strongSelf.durationBackgroundNode { + durationBackgroundNode.color = durationBlurColor + } else { + let durationBackgroundNode = NavigationBackgroundNode(color: durationBlurColor) + strongSelf.durationBackgroundNode = durationBackgroundNode + strongSelf.addSubnode(durationBackgroundNode) + } + } else if let durationBackgroundNode = strongSelf.durationBackgroundNode { + strongSelf.durationBackgroundNode = nil + durationBackgroundNode.removeFromSupernode() + } + let durationNode: ChatInstantVideoMessageDurationNode if let current = strongSelf.durationNode { durationNode = current - current.updateTheme(textColor: durationTextColor, fillColor: durationFillColor) + current.updateTheme(textColor: durationTextColor) } else { - durationNode = ChatInstantVideoMessageDurationNode(textColor: durationTextColor, fillColor: durationFillColor) + durationNode = ChatInstantVideoMessageDurationNode(textColor: durationTextColor) strongSelf.durationNode = durationNode strongSelf.addSubnode(durationNode) + durationNode.sizeUpdated = { [weak strongSelf] size in + guard let strongSelf = strongSelf else { + return + } + if let durationBackgroundNode = strongSelf.durationBackgroundNode, let durationNode = strongSelf.durationNode { + durationBackgroundNode.frame = CGRect(origin: CGPoint(x: durationNode.frame.maxX - size.width, y: durationNode.frame.minY), size: size) + durationBackgroundNode.update(size: size, cornerRadius: size.height / 2.0, transition: .immediate) + } + } } durationNode.defaultDuration = telegramFile.duration.flatMap(Double.init) @@ -449,6 +473,11 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { if let durationNode = strongSelf.durationNode { durationNode.frame = CGRect(origin: CGPoint(x: videoFrame.midX - 56.0, y: videoFrame.maxY - 18.0), size: CGSize(width: 1.0, height: 1.0)) durationNode.isSeen = !notConsumed + let size = durationNode.size + if let durationBackgroundNode = strongSelf.durationBackgroundNode, size.width > 1.0 { + durationBackgroundNode.frame = CGRect(origin: CGPoint(x: durationNode.frame.maxX - size.width, y: durationNode.frame.minY), size: size) + durationBackgroundNode.update(size: size, cornerRadius: size.height / 2.0, transition: .immediate) + } } if let videoNode = strongSelf.videoNode { diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift index c99f5af2ef..d865a95afc 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift @@ -586,6 +586,8 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio } else { colors.append(contentsOf: patternColors.map(UIColor.init(rgb:))) } + let isLight = UIColor.average(of: patternColors.map(UIColor.init(rgb:))).hsb.b > 0.3 + customPatternColor = isLight ? .black : .white } patternArguments = PatternWallpaperArguments(colors: colors, rotation: rotation, customPatternColor: customPatternColor) } diff --git a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift index 3789e562d7..8cdec7adf4 100644 --- a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift @@ -38,7 +38,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { private var viaBotNode: TextNode? private let dateAndStatusNode: ChatMessageDateAndStatusNode private var replyInfoNode: ChatMessageReplyInfoNode? - private var replyBackgroundNode: ASImageNode? + private var replyBackgroundNode: NavigationBackgroundNode? private var actionButtonsNode: ChatMessageActionButtonsNode? @@ -294,9 +294,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { let viaBotLayout = TextNode.asyncLayout(self.viaBotNode) let makeReplyInfoLayout = ChatMessageReplyInfoNode.asyncLayout(self.replyInfoNode) - let currentReplyBackgroundNode = self.replyBackgroundNode let currentShareButtonNode = self.shareButtonNode - let currentItem = self.item return { item, params, mergedTop, mergedBottom, dateHeaderAtBottom in let accessibilityData = ChatMessageAccessibilityData(item: item, isSelected: nil) @@ -485,8 +483,6 @@ class ChatMessageStickerItemNode: ChatMessageItemView { var viaBotApply: (TextNodeLayout, () -> TextNode)? var replyInfoApply: (CGSize, () -> ChatMessageReplyInfoNode)? - var updatedReplyBackgroundNode: ASImageNode? - var replyBackgroundImage: UIImage? var replyMarkup: ReplyMarkupMessageAttribute? var availableWidth = max(60.0, params.width - params.leftInset - params.rightInset - max(imageSize.width, 160.0) - 20.0 - layoutConstants.bubble.edgeInset * 2.0 - avatarInset - layoutConstants.bubble.contentInsets.left) @@ -535,16 +531,11 @@ class ChatMessageStickerItemNode: ChatMessageItemView { } } } + + var needsReplyBackground = false if replyInfoApply != nil || viaBotApply != nil { - if let currentReplyBackgroundNode = currentReplyBackgroundNode { - updatedReplyBackgroundNode = currentReplyBackgroundNode - } else { - updatedReplyBackgroundNode = ASImageNode() - } - - let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, bubbleCorners: item.presentationData.chatBubbleCorners) - replyBackgroundImage = graphics.chatFreeformContentAdditionalInfoBackgroundImage + needsReplyBackground = true } var updatedShareButtonNode: ChatMessageShareButton? @@ -689,13 +680,13 @@ class ChatMessageStickerItemNode: ChatMessageItemView { strongSelf.shareButtonNode = nil } - if let updatedReplyBackgroundNode = updatedReplyBackgroundNode { - if strongSelf.replyBackgroundNode == nil { - strongSelf.replyBackgroundNode = updatedReplyBackgroundNode - strongSelf.contextSourceNode.contentNode.addSubnode(updatedReplyBackgroundNode) - updatedReplyBackgroundNode.image = replyBackgroundImage + if needsReplyBackground { + if let replyBackgroundNode = strongSelf.replyBackgroundNode { + replyBackgroundNode.color = item.presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic } else { - strongSelf.replyBackgroundNode?.image = replyBackgroundImage + let replyBackgroundNode = NavigationBackgroundNode(color: item.presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic) + strongSelf.replyBackgroundNode = replyBackgroundNode + strongSelf.contextSourceNode.contentNode.addSubnode(replyBackgroundNode) } } else if let replyBackgroundNode = strongSelf.replyBackgroundNode { replyBackgroundNode.removeFromSupernode() @@ -709,7 +700,10 @@ class ChatMessageStickerItemNode: ChatMessageItemView { strongSelf.addSubnode(viaBotNode) } viaBotNode.frame = viaBotFrame - strongSelf.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 6.0, y: viaBotFrame.minY - 2.0 - UIScreenPixel), size: CGSize(width: viaBotFrame.size.width + 11.0, height: viaBotFrame.size.height + 5.0)) + if let replyBackgroundNode = strongSelf.replyBackgroundNode { + replyBackgroundNode.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 6.0, y: viaBotFrame.minY - 2.0 - UIScreenPixel), size: CGSize(width: viaBotFrame.size.width + 11.0, height: viaBotFrame.size.height + 5.0)) + replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) + } } else if let viaBotNode = strongSelf.viaBotNode { viaBotNode.removeFromSupernode() strongSelf.viaBotNode = nil @@ -722,7 +716,10 @@ class ChatMessageStickerItemNode: ChatMessageItemView { strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode) } replyInfoNode.frame = replyInfoFrame - strongSelf.replyBackgroundNode?.frame = replyBackgroundFrame ?? CGRect() + if let replyBackgroundNode = strongSelf.replyBackgroundNode, let replyBackgroundFrame = replyBackgroundFrame { + replyBackgroundNode.frame = replyBackgroundFrame + replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate) + } if isEmoji && !incoming { if let _ = item.controllerInteraction.selectionState { diff --git a/submodules/TelegramUI/Sources/ChatPanelInterfaceInteraction.swift b/submodules/TelegramUI/Sources/ChatPanelInterfaceInteraction.swift index dd210b1147..535edc35e7 100644 --- a/submodules/TelegramUI/Sources/ChatPanelInterfaceInteraction.swift +++ b/submodules/TelegramUI/Sources/ChatPanelInterfaceInteraction.swift @@ -92,7 +92,7 @@ final class ChatPanelInterfaceInteraction { let displayVideoUnmuteTip: (CGPoint?) -> Void let switchMediaRecordingMode: () -> Void let setupMessageAutoremoveTimeout: () -> Void - let sendSticker: (FileMediaReference, ASDisplayNode, CGRect) -> Bool + let sendSticker: (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool let unblockPeer: () -> Void let pinMessage: (MessageId, ContextControllerProtocol?) -> Void let unpinMessage: (MessageId, Bool, ContextControllerProtocol?) -> Void @@ -175,7 +175,7 @@ final class ChatPanelInterfaceInteraction { displayVideoUnmuteTip: @escaping (CGPoint?) -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, - sendSticker: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, + sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, unblockPeer: @escaping () -> Void, pinMessage: @escaping (MessageId, ContextControllerProtocol?) -> Void, unpinMessage: @escaping (MessageId, Bool, ContextControllerProtocol?) -> Void, diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsController.swift b/submodules/TelegramUI/Sources/ChatRecentActionsController.swift index 19da1eb2ee..28613f4035 100644 --- a/submodules/TelegramUI/Sources/ChatRecentActionsController.swift +++ b/submodules/TelegramUI/Sources/ChatRecentActionsController.swift @@ -98,7 +98,7 @@ final class ChatRecentActionsController: TelegramBaseController { }, displayVideoUnmuteTip: { _ in }, switchMediaRecordingMode: { }, setupMessageAutoremoveTimeout: { - }, sendSticker: { _, _, _ in + }, sendSticker: { _, _, _, _ in return false }, unblockPeer: { }, pinMessage: { _, _ in diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift index 180e91b098..14e507311e 100644 --- a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift @@ -263,7 +263,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }, activateMessagePinch: { _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in - }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _, _ in + }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _, _ in self?.openUrl(url) }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { [weak self] message, associatedData in if let strongSelf = self, let navigationController = strongSelf.getNavigationController() { diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsSearchNavigationContentNode.swift b/submodules/TelegramUI/Sources/ChatRecentActionsSearchNavigationContentNode.swift index e591d1c031..b052b828fc 100644 --- a/submodules/TelegramUI/Sources/ChatRecentActionsSearchNavigationContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatRecentActionsSearchNavigationContentNode.swift @@ -26,7 +26,7 @@ final class ChatRecentActionsSearchNavigationContentNode: NavigationBarContentNo self.cancel = cancel - self.searchBar = SearchBarNode(theme: SearchBarNodeTheme(theme: theme, hasSeparator: false), strings: strings, fieldStyle: .modern) + self.searchBar = SearchBarNode(theme: SearchBarNodeTheme(theme: theme, hasSeparator: false), strings: strings, fieldStyle: .modern, displayBackground: false) let placeholderText = strings.Common_Search self.searchBar.placeholderString = NSAttributedString(string: placeholderText, font: searchBarFont, textColor: theme.rootController.navigationSearchBar.inputPlaceholderTextColor) diff --git a/submodules/TelegramUI/Sources/ChatReplyCountItem.swift b/submodules/TelegramUI/Sources/ChatReplyCountItem.swift index 5d99ecb98a..7525b7a19f 100644 --- a/submodules/TelegramUI/Sources/ChatReplyCountItem.swift +++ b/submodules/TelegramUI/Sources/ChatReplyCountItem.swift @@ -6,6 +6,7 @@ import Display import SwiftSignalKit import TelegramPresentationData import AccountContext +import WallpaperBackgroundNode private let titleFont = UIFont.systemFont(ofSize: 13.0) @@ -15,13 +16,15 @@ class ChatReplyCountItem: ListViewItem { let count: Int let presentationData: ChatPresentationData let header: ChatMessageDateHeader + let controllerInteraction: ChatControllerInteraction - init(index: MessageIndex, isComments: Bool, count: Int, presentationData: ChatPresentationData, context: AccountContext) { + init(index: MessageIndex, isComments: Bool, count: Int, presentationData: ChatPresentationData, context: AccountContext, controllerInteraction: ChatControllerInteraction) { self.index = index self.isComments = isComments self.count = count self.presentationData = presentationData self.header = ChatMessageDateHeader(timestamp: index.timestamp, scheduled: false, presentationData: presentationData, context: context) + self.controllerInteraction = controllerInteraction } func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { @@ -61,21 +64,23 @@ class ChatReplyCountItem: ListViewItem { class ChatReplyCountItemNode: ListViewItemNode { var item: ChatReplyCountItem? let labelNode: TextNode - let filledBackgroundNode: LinkHighlightingNode + var backgroundNode: WallpaperBackgroundNode.BubbleBackgroundNode? + var backgroundColorNode: ASDisplayNode private var theme: ChatPresentationThemeData? private let layoutConstants = ChatMessageItemLayoutConstants.default + + private var absoluteRect: (CGRect, CGSize)? init() { self.labelNode = TextNode() self.labelNode.isUserInteractionEnabled = false - - self.filledBackgroundNode = LinkHighlightingNode(color: .clear) + + self.backgroundColorNode = ASDisplayNode() super.init(layerBacked: false, dynamicBounce: true, rotated: true) - - self.addSubnode(self.filledBackgroundNode) + self.addSubnode(self.labelNode) self.transform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) @@ -106,7 +111,6 @@ class ChatReplyCountItemNode: ListViewItemNode { func asyncLayout() -> (_ item: ChatReplyCountItem, _ params: ListViewItemLayoutParams, _ dateAtBottom: Bool) -> (ListViewItemNodeLayout, () -> Void) { let makeLabelLayout = TextNode.asyncLayout(self.labelNode) - let backgroundLayout = self.filledBackgroundNode.asyncLayout() let layoutConstants = self.layoutConstants @@ -145,9 +149,6 @@ class ChatReplyCountItemNode: ListViewItemNode { labelRects[i].origin.x = floor((labelLayout.size.width - labelRects[i].width) / 2.0) } - let serviceColor = serviceMessageColorComponents(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) - let backgroundApply = backgroundLayout(serviceColor.fill, labelRects, 10.0, 10.0, 0.0) - let backgroundSize = CGSize(width: labelLayout.size.width + 8.0 + 8.0, height: labelLayout.size.height + 4.0) return (ListViewItemNodeLayout(contentSize: CGSize(width: params.width, height: backgroundSize.height), insets: UIEdgeInsets(top: 6.0 + (dateAtBottom ? layoutConstants.timestampHeaderHeight : 0.0), left: 0.0, bottom: 5.0, right: 0.0)), { [weak self] in @@ -156,15 +157,59 @@ class ChatReplyCountItemNode: ListViewItemNode { strongSelf.theme = item.presentationData.theme let _ = apply() - let _ = backgroundApply() + + if strongSelf.backgroundNode == nil { + if let backgroundNode = item.controllerInteraction.presentationContext.backgroundNode?.makeBubbleBackground(for: .free) { + strongSelf.backgroundNode = backgroundNode + backgroundNode.addSubnode(strongSelf.backgroundColorNode) + strongSelf.insertSubnode(backgroundNode, at: 0) + } + } let labelFrame = CGRect(origin: CGPoint(x: floor((params.width - backgroundSize.width) / 2.0) + 8.0, y: floorToScreenPixels((backgroundSize.height - labelLayout.size.height) / 2.0) - 1.0), size: labelLayout.size) strongSelf.labelNode.frame = labelFrame - strongSelf.filledBackgroundNode.frame = labelFrame.offsetBy(dx: 0.0, dy: -11.0) + + strongSelf.backgroundColorNode.backgroundColor = item.presentationData.theme.theme.chat.serviceMessage.components.withDefaultWallpaper.dateFillStatic + + let baseBackgroundFrame = CGRect(origin: CGPoint(x: labelFrame.minX - 6.0, y: labelFrame.minY - 2.0), size: CGSize(width: labelFrame.width + 6.0 * 2.0, height: labelFrame.height + 2.0 * 2.0)) + + if let backgroundNode = strongSelf.backgroundNode { + backgroundNode.frame = baseBackgroundFrame + + backgroundNode.clipsToBounds = true + backgroundNode.cornerRadius = baseBackgroundFrame.height / 2.0 + + if let (rect, size) = strongSelf.absoluteRect { + strongSelf.updateAbsoluteRect(rect, within: size) + } + } + + strongSelf.backgroundColorNode.frame = CGRect(origin: CGPoint(), size: baseBackgroundFrame.size) } }) } } + + override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { + var rect = rect + rect.origin.y = containerSize.height - rect.maxY + self.insets.top + + self.absoluteRect = (rect, containerSize) + + if let backgroundNode = self.backgroundNode { + var backgroundFrame = backgroundNode.frame + backgroundFrame.origin.x += rect.minX + backgroundFrame.origin.y += rect.minY + + backgroundNode.update(rect: backgroundFrame, within: containerSize) + } + } + + override func applyAbsoluteOffset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { + if let backgroundNode = self.backgroundNode { + backgroundNode.offset(value: CGPoint(x: value.x, y: -value.y), animationCurve: animationCurve, duration: duration) + } + } override public func header() -> ListViewItemHeader? { if let item = self.item { diff --git a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift index 1355f4e8b0..f5068f2528 100644 --- a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift +++ b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift @@ -111,7 +111,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { self.controllerInteraction = ChatControllerInteraction(openMessage: { _, _ in return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, activateMessagePinch: { _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in - }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { fileReference, _, _, node, rect in return selectStickerImpl?(fileReference, node, rect) ?? false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { fileReference, _, _, _, _, node, rect in return selectStickerImpl?(fileReference, node, rect) ?? false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, chatControllerNode: { @@ -226,7 +226,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, false, false, nil, false, sourceNode, sourceRect) } else { return false } @@ -343,7 +343,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, false, false, nil, false, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TelegramUI/Sources/FeaturedStickersScreen.swift b/submodules/TelegramUI/Sources/FeaturedStickersScreen.swift index 6c75ea74ea..66a14b33b4 100644 --- a/submodules/TelegramUI/Sources/FeaturedStickersScreen.swift +++ b/submodules/TelegramUI/Sources/FeaturedStickersScreen.swift @@ -466,8 +466,12 @@ private final class FeaturedStickersScreenNode: ViewControllerTracingNode { var menuItems: [ContextMenuItem] = [] menuItems = [ .action(ContextMenuActionItem(text: strongSelf.presentationData.strings.StickerPack_Send, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.contextMenu.primaryColor) }, action: { _, f in - if let strongSelf = self, let peekController = strongSelf.peekController, let animationNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.animationNode { - let _ = strongSelf.sendSticker?(.standalone(media: item.file), animationNode, animationNode.bounds) + if let strongSelf = self, let peekController = strongSelf.peekController { + if let animationNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.animationNode { + let _ = strongSelf.sendSticker?(.standalone(media: item.file), animationNode, animationNode.bounds) + } else if let imageNode = (peekController.contentNode as? StickerPreviewPeekContentNode)?.imageNode { + let _ = strongSelf.sendSticker?(.standalone(media: item.file), imageNode, imageNode.bounds) + } } f(.default) })), diff --git a/submodules/TelegramUI/Sources/HorizontalListContextResultsChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/HorizontalListContextResultsChatInputContextPanelNode.swift index e55f3dab37..5be9dffd0a 100644 --- a/submodules/TelegramUI/Sources/HorizontalListContextResultsChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/HorizontalListContextResultsChatInputContextPanelNode.swift @@ -162,7 +162,7 @@ final class HorizontalListContextResultsChatInputContextPanelNode: ChatInputCont if let strongSelf = self { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.interfaceInteraction?.getNavigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.interfaceInteraction?.sendSticker(file, sourceNode, sourceRect) ?? false + return strongSelf.interfaceInteraction?.sendSticker(file, false, sourceNode, sourceRect) ?? false } else { return false } diff --git a/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift b/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift index a3c8bd6b53..0ab47cce87 100755 --- a/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift @@ -70,7 +70,7 @@ private struct StickerEntry: Identifiable, Comparable { return HorizontalStickerGridItem(account: account, file: self.file, theme: theme, isPreviewed: { item in return false//stickersInteraction.previewedStickerItem == item }, sendSticker: { file, node, rect in - let _ = interfaceInteraction.sendSticker(file, node, rect) + let _ = interfaceInteraction.sendSticker(file, true, node, rect) }) } } @@ -180,7 +180,7 @@ final class HorizontalStickersChatContextPanelNode: ChatInputContextPanelNode { .action(ContextMenuActionItem(text: strongSelf.strings.StickerPack_Send, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.contextMenu.primaryColor) }, action: { _, f in f(.default) - let _ = controllerInteraction.sendSticker(.standalone(media: item.file), nil, true, itemNode, itemNode.bounds) + let _ = controllerInteraction.sendSticker(.standalone(media: item.file), false, false, nil, true, itemNode, itemNode.bounds) })), .action(ContextMenuActionItem(text: isStarred ? strongSelf.strings.Stickers_RemoveFromFavorites : strongSelf.strings.Stickers_AddToFavorites, icon: { theme in generateTintedImage(image: isStarred ? UIImage(bundleImageName: "Chat/Context Menu/Unstar") : UIImage(bundleImageName: "Chat/Context Menu/Rate"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in f(.default) @@ -203,7 +203,7 @@ final class HorizontalStickersChatContextPanelNode: ChatInputContextPanelNode { if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction { - return controllerInteraction.sendSticker(file, nil, true, sourceNode, sourceRect) + return controllerInteraction.sendSticker(file, false, false, nil, true, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift b/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift index 5e4d4663d4..10a0845037 100644 --- a/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift +++ b/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift @@ -94,7 +94,7 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie .action(ContextMenuActionItem(text: strongSelf.strings.StickerPack_Send, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.contextMenu.primaryColor) }, action: { _, f in f(.default) - let _ = controllerInteraction.sendSticker(.standalone(media: item.file), nil, true, itemNode, itemNode.bounds) + let _ = controllerInteraction.sendSticker(.standalone(media: item.file), false, false, nil, true, itemNode, itemNode.bounds) })), .action(ContextMenuActionItem(text: isStarred ? strongSelf.strings.Stickers_RemoveFromFavorites : strongSelf.strings.Stickers_AddToFavorites, icon: { theme in generateTintedImage(image: isStarred ? UIImage(bundleImageName: "Chat/Context Menu/Unstar") : UIImage(bundleImageName: "Chat/Context Menu/Rate"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in f(.default) @@ -117,7 +117,7 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self, let controllerInteraction = strongSelf.getControllerInteraction?() { - return controllerInteraction.sendSticker(file, nil, true, sourceNode, sourceRect) + return controllerInteraction.sendSticker(file, false, false, nil, true, sourceNode, sourceRect) } else { return false } @@ -476,7 +476,7 @@ final class InlineReactionSearchPanel: ChatInputContextPanelNode { guard let strongSelf = self else { return } - let _ = strongSelf.controllerInteraction?.sendSticker(file, strongSelf.query, true, node, rect) + let _ = strongSelf.controllerInteraction?.sendSticker(file, false, false, strongSelf.query, true, node, rect) } self.view.disablesInteractiveTransitionGestureRecognizer = true diff --git a/submodules/TelegramUI/Sources/LegacyCache.swift b/submodules/TelegramUI/Sources/LegacyCache.swift deleted file mode 100644 index 947b6e4b55..0000000000 --- a/submodules/TelegramUI/Sources/LegacyCache.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Foundation -import LegacyComponents - -public final class LegacyCache { - private let impl: TGCache - - public init(path: String) { - self.impl = TGCache(cachesPath: path) - } - - public func path(forCachedData id: String) -> String? { - return self.impl.path(forCachedData: id) - } -} diff --git a/submodules/TelegramUI/Sources/NotificationContentContext.swift b/submodules/TelegramUI/Sources/NotificationContentContext.swift index 200f8467b0..e2e5e653f5 100644 --- a/submodules/TelegramUI/Sources/NotificationContentContext.swift +++ b/submodules/TelegramUI/Sources/NotificationContentContext.swift @@ -137,7 +137,7 @@ public final class NotificationViewControllerImpl { return nil }) - sharedAccountContext = SharedAccountContextImpl(mainWindow: nil, sharedContainerPath: self.initializationData.appGroupPath, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, apiHash: self.initializationData.apiHash, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, voipVersions: [], appData: .single(self.initializationData.bundleData), autolockDeadine: .single(nil), encryptionProvider: OpenSSLEncryptionProvider()), rootPath: rootPath, legacyBasePath: nil, legacyCache: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) + sharedAccountContext = SharedAccountContextImpl(mainWindow: nil, sharedContainerPath: self.initializationData.appGroupPath, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, apiHash: self.initializationData.apiHash, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, voipVersions: [], appData: .single(self.initializationData.bundleData), autolockDeadine: .single(nil), encryptionProvider: OpenSSLEncryptionProvider()), rootPath: rootPath, legacyBasePath: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) presentationDataPromise.set(sharedAccountContext!.presentationData) } diff --git a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift index f6d13ed6be..dfbbb13687 100644 --- a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift +++ b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift @@ -78,7 +78,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in - }, sendSticker: { _, _, _, _, _ in + }, sendSticker: { _, _, _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 97e2314ed6..43e5e94578 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -413,7 +413,7 @@ final class PeerInfoSelectionPanelNode: ASDisplayNode { }, displayVideoUnmuteTip: { _ in }, switchMediaRecordingMode: { }, setupMessageAutoremoveTimeout: { - }, sendSticker: { _, _, _ in + }, sendSticker: { _, _, _, _ in return false }, unblockPeer: { }, pinMessage: { _, _ in @@ -2020,7 +2020,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD strongSelf.paneContainerNode.updateSelectedMessageIds(strongSelf.state.selectedMessageIds, animated: true) }, sendCurrentMessage: { _ in }, sendMessage: { _ in - }, sendSticker: { _, _, _, _, _ in + }, sendSticker: { _, _, _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false diff --git a/submodules/TelegramUI/Sources/ShareExtensionContext.swift b/submodules/TelegramUI/Sources/ShareExtensionContext.swift index 0db057c5e0..91507ed685 100644 --- a/submodules/TelegramUI/Sources/ShareExtensionContext.swift +++ b/submodules/TelegramUI/Sources/ShareExtensionContext.swift @@ -232,7 +232,7 @@ public class ShareRootControllerImpl { return nil }) - let sharedContext = SharedAccountContextImpl(mainWindow: nil, sharedContainerPath: self.initializationData.appGroupPath, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, apiHash: self.initializationData.apiHash, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, voipVersions: [], appData: .single(self.initializationData.bundleData), autolockDeadine: .single(nil), encryptionProvider: OpenSSLEncryptionProvider()), rootPath: rootPath, legacyBasePath: nil, legacyCache: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) + let sharedContext = SharedAccountContextImpl(mainWindow: nil, sharedContainerPath: self.initializationData.appGroupPath, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, apiHash: self.initializationData.apiHash, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, voipVersions: [], appData: .single(self.initializationData.bundleData), autolockDeadine: .single(nil), encryptionProvider: OpenSSLEncryptionProvider()), rootPath: rootPath, legacyBasePath: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) presentationDataPromise.set(sharedContext.presentationData) internalContext = InternalContext(sharedContext: sharedContext) globalInternalContext = internalContext diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index b4408f5f1f..678464b545 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -162,7 +162,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { private var spotlightDataContext: SpotlightDataContext? private var widgetDataContext: WidgetDataContext? - public init(mainWindow: Window1?, sharedContainerPath: String, basePath: String, encryptionParameters: ValueBoxEncryptionParameters, accountManager: AccountManager, appLockContext: AppLockContext, applicationBindings: TelegramApplicationBindings, initialPresentationDataAndSettings: InitialPresentationDataAndSettings, networkArguments: NetworkInitializationArguments, rootPath: String, legacyBasePath: String?, legacyCache: LegacyCache?, apsNotificationToken: Signal, voipNotificationToken: Signal, setNotificationCall: @escaping (PresentationCall?) -> Void, navigateToChat: @escaping (AccountRecordId, PeerId, MessageId?) -> Void, displayUpgradeProgress: @escaping (Float?) -> Void = { _ in }) { + public init(mainWindow: Window1?, sharedContainerPath: String, basePath: String, encryptionParameters: ValueBoxEncryptionParameters, accountManager: AccountManager, appLockContext: AppLockContext, applicationBindings: TelegramApplicationBindings, initialPresentationDataAndSettings: InitialPresentationDataAndSettings, networkArguments: NetworkInitializationArguments, rootPath: String, legacyBasePath: String?, apsNotificationToken: Signal, voipNotificationToken: Signal, setNotificationCall: @escaping (PresentationCall?) -> Void, navigateToChat: @escaping (AccountRecordId, PeerId, MessageId?) -> Void, displayUpgradeProgress: @escaping (Float?) -> Void = { _ in }) { assert(Queue.mainQueue().isCurrent()) precondition(!testHasInstance) @@ -1229,7 +1229,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { tapMessage?(message) }, clickThroughMessage: { clickThroughMessage?() - }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in + }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { diff --git a/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift b/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift index 14c25e6392..d02c198e72 100644 --- a/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift +++ b/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift @@ -227,7 +227,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode { let packReference: StickerPackReference = .id(id: info.id.id, accessHash: info.accessHash) let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { [weak self] fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, false, false, nil, false, sourceNode, sourceRect) } else { return false } @@ -322,7 +322,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode { } }, sendSticker: { [weak self] file, sourceNode, sourceRect in if let strongSelf = self { - let _ = strongSelf.controllerInteraction.sendSticker(file, nil, false, sourceNode, sourceRect) + let _ = strongSelf.controllerInteraction.sendSticker(file, false, false, nil, false, sourceNode, sourceRect) } }, getItemIsPreviewed: { item in return inputNodeInteraction.previewedStickerPackItem == .pack(item) diff --git a/submodules/TelegramUI/Sources/StickersChatInputContextPanelItem.swift b/submodules/TelegramUI/Sources/StickersChatInputContextPanelItem.swift index 2431113e7e..b6d6abcde9 100644 --- a/submodules/TelegramUI/Sources/StickersChatInputContextPanelItem.swift +++ b/submodules/TelegramUI/Sources/StickersChatInputContextPanelItem.swift @@ -126,7 +126,7 @@ final class StickersChatInputContextPanelItemNode: ListViewItemNode { for i in 0 ..< self.nodes.count { if self.nodes[i].frame.contains(location) { let file = item.files[i] - item.interfaceInteraction.sendSticker(.standalone(media: file), self.nodes[i], self.nodes[i].bounds) + item.interfaceInteraction.sendSticker(.standalone(media: file), true, self.nodes[i], self.nodes[i].bounds) break } } diff --git a/submodules/TelegramUI/Sources/StickersChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/StickersChatInputContextPanelNode.swift index b69e5daa0a..85907f71d1 100644 --- a/submodules/TelegramUI/Sources/StickersChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/StickersChatInputContextPanelNode.swift @@ -136,7 +136,7 @@ final class StickersChatInputContextPanelNode: ChatInputContextPanelNode { .action(ContextMenuActionItem(text: strongSelf.strings.StickerPack_Send, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Resend"), color: theme.contextMenu.primaryColor) }, action: { _, f in f(.default) - let _ = controllerInteraction.sendSticker(.standalone(media: item.file), nil, true, itemNode, itemNode.bounds) + let _ = controllerInteraction.sendSticker(.standalone(media: item.file), false, false, nil, true, itemNode, itemNode.bounds) })), .action(ContextMenuActionItem(text: isStarred ? strongSelf.strings.Stickers_RemoveFromFavorites : strongSelf.strings.Stickers_AddToFavorites, icon: { theme in generateTintedImage(image: isStarred ? UIImage(bundleImageName: "Chat/Context Menu/Unstar") : UIImage(bundleImageName: "Chat/Context Menu/Rate"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in f(.default) @@ -159,7 +159,7 @@ final class StickersChatInputContextPanelNode: ChatInputContextPanelNode { if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction { - return controllerInteraction.sendSticker(file, nil, true, sourceNode, sourceRect) + return controllerInteraction.sendSticker(file, false, false, nil, true, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TelegramUI/Sources/TelegramAccountAuxiliaryMethods.swift b/submodules/TelegramUI/Sources/TelegramAccountAuxiliaryMethods.swift index 1eced6852a..e1a7121b40 100644 --- a/submodules/TelegramUI/Sources/TelegramAccountAuxiliaryMethods.swift +++ b/submodules/TelegramUI/Sources/TelegramAccountAuxiliaryMethods.swift @@ -9,6 +9,9 @@ import MusicAlbumArtResources import LocalMediaResources import LocationResources import ChatInterfaceState +import WallpaperResources +import AppBundle +import SwiftSignalKit public let telegramAccountAuxiliaryMethods = AccountAuxiliaryMethods(updatePeerChatInputState: { interfaceState, inputState -> PeerChatInterfaceState? in if interfaceState == nil { @@ -39,6 +42,25 @@ public let telegramAccountAuxiliaryMethods = AccountAuxiliaryMethods(updatePeerC return fetchEmojiSpriteResource(account: account, resource: resource) } else if let resource = resource as? VenueIconResource { return fetchVenueIconResource(account: account, resource: resource) + } else if let wallpaperResource = resource as? WallpaperDataResource { + let builtinWallpapers: [String] = [ + "fqv01SQemVIBAAAApND8LDRUhRU" + ] + if builtinWallpapers.contains(wallpaperResource.slug) { + if let url = getAppBundle().url(forResource: wallpaperResource.slug, withExtension: "tgv") { + return Signal { subscriber in + subscriber.putNext(.reset) + if let data = try? Data(contentsOf: url, options: .mappedRead) { + subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< data.count, complete: true)) + } + + return EmptyDisposable + } + } else { + return nil + } + } + return nil } return nil }, fetchResourceMediaReferenceHash: { resource in diff --git a/submodules/TelegramVoip/Sources/GroupCallContext.swift b/submodules/TelegramVoip/Sources/GroupCallContext.swift index 0aa3a31d3e..98f829d5e3 100644 --- a/submodules/TelegramVoip/Sources/GroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/GroupCallContext.swift @@ -194,14 +194,28 @@ public final class OngoingGroupCallContext { case full } - public var audioSsrc: UInt32 - public var videoDescription: String - public var quality: Quality + public struct SsrcGroup: Equatable { + public var semantics: String + public var ssrcs: [UInt32] - public init(audioSsrc: UInt32, videoDescription: String, quality: Quality) { + public init(semantics: String, ssrcs: [UInt32]) { + self.semantics = semantics + self.ssrcs = ssrcs + } + } + + public var audioSsrc: UInt32 + public var endpointId: String + public var ssrcGroups: [SsrcGroup] + public var minQuality: Quality + public var maxQuality: Quality + + public init(audioSsrc: UInt32, endpointId: String, ssrcGroups: [SsrcGroup], minQuality: Quality, maxQuality: Quality) { self.audioSsrc = audioSsrc - self.videoDescription = videoDescription - self.quality = quality + self.endpointId = endpointId + self.ssrcGroups = ssrcGroups + self.minQuality = minQuality + self.maxQuality = maxQuality } } @@ -376,19 +390,34 @@ public final class OngoingGroupCallContext { self.currentRequestedVideoChannels = channels self.context.setRequestedVideoChannels(channels.map { channel -> OngoingGroupCallRequestedVideoChannel in - let mappedQuality: OngoingGroupCallRequestedVideoQuality - switch channel.quality { + let mappedMinQuality: OngoingGroupCallRequestedVideoQuality + switch channel.minQuality { case .thumbnail: - mappedQuality = .thumbnail + mappedMinQuality = .thumbnail case .medium: - mappedQuality = .medium + mappedMinQuality = .medium case .full: - mappedQuality = .full + mappedMinQuality = .full + } + let mappedMaxQuality: OngoingGroupCallRequestedVideoQuality + switch channel.maxQuality { + case .thumbnail: + mappedMaxQuality = .thumbnail + case .medium: + mappedMaxQuality = .medium + case .full: + mappedMaxQuality = .full } return OngoingGroupCallRequestedVideoChannel( audioSsrc: channel.audioSsrc, - videoInformation: channel.videoDescription, - quality: mappedQuality + endpointId: channel.endpointId, + ssrcGroups: channel.ssrcGroups.map { group in + return OngoingGroupCallSsrcGroup( + semantics: group.semantics, + ssrcs: group.ssrcs.map { $0 as NSNumber }) + }, + minQuality: mappedMinQuality, + maxQuality: mappedMaxQuality ) }) } @@ -542,38 +571,74 @@ public final class OngoingGroupCallContext { } completion(mainVideoView, cloneVideoView) #else - completion(OngoingCallContextPresentationCallVideoView( - view: view, - setOnFirstFrameReceived: { [weak view] f in - view?.setOnFirstFrameReceived(f) + let mainVideoView = OngoingCallContextPresentationCallVideoView( + view: mainView, + setOnFirstFrameReceived: { [weak mainView] f in + mainView?.setOnFirstFrameReceived(f) }, - getOrientation: { [weak view] in - if let view = view { - return OngoingCallVideoOrientation(view.orientation) + getOrientation: { [weak mainView] in + if let mainView = mainView { + return OngoingCallVideoOrientation(mainView.orientation) } else { return .rotation0 } }, - getAspect: { [weak view] in - if let view = view { - return view.aspect + getAspect: { [weak mainView] in + if let mainView = mainView { + return mainView.aspect } else { return 0.0 } }, - setOnOrientationUpdated: { [weak view] f in - view?.setOnOrientationUpdated { value, aspect in + setOnOrientationUpdated: { [weak mainView] f in + mainView?.setOnOrientationUpdated { value, aspect in f?(OngoingCallVideoOrientation(value), aspect) } - }, setVideoContentMode: { [weak view] mode in - view?.setVideoContentMode(mode) + }, setVideoContentMode: { [weak mainView] mode in + mainView?.setVideoContentMode(mode) }, - setOnIsMirroredUpdated: { [weak view] f in - view?.setOnIsMirroredUpdated { value in + setOnIsMirroredUpdated: { [weak mainView] f in + mainView?.setOnIsMirroredUpdated { value in f?(value) } } - )) + ) + var cloneVideoView: OngoingCallContextPresentationCallVideoView? + if let cloneView = cloneView { + cloneVideoView = OngoingCallContextPresentationCallVideoView( + view: cloneView, + setOnFirstFrameReceived: { [weak cloneView] f in + cloneView?.setOnFirstFrameReceived(f) + }, + getOrientation: { [weak cloneView] in + if let cloneView = cloneView { + return OngoingCallVideoOrientation(cloneView.orientation) + } else { + return .rotation0 + } + }, + getAspect: { [weak cloneView] in + if let cloneView = cloneView { + return cloneView.aspect + } else { + return 0.0 + } + }, + setOnOrientationUpdated: { [weak cloneView] f in + cloneView?.setOnOrientationUpdated { value, aspect in + f?(OngoingCallVideoOrientation(value), aspect) + } + }, setVideoContentMode: { [weak cloneView] mode in + cloneView?.setVideoContentMode(mode) + }, + setOnIsMirroredUpdated: { [weak cloneView] f in + cloneView?.setOnIsMirroredUpdated { value in + f?(value) + } + } + ) + } + completion(mainVideoView, cloneVideoView) #endif } else { completion(nil, nil) diff --git a/submodules/TelegramVoip/Sources/IpcGroupCallContext.swift b/submodules/TelegramVoip/Sources/IpcGroupCallContext.swift index 3820f40490..af9f2ce13c 100644 --- a/submodules/TelegramVoip/Sources/IpcGroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/IpcGroupCallContext.swift @@ -1,6 +1,7 @@ import Foundation import SwiftSignalKit import CoreMedia +import ImageIO private struct PayloadDescription: Codable { var id: UInt32 @@ -626,8 +627,8 @@ public final class IpcGroupCallBufferAppContext { } private var isActiveCheckTimer: SwiftSignalKit.Timer? - private let framesPipe = ValuePipe() - public var frames: Signal { + private let framesPipe = ValuePipe<(CVPixelBuffer, CGImagePropertyOrientation)>() + public var frames: Signal<(CVPixelBuffer, CGImagePropertyOrientation), NoError> { return self.framesPipe.signal() } @@ -661,9 +662,12 @@ public final class IpcGroupCallBufferAppContext { return } - let data = Data(bytesNoCopy: mappedFile.memory, count: mappedFile.size, deallocator: .none) + var orientationValue: Int32 = 0 + mappedFile.read(at: 0 ..< 4, to: &orientationValue) + let orientation = CGImagePropertyOrientation(rawValue: UInt32(bitPattern: orientationValue)) ?? .up + let data = Data(bytesNoCopy: mappedFile.memory.advanced(by: 4), count: mappedFile.size - 4, deallocator: .none) if let frame = deserializePixelBuffer(data: data) { - strongSelf.framesPipe.putNext(frame) + strongSelf.framesPipe.putNext((frame, orientation)) } }, queue: .mainQueue()) self.framePollTimer = framePollTimer @@ -814,12 +818,14 @@ public final class IpcGroupCallBufferBroadcastContext { } } - public func setCurrentFrame(data: Data) { + public func setCurrentFrame(data: Data, orientation: CGImagePropertyOrientation) { //let _ = try? data.write(to: URL(fileURLWithPath: dataPath), options: []) if let mappedFile = self.mappedFile, mappedFile.size >= data.count { let _ = data.withUnsafeBytes { bytes in - memcpy(mappedFile.memory, bytes.baseAddress!, data.count) + var orientationValue = Int32(bitPattern: orientation.rawValue) + memmove(mappedFile.memory, &orientationValue, 4) + memcpy(mappedFile.memory.advanced(by: 4), bytes.baseAddress!, data.count) } } diff --git a/submodules/TelegramVoip/Sources/OngoingCallContext.swift b/submodules/TelegramVoip/Sources/OngoingCallContext.swift index 2e10125487..9e77b2e613 100644 --- a/submodules/TelegramVoip/Sources/OngoingCallContext.swift +++ b/submodules/TelegramVoip/Sources/OngoingCallContext.swift @@ -334,6 +334,11 @@ extension OngoingCallThreadLocalContext: OngoingCallThreadLocalContextProtocol { public final class OngoingCallVideoCapturer { internal let impl: OngoingCallThreadLocalContextVideoCapturer + + private let isActivePromise = ValuePromise(true, ignoreRepeated: true) + public var isActive: Signal { + return self.isActivePromise.get() + } public init(keepLandscape: Bool = false, isCustom: Bool = false) { if isCustom { @@ -341,50 +346,89 @@ public final class OngoingCallVideoCapturer { } else { self.impl = OngoingCallThreadLocalContextVideoCapturer(deviceId: "", keepLandscape: keepLandscape) } + let isActivePromise = self.isActivePromise + self.impl.setOnIsActiveUpdated({ value in + isActivePromise.set(value) + }) } public func switchVideoInput(isFront: Bool) { self.impl.switchVideoInput(isFront ? "" : "back") } - public func makeOutgoingVideoView(completion: @escaping (OngoingCallContextPresentationCallVideoView?) -> Void) { - self.impl.makeOutgoingVideoView { view in - if let view = view { - completion(OngoingCallContextPresentationCallVideoView( - view: view, - setOnFirstFrameReceived: { [weak view] f in - view?.setOnFirstFrameReceived(f) + public func makeOutgoingVideoView(requestClone: Bool, completion: @escaping (OngoingCallContextPresentationCallVideoView?, OngoingCallContextPresentationCallVideoView?) -> Void) { + self.impl.makeOutgoingVideoView(requestClone, completion: { mainView, cloneView in + if let mainView = mainView { + let mainVideoView = OngoingCallContextPresentationCallVideoView( + view: mainView, + setOnFirstFrameReceived: { [weak mainView] f in + mainView?.setOnFirstFrameReceived(f) }, - getOrientation: { [weak view] in - if let view = view { - return OngoingCallVideoOrientation(view.orientation) + getOrientation: { [weak mainView] in + if let mainView = mainView { + return OngoingCallVideoOrientation(mainView.orientation) } else { return .rotation0 } }, - getAspect: { [weak view] in - if let view = view { - return view.aspect + getAspect: { [weak mainView] in + if let mainView = mainView { + return mainView.aspect } else { return 0.0 } }, - setOnOrientationUpdated: { [weak view] f in - view?.setOnOrientationUpdated { value, aspect in + setOnOrientationUpdated: { [weak mainView] f in + mainView?.setOnOrientationUpdated { value, aspect in f?(OngoingCallVideoOrientation(value), aspect) } }, - setOnIsMirroredUpdated: { [weak view] f in - view?.setOnIsMirroredUpdated(f) + setOnIsMirroredUpdated: { [weak mainView] f in + mainView?.setOnIsMirroredUpdated(f) }, - updateIsEnabled: { [weak view] value in - view?.updateIsEnabled(value) + updateIsEnabled: { [weak mainView] value in + mainView?.updateIsEnabled(value) } - )) + ) + var cloneVideoView: OngoingCallContextPresentationCallVideoView? + if let cloneView = cloneView { + cloneVideoView = OngoingCallContextPresentationCallVideoView( + view: cloneView, + setOnFirstFrameReceived: { [weak cloneView] f in + cloneView?.setOnFirstFrameReceived(f) + }, + getOrientation: { [weak cloneView] in + if let cloneView = cloneView { + return OngoingCallVideoOrientation(cloneView.orientation) + } else { + return .rotation0 + } + }, + getAspect: { [weak cloneView] in + if let cloneView = cloneView { + return cloneView.aspect + } else { + return 0.0 + } + }, + setOnOrientationUpdated: { [weak cloneView] f in + cloneView?.setOnOrientationUpdated { value, aspect in + f?(OngoingCallVideoOrientation(value), aspect) + } + }, + setOnIsMirroredUpdated: { [weak cloneView] f in + cloneView?.setOnIsMirroredUpdated(f) + }, + updateIsEnabled: { [weak cloneView] value in + cloneView?.updateIsEnabled(value) + } + ) + } + completion(mainVideoView, cloneVideoView) } else { - completion(nil) + completion(nil, nil) } - } + }) } public func setIsVideoEnabled(_ value: Bool) { @@ -395,8 +439,21 @@ public final class OngoingCallVideoCapturer { self.impl.submitSampleBuffer(sampleBuffer) } - public func injectPixelBuffer(_ pixelBuffer: CVPixelBuffer) { - self.impl.submitPixelBuffer(pixelBuffer) + public func injectPixelBuffer(_ pixelBuffer: CVPixelBuffer, rotation: CGImagePropertyOrientation) { + var videoRotation: OngoingCallVideoOrientation = .rotation0 + switch rotation { + case .up: + videoRotation = .rotation0 + case .left: + videoRotation = .rotation90 + case .right: + videoRotation = .rotation270 + case .down: + videoRotation = .rotation180 + default: + videoRotation = .rotation0 + } + self.impl.submitPixelBuffer(pixelBuffer, rotation: videoRotation.orientation) } } @@ -502,6 +559,21 @@ extension OngoingCallVideoOrientation { self = .rotation0 } } + + var orientation: OngoingCallVideoOrientationWebrtc { + switch self { + case .rotation0: + return .orientation0 + case .rotation90: + return .orientation90 + case .rotation180: + return .orientation180 + case .rotation270: + return .orientation270 + @unknown default: + return .orientation0 + } + } } public final class OngoingCallContextPresentationCallVideoView { diff --git a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h index 7e7266962f..a847501721 100644 --- a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h +++ b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h @@ -119,13 +119,14 @@ typedef NS_ENUM(int32_t, OngoingCallDataSavingWebrtc) { - (void)switchVideoInput:(NSString * _Nonnull)deviceId; - (void)setIsVideoEnabled:(bool)isVideoEnabled; -- (void)makeOutgoingVideoView:(void (^_Nonnull)(UIView * _Nullable))completion; +- (void)makeOutgoingVideoView:(bool)requestClone completion:(void (^_Nonnull)(UIView * _Nullable, UIView * _Nullable))completion; --(void)setOnFatalError:(dispatch_block_t _Nullable)onError; +- (void)setOnFatalError:(dispatch_block_t _Nullable)onError; +- (void)setOnIsActiveUpdated:(void (^_Nonnull)(bool))onIsActiveUpdated; #if TARGET_OS_IOS - (void)submitSampleBuffer:(CMSampleBufferRef _Nonnull)sampleBuffer; -- (void)submitPixelBuffer:(CVPixelBufferRef _Nonnull)pixelBuffer; +- (void)submitPixelBuffer:(CVPixelBufferRef _Nonnull)pixelBuffer rotation:(OngoingCallVideoOrientationWebrtc)rotation; #endif @end @@ -233,13 +234,25 @@ typedef NS_ENUM(int32_t, OngoingGroupCallRequestedVideoQuality) { OngoingGroupCallRequestedVideoQualityFull, }; +@interface OngoingGroupCallSsrcGroup : NSObject + +@property (nonatomic, strong, readonly) NSString * _Nonnull semantics; +@property (nonatomic, strong, readonly) NSArray * _Nonnull ssrcs; + +- (instancetype _Nonnull)initWithSemantics:(NSString * _Nonnull)semantics ssrcs:(NSArray * _Nonnull)ssrcs; + +@end + @interface OngoingGroupCallRequestedVideoChannel : NSObject @property (nonatomic, readonly) uint32_t audioSsrc; -@property (nonatomic, strong, readonly) NSString * _Nonnull videoInformation; -@property (nonatomic, readonly) OngoingGroupCallRequestedVideoQuality quality; +@property (nonatomic, strong, readonly) NSString * _Nonnull endpointId; +@property (nonatomic, strong, readonly) NSArray * _Nonnull ssrcGroups; -- (instancetype)initWithAudioSsrc:(uint32_t)audioSsrc videoInformation:(NSString * _Nonnull)videoInformation quality:(OngoingGroupCallRequestedVideoQuality)quality; +@property (nonatomic, readonly) OngoingGroupCallRequestedVideoQuality minQuality; +@property (nonatomic, readonly) OngoingGroupCallRequestedVideoQuality maxQuality; + +- (instancetype _Nonnull)initWithAudioSsrc:(uint32_t)audioSsrc endpointId:(NSString * _Nonnull)endpointId ssrcGroups:(NSArray * _Nonnull)ssrcGroups minQuality:(OngoingGroupCallRequestedVideoQuality)minQuality maxQuality:(OngoingGroupCallRequestedVideoQuality)maxQuality; @end diff --git a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm index 66a039ce68..e10c71da82 100644 --- a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm +++ b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm @@ -10,6 +10,7 @@ #include "StaticThreads.h" #import "VideoCaptureInterface.h" +#import "platform/darwin/VideoCameraCapturer.h" #ifndef WEBRTC_IOS #import "platform/darwin/VideoMetalViewMac.h" @@ -22,6 +23,7 @@ #import "platform/darwin/VideoMetalView.h" #import "platform/darwin/GLVideoView.h" #import "platform/darwin/VideoSampleBufferView.h" +#import "platform/darwin/VideoCaptureView.h" #import "platform/darwin/CustomExternalCapturer.h" #endif @@ -201,6 +203,7 @@ @end + @interface OngoingCallThreadLocalContextVideoCapturer () { bool _keepLandscape; std::shared_ptr> _croppingBuffer; @@ -265,16 +268,32 @@ tgcalls::VideoCaptureInterfaceObject *GetVideoCaptureAssumingSameThread(tgcalls: }); } -- (void)submitPixelBuffer:(CVPixelBufferRef _Nonnull)pixelBuffer { +- (void)submitPixelBuffer:(CVPixelBufferRef _Nonnull)pixelBuffer rotation:(OngoingCallVideoOrientationWebrtc)rotation { if (!pixelBuffer) { return; } + + RTCVideoRotation videoRotation = RTCVideoRotation_0; + switch (rotation) { + case OngoingCallVideoOrientation0: + videoRotation = RTCVideoRotation_0; + break; + case OngoingCallVideoOrientation90: + videoRotation = RTCVideoRotation_90; + break; + case OngoingCallVideoOrientation180: + videoRotation = RTCVideoRotation_180; + break; + case OngoingCallVideoOrientation270: + videoRotation = RTCVideoRotation_270; + break; + } - tgcalls::StaticThreads::getThreads()->getMediaThread()->PostTask(RTC_FROM_HERE, [interface = _interface, pixelBuffer = CFRetain(pixelBuffer), croppingBuffer = _croppingBuffer]() { + tgcalls::StaticThreads::getThreads()->getMediaThread()->PostTask(RTC_FROM_HERE, [interface = _interface, pixelBuffer = CFRetain(pixelBuffer), croppingBuffer = _croppingBuffer, videoRotation = videoRotation]() { auto capture = GetVideoCaptureAssumingSameThread(interface.get()); auto source = capture->source(); if (source) { - [CustomExternalCapturer passPixelBuffer:(CVPixelBufferRef)pixelBuffer toSource:source croppingBuffer:*croppingBuffer]; + [CustomExternalCapturer passPixelBuffer:(CVPixelBufferRef)pixelBuffer rotation:videoRotation toSource:source croppingBuffer:*croppingBuffer]; } CFRelease(pixelBuffer); }); @@ -305,31 +324,77 @@ tgcalls::VideoCaptureInterfaceObject *GetVideoCaptureAssumingSameThread(tgcalls: #endif } -- (void)makeOutgoingVideoView:(void (^_Nonnull)(UIView * _Nullable))completion { - std::shared_ptr interface = _interface; - dispatch_async(dispatch_get_main_queue(), ^{ - if ([VideoMetalView isSupported]) { - VideoMetalView *remoteRenderer = [[VideoMetalView alloc] initWithFrame:CGRectZero]; - remoteRenderer.videoContentMode = UIViewContentModeScaleAspectFill; - - std::shared_ptr> sink = [remoteRenderer getSink]; - interface->setOutput(sink); - - completion(remoteRenderer); - } else { - GLVideoView *remoteRenderer = [[GLVideoView alloc] initWithFrame:CGRectZero]; -#ifndef WEBRTC_IOS - remoteRenderer.videoContentMode = UIViewContentModeScaleAspectFill; -#endif - - std::shared_ptr> sink = [remoteRenderer getSink]; - interface->setOutput(sink); - - completion(remoteRenderer); +- (void)setOnIsActiveUpdated:(void (^)(bool))onIsActiveUpdated { + _interface->setOnIsActiveUpdated([onIsActiveUpdated](bool isActive) { + if (onIsActiveUpdated) { + onIsActiveUpdated(isActive); } }); } +- (void)makeOutgoingVideoView:(bool)requestClone completion:(void (^_Nonnull)(UIView * _Nullable, UIView * _Nullable))completion { + __weak OngoingCallThreadLocalContextVideoCapturer *weakSelf = self; + + void (^makeDefault)() = ^{ + dispatch_async(dispatch_get_main_queue(), ^{ + __strong OngoingCallThreadLocalContextVideoCapturer *strongSelf = weakSelf; + if (!strongSelf) { + return; + } + std::shared_ptr interface = strongSelf->_interface; + + if (false && requestClone) { + VideoSampleBufferView *remoteRenderer = [[VideoSampleBufferView alloc] initWithFrame:CGRectZero]; + remoteRenderer.videoContentMode = UIViewContentModeScaleAspectFill; + + std::shared_ptr> sink = [remoteRenderer getSink]; + interface->setOutput(sink); + + VideoSampleBufferView *cloneRenderer = nil; + if (requestClone) { + cloneRenderer = [[VideoSampleBufferView alloc] initWithFrame:CGRectZero]; + cloneRenderer.videoContentMode = UIViewContentModeScaleAspectFill; + [remoteRenderer setCloneTarget:cloneRenderer]; + } + + completion(remoteRenderer, cloneRenderer); + } else if ([VideoMetalView isSupported]) { + VideoMetalView *remoteRenderer = [[VideoMetalView alloc] initWithFrame:CGRectZero]; + remoteRenderer.videoContentMode = UIViewContentModeScaleAspectFill; + + VideoMetalView *cloneRenderer = nil; + if (requestClone) { + cloneRenderer = [[VideoMetalView alloc] initWithFrame:CGRectZero]; +#ifdef WEBRTC_IOS + cloneRenderer.videoContentMode = UIViewContentModeScaleToFill; +#else + cloneRenderer.videoContentMode = kCAGravityResizeAspectFill; +#endif + [remoteRenderer setClone:cloneRenderer]; + } + + std::shared_ptr> sink = [remoteRenderer getSink]; + + interface->setOutput(sink); + + completion(remoteRenderer, cloneRenderer); + } else { + GLVideoView *remoteRenderer = [[GLVideoView alloc] initWithFrame:CGRectZero]; + #ifndef WEBRTC_IOS + remoteRenderer.videoContentMode = UIViewContentModeScaleAspectFill; + #endif + + std::shared_ptr> sink = [remoteRenderer getSink]; + interface->setOutput(sink); + + completion(remoteRenderer, nil); + } + }); + }; + + makeDefault(); +} + @end @interface OngoingCallThreadLocalContextWebrtcTerminationResult : NSObject @@ -1041,9 +1106,13 @@ private: int minOutgoingVideoBitrateKbit = 500; + tgcalls::GroupConfig config; + config.need_log = false; + __weak GroupCallThreadLocalContext *weakSelf = self; _instance.reset(new tgcalls::GroupInstanceCustomImpl((tgcalls::GroupInstanceDescriptor){ .threads = tgcalls::StaticThreads::getThreads(), + .config = config, .networkStateUpdated = [weakSelf, queue, networkStateUpdated](tgcalls::GroupNetworkState networkState) { [queue dispatch:^{ __strong GroupCallThreadLocalContext *strongSelf = weakSelf; @@ -1243,18 +1312,43 @@ private: for (OngoingGroupCallRequestedVideoChannel *channel : requestedVideoChannels) { tgcalls::VideoChannelDescription description; description.audioSsrc = channel.audioSsrc; - description.videoInformation = channel.videoInformation.UTF8String ?: ""; - switch (channel.quality) { + description.endpointId = channel.endpointId.UTF8String ?: ""; + for (OngoingGroupCallSsrcGroup *group in channel.ssrcGroups) { + tgcalls::MediaSsrcGroup parsedGroup; + parsedGroup.semantics = group.semantics.UTF8String ?: ""; + for (NSNumber *ssrc in group.ssrcs) { + parsedGroup.ssrcs.push_back([ssrc unsignedIntValue]); + } + description.ssrcGroups.push_back(std::move(parsedGroup)); + } + switch (channel.minQuality) { case OngoingGroupCallRequestedVideoQualityThumbnail: { - description.quality = tgcalls::VideoChannelDescription::Quality::Thumbnail; + description.minQuality = tgcalls::VideoChannelDescription::Quality::Thumbnail; break; } case OngoingGroupCallRequestedVideoQualityMedium: { - description.quality = tgcalls::VideoChannelDescription::Quality::Medium; + description.minQuality = tgcalls::VideoChannelDescription::Quality::Medium; break; } case OngoingGroupCallRequestedVideoQualityFull: { - description.quality = tgcalls::VideoChannelDescription::Quality::Full; + description.minQuality = tgcalls::VideoChannelDescription::Quality::Full; + break; + } + default: { + break; + } + } + switch (channel.maxQuality) { + case OngoingGroupCallRequestedVideoQualityThumbnail: { + description.maxQuality = tgcalls::VideoChannelDescription::Quality::Thumbnail; + break; + } + case OngoingGroupCallRequestedVideoQualityMedium: { + description.maxQuality = tgcalls::VideoChannelDescription::Quality::Medium; + break; + } + case OngoingGroupCallRequestedVideoQualityFull: { + description.maxQuality = tgcalls::VideoChannelDescription::Quality::Full; break; } default: { @@ -1283,12 +1377,25 @@ private: __weak GroupCallThreadLocalContext *weakSelf = self; id queue = _queue; dispatch_async(dispatch_get_main_queue(), ^{ - if (false) { + BOOL useSampleBuffer = NO; +#ifdef WEBRTC_IOS + useSampleBuffer = YES; +#endif + if (useSampleBuffer) { VideoSampleBufferView *remoteRenderer = [[VideoSampleBufferView alloc] initWithFrame:CGRectZero]; remoteRenderer.videoContentMode = UIViewContentModeScaleAspectFill; std::shared_ptr> sink = [remoteRenderer getSink]; + VideoSampleBufferView *cloneRenderer = nil; + if (requestClone) { + cloneRenderer = [[VideoSampleBufferView alloc] initWithFrame:CGRectZero]; + cloneRenderer.videoContentMode = UIViewContentModeScaleAspectFill; +#ifdef WEBRTC_IOS + [remoteRenderer setCloneTarget:cloneRenderer]; +#endif + } + [queue dispatch:^{ __strong GroupCallThreadLocalContext *strongSelf = weakSelf; if (strongSelf && strongSelf->_instance) { @@ -1296,15 +1403,23 @@ private: } }]; - completion(remoteRenderer, nil); + completion(remoteRenderer, cloneRenderer); } else if ([VideoMetalView isSupported]) { VideoMetalView *remoteRenderer = [[VideoMetalView alloc] initWithFrame:CGRectZero]; +#ifdef WEBRTC_IOS remoteRenderer.videoContentMode = UIViewContentModeScaleToFill; +#else + remoteRenderer.videoContentMode = kCAGravityResizeAspectFill; +#endif VideoMetalView *cloneRenderer = nil; if (requestClone) { cloneRenderer = [[VideoMetalView alloc] initWithFrame:CGRectZero]; +#ifdef WEBRTC_IOS cloneRenderer.videoContentMode = UIViewContentModeScaleToFill; +#else + cloneRenderer.videoContentMode = kCAGravityResizeAspectFill; +#endif } std::shared_ptr> sink = [remoteRenderer getSink]; @@ -1372,14 +1487,29 @@ private: @end -@implementation OngoingGroupCallRequestedVideoChannel +@implementation OngoingGroupCallSsrcGroup -- (instancetype)initWithAudioSsrc:(uint32_t)audioSsrc videoInformation:(NSString * _Nonnull)videoInformation quality:(OngoingGroupCallRequestedVideoQuality)quality { +- (instancetype)initWithSemantics:(NSString * _Nonnull)semantics ssrcs:(NSArray * _Nonnull)ssrcs { self = [super init]; if (self != nil) { - _audioSsrc = audioSsrc; - _videoInformation = videoInformation; - _quality = quality; + _semantics = semantics; + _ssrcs = ssrcs; + } + return self; +} + +@end + +@implementation OngoingGroupCallRequestedVideoChannel + +- (instancetype)initWithAudioSsrc:(uint32_t)audioSsrc endpointId:(NSString * _Nonnull)endpointId ssrcGroups:(NSArray * _Nonnull)ssrcGroups minQuality:(OngoingGroupCallRequestedVideoQuality)minQuality maxQuality:(OngoingGroupCallRequestedVideoQuality)maxQuality { + self = [super init]; + if (self != nil) { + _audioSsrc = audioSsrc; + _endpointId = endpointId; + _ssrcGroups = ssrcGroups; + _minQuality = minQuality; + _maxQuality = maxQuality; } return self; } diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index c918c50087..4de3323f05 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit c918c50087466adf5fdca47f2f62de58eccf514b +Subproject commit 4de3323f05c77a4e3d2ae414c002ab419aba3bf5 diff --git a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift index 1d90fe60de..eca7b1c5a6 100644 --- a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift +++ b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift @@ -493,7 +493,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { displayUndo = false self.originalRemainingSeconds = 3 case let .invitedToVoiceChat(context, peer, text): - self.avatarNode = AvatarNode(font: avatarPlaceholderFont(size: 16.0)) + self.avatarNode = AvatarNode(font: avatarPlaceholderFont(size: 15.0)) self.iconNode = nil self.iconCheckNode = nil self.animationNode = nil @@ -935,7 +935,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { let undoButtonFrame = CGRect(origin: CGPoint(x: layout.size.width - layout.safeInsets.left - layout.safeInsets.right - rightInset - buttonTextSize.width - 8.0 - margin * 2.0, y: 0.0), size: CGSize(width: layout.safeInsets.right + rightInset + buttonTextSize.width + 8.0 + margin, height: contentHeight)) self.undoButtonNode.frame = undoButtonFrame - self.buttonNode.frame = CGRect(origin: CGPoint(x: layout.safeInsets.left, y: 0.0), size: CGSize(width: undoButtonFrame.minX - layout.safeInsets.left, height: contentHeight)) + self.buttonNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: undoButtonFrame.minX, height: contentHeight)) var textContentHeight = textSize.height var textOffset: CGFloat = 0.0 diff --git a/submodules/WallpaperBackgroundNode/Sources/WallpaperBackgroundNode.swift b/submodules/WallpaperBackgroundNode/Sources/WallpaperBackgroundNode.swift index 70ad92ed2b..ee5f9223e4 100644 --- a/submodules/WallpaperBackgroundNode/Sources/WallpaperBackgroundNode.swift +++ b/submodules/WallpaperBackgroundNode/Sources/WallpaperBackgroundNode.swift @@ -18,6 +18,7 @@ public final class WallpaperBackgroundNode: ASDisplayNode { public enum BubbleType { case incoming case outgoing + case free } private let bubbleType: BubbleType @@ -30,6 +31,20 @@ public final class WallpaperBackgroundNode: ASDisplayNode { private var currentLayout: (rect: CGRect, containerSize: CGSize)? + public override var frame: CGRect { + didSet { + if oldValue.size != self.bounds.size { + self.contentNode.frame = self.bounds + if let cleanWallpaperNode = self.cleanWallpaperNode { + cleanWallpaperNode.frame = self.bounds + } + if let gradientWallpaperNode = self.gradientWallpaperNode { + gradientWallpaperNode.frame = self.bounds + } + } + } + } + init(backgroundNode: WallpaperBackgroundNode, bubbleType: BubbleType) { self.backgroundNode = backgroundNode self.bubbleType = bubbleType @@ -75,6 +90,10 @@ public final class WallpaperBackgroundNode: ASDisplayNode { self.contentNode.backgroundColor = nil } needsCleanBackground = bubbleTheme.chat.message.outgoing.bubble.withWallpaper.fill.alpha <= 0.99 || bubbleTheme.chat.message.outgoing.bubble.withWallpaper.gradientFill.alpha <= 0.99 + case .free: + self.contentNode.image = nil + self.contentNode.backgroundColor = nil + needsCleanBackground = true } var hasComplexGradient = false @@ -105,7 +124,7 @@ public final class WallpaperBackgroundNode: ASDisplayNode { if self.cleanWallpaperNode == nil { let cleanWallpaperNode = ASImageNode() self.cleanWallpaperNode = cleanWallpaperNode - cleanWallpaperNode.frame = self.contentNode.frame + cleanWallpaperNode.frame = self.bounds self.insertSubnode(cleanWallpaperNode, at: 0) } self.cleanWallpaperNode?.contents = backgroundNode.contentNode.contents @@ -120,7 +139,7 @@ public final class WallpaperBackgroundNode: ASDisplayNode { if needsGradientBackground, let gradientBackgroundNode = backgroundNode.gradientBackgroundNode { if self.gradientWallpaperNode == nil { let gradientWallpaperNode = GradientBackgroundNode.CloneNode(parentNode: gradientBackgroundNode) - gradientWallpaperNode.frame = self.contentNode.frame + gradientWallpaperNode.frame = self.bounds self.gradientWallpaperNode = gradientWallpaperNode self.insertSubnode(gradientWallpaperNode, at: 0) } @@ -146,33 +165,47 @@ public final class WallpaperBackgroundNode: ASDisplayNode { public func update(rect: CGRect, within containerSize: CGSize) { self.currentLayout = (rect, containerSize) - self.contentNode.frame = CGRect(origin: CGPoint(x: -rect.minX, y: -rect.minY), size: containerSize) + let shiftedContentsRect = CGRect(origin: CGPoint(x: rect.minX / containerSize.width, y: rect.minY / containerSize.height), size: CGSize(width: rect.width / containerSize.width, height: rect.height / containerSize.height)) + + self.contentNode.layer.contentsRect = shiftedContentsRect if let cleanWallpaperNode = self.cleanWallpaperNode { - cleanWallpaperNode.frame = CGRect(origin: CGPoint(x: -rect.minX, y: -rect.minY), size: containerSize) + cleanWallpaperNode.layer.contentsRect = shiftedContentsRect } if let gradientWallpaperNode = self.gradientWallpaperNode { - gradientWallpaperNode.frame = CGRect(origin: CGPoint(x: -rect.minX, y: -rect.minY), size: containerSize) + gradientWallpaperNode.layer.contentsRect = shiftedContentsRect } } public func offset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) { + guard let (_, containerSize) = self.currentLayout else { + return + } let transition: ContainedViewLayoutTransition = .animated(duration: duration, curve: animationCurve) - transition.animatePositionAdditive(node: self.contentNode, offset: CGPoint(x: -value.x, y: -value.y)) + + let scaledOffset = CGPoint(x: value.x / containerSize.width, y: value.y / containerSize.height) + transition.animateContentsRectPositionAdditive(layer: self.contentNode.layer, offset: scaledOffset) + if let cleanWallpaperNode = self.cleanWallpaperNode { - transition.animatePositionAdditive(node: cleanWallpaperNode, offset: CGPoint(x: -value.x, y: -value.y)) + transition.animateContentsRectPositionAdditive(layer: cleanWallpaperNode.layer, offset: scaledOffset) } if let gradientWallpaperNode = self.gradientWallpaperNode { - transition.animatePositionAdditive(node: gradientWallpaperNode, offset: CGPoint(x: -value.x, y: -value.y)) + transition.animateContentsRectPositionAdditive(layer: gradientWallpaperNode.layer, offset: scaledOffset) } } public func offsetSpring(value: CGFloat, duration: Double, damping: CGFloat) { - self.contentNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: 0.0, y: value)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: duration, initialVelocity: 0.0, damping: damping, additive: true) + guard let (_, containerSize) = self.currentLayout else { + return + } + + let scaledOffset = CGPoint(x: 0.0, y: -value / containerSize.height) + + self.contentNode.layer.animateSpring(from: NSValue(cgPoint: scaledOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "contentsRect.position", duration: duration, initialVelocity: 0.0, damping: damping, additive: true) if let cleanWallpaperNode = self.cleanWallpaperNode { - cleanWallpaperNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: 0.0, y: value)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: duration, initialVelocity: 0.0, damping: damping, additive: true) + cleanWallpaperNode.layer.animateSpring(from: NSValue(cgPoint: scaledOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "contentsRect.position", duration: duration, initialVelocity: 0.0, damping: damping, additive: true) } if let gradientWallpaperNode = self.gradientWallpaperNode { - gradientWallpaperNode.layer.animateSpring(from: NSValue(cgPoint: CGPoint(x: 0.0, y: value)), to: NSValue(cgPoint: CGPoint()), keyPath: "position", duration: duration, initialVelocity: 0.0, damping: damping, additive: true) + gradientWallpaperNode.layer.animateSpring(from: NSValue(cgPoint: scaledOffset), to: NSValue(cgPoint: CGPoint()), keyPath: "contentsRect.position", duration: duration, initialVelocity: 0.0, damping: damping, additive: true) } } } @@ -192,6 +225,7 @@ public final class WallpaperBackgroundNode: ASDisplayNode { private var gradientBackgroundNode: GradientBackgroundNode? private let patternImageNode: TransformImageNode private var invertPattern: Bool = false + private var patternIsLight: Bool = false private var validLayout: CGSize? private var wallpaper: TelegramWallpaper? @@ -256,6 +290,17 @@ public final class WallpaperBackgroundNode: ASDisplayNode { self.contentNode.transform = CATransform3DIdentity } } + + private struct PatternKey: Equatable { + var mediaId: MediaId + var isLight: Bool + } + private static var cachedSharedPattern: (PatternKey, UIImage)? + + private let _isReady = ValuePromise(false, ignoreRepeated: true) + public var isReady: Signal { + return self._isReady.get() + } public init(context: AccountContext, useSharedAnimationPhase: Bool = false) { self.context = context @@ -366,20 +411,26 @@ public final class WallpaperBackgroundNode: ASDisplayNode { } switch wallpaper { - case let .file(id, _, _, _, isPattern, _, _, file, settings) where isPattern: + case let .file(_, _, _, _, isPattern, _, _, file, settings) where isPattern: var updated = true + let isLight = UIColor.average(of: settings.colors.map(UIColor.init(rgb:))).hsb.b > 0.3 if let previousWallpaper = previousWallpaper { switch previousWallpaper { - case let .file(previousId, _, _, _, previousIsPattern, _, _, previousFile, _): - if id == previousId && isPattern == previousIsPattern && file.id == previousFile.id { + case let .file(_, _, _, _, _, _, _, previousFile, _): + if file.id == previousFile.id { updated = false } default: break } } + self.patternIsLight = isLight if updated { + /*let cacheKey = PatternKey(mediaId: file.id ?? MediaId(namespace: 0, id: 0), isLight: isLight) + if let (currentKey, currentImage) = WallpaperBackgroundNode.cachedSharedPattern, currentKey == cacheKey { + }*/ + func reference(for resource: MediaResource, media: Media, message: Message?) -> MediaResourceReference { if let message = message { return .media(media: .message(message: MessageReference(message), media: media), resource: resource) @@ -395,6 +446,12 @@ public final class WallpaperBackgroundNode: ASDisplayNode { convertedRepresentations.append(ImageRepresentationWithReference(representation: .init(dimensions: dimensions, resource: file.resource, progressiveSizes: [], immediateThumbnailData: nil), reference: reference(for: file.resource, media: file, message: nil))) let signal = patternWallpaperImage(account: self.context.account, accountManager: self.context.sharedContext.accountManager, representations: convertedRepresentations, mode: .screen, autoFetchFullSize: true) + self.patternImageNode.imageUpdated = { [weak self] _ in + guard let strongSelf = self else { + return + } + strongSelf._isReady.set(true) + } self.patternImageNode.setSignal(signal) } let intensity = CGFloat(settings.intensity ?? 50) / 100.0 @@ -422,6 +479,7 @@ public final class WallpaperBackgroundNode: ASDisplayNode { self.backgroundColor = nil self.gradientBackgroundNode?.contentView.alpha = 1.0 self.contentNode.alpha = 1.0 + self._isReady.set(true) } self.updateBubbles() @@ -450,10 +508,14 @@ public final class WallpaperBackgroundNode: ASDisplayNode { patternColor = .clear patternBackgroundColor = .clear } else { - patternColor = .black + if self.patternIsLight { + patternColor = .black + } else { + patternColor = .white + } patternBackgroundColor = .clear } - let applyImage = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: size, boundingSize: size, intrinsicInsets: UIEdgeInsets(), custom: PatternWallpaperArguments(colors: [patternBackgroundColor], rotation: nil, customPatternColor: patternColor, preview: false))) + let applyImage = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: size, boundingSize: size, intrinsicInsets: UIEdgeInsets(), custom: PatternWallpaperArguments(colors: [patternBackgroundColor], rotation: nil, customPatternColor: patternColor, preview: false), scale: min(2.0, UIScreenScale))) applyImage() transition.updateFrame(node: self.patternImageNode, frame: CGRect(origin: CGPoint(), size: size)) @@ -462,8 +524,8 @@ public final class WallpaperBackgroundNode: ASDisplayNode { } } - public func animateEvent(transition: ContainedViewLayoutTransition) { - self.gradientBackgroundNode?.animateEvent(transition: transition) + public func animateEvent(transition: ContainedViewLayoutTransition, extendAnimation: Bool = false) { + self.gradientBackgroundNode?.animateEvent(transition: transition, extendAnimation: extendAnimation) } public func updateBubbleTheme(bubbleTheme: PresentationTheme, bubbleCorners: PresentationChatBubbleCorners) { @@ -510,6 +572,8 @@ public final class WallpaperBackgroundNode: ASDisplayNode { if bubbleTheme.chat.message.outgoing.bubble.withWallpaper.fill.alpha <= 0.99 { return !hasPlainWallpaper } + case .free: + return true } return false diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index 028ab8b72d..df34699aca 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -434,6 +434,9 @@ public func patternWallpaperImageInternal(thumbnailData: Data?, fullSizeData: Da return { arguments in var scale = scale + if scale.isZero { + scale = arguments.scale ?? UIScreenScale + } let drawingRect = arguments.drawingRect @@ -513,7 +516,10 @@ public func patternWallpaperImageInternal(thumbnailData: Data?, fullSizeData: Da c.interpolationQuality = customArguments.preview ? .low : .medium c.clip(to: fittedRect, mask: image) - if colors.count >= 3 && customArguments.customPatternColor == nil { + if let customPatternColor = customArguments.customPatternColor { + c.setFillColor(customPatternColor.cgColor) + c.fill(CGRect(origin: CGPoint(), size: arguments.drawingRect.size)) + } else if colors.count >= 3 && customArguments.customPatternColor == nil { c.setFillColor(UIColor(white: 0.0, alpha: 0.5).cgColor) c.fill(CGRect(origin: CGPoint(), size: arguments.drawingRect.size)) } else if colors.count == 1 { @@ -540,6 +546,8 @@ public func patternWallpaperImageInternal(thumbnailData: Data?, fullSizeData: Da }) if let customPatternColor = customArguments.customPatternColor, customPatternColor.alpha < 1.0 { c.setBlendMode(.normal) + } else if customArguments.colors.count == 1 && customArguments.colors[0].alpha.isZero { + c.setBlendMode(.normal) } else { c.setBlendMode(.softLight) } @@ -1468,3 +1476,100 @@ public func themeIconImage(account: Account, accountManager: AccountManager, the } } } + +public func wallpaperThumbnail(account: Account, accountManager: AccountManager, fileReference: FileMediaReference, wallpaper: TelegramWallpaper, synchronousLoad: Bool) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { + switch wallpaper { + case let .file(_, _, _, _, _, _, _, file, settings): + guard let thumbnail = smallestImageRepresentation(file.previewRepresentations) else { + return .single({ _ in nil }) + } + let signal: Signal = Signal { subscriber in + let data = account.postbox.mediaBox.resourceData(thumbnail.resource).start(next: { data in + if data.complete { + if let fileData = try? Data(contentsOf: URL(fileURLWithPath: data.path)) { + subscriber.putNext(fileData) + } + } + }) + let fetch = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnail.resource)).start() + + return ActionDisposable { + data.dispose() + fetch.dispose() + } + } + return signal + |> map { thumbnailData in + return { arguments in + let drawingRect = arguments.drawingRect + + var thumbnailImage: CGImage? + if let thumbnailData = thumbnailData { + if let imageSource = CGImageSourceCreateWithData(thumbnailData as CFData, nil), let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) { + thumbnailImage = image + } + } + + let context = DrawingContext(size: arguments.boundingSize, clear: true) + + context.withFlippedContext { c in + let colors = settings.colors.map(UIColor.init(rgb:)) + + if colors.count == 1 { + c.setFillColor(colors[0].cgColor) + c.fill(arguments.drawingRect) + } else if settings.colors.count >= 3 { + let image = GradientBackgroundNode.generatePreview(size: CGSize(width: 60.0, height: 60.0), colors: colors) + c.translateBy(x: drawingRect.midX, y: drawingRect.midY) + c.scaleBy(x: 1.0, y: -1.0) + c.translateBy(x: -drawingRect.midX, y: -drawingRect.midY) + c.draw(image.cgImage!, in: drawingRect) + c.translateBy(x: drawingRect.midX, y: drawingRect.midY) + c.scaleBy(x: 1.0, y: -1.0) + c.translateBy(x: -drawingRect.midX, y: -drawingRect.midY) + } else if settings.colors.count >= 2 { + let gradientColors = settings.colors.map { UIColor(rgb: $0).cgColor } as CFArray + let delta: CGFloat = 1.0 / (CGFloat(settings.colors.count) - 1.0) + + var locations: [CGFloat] = [] + for i in 0 ..< settings.colors.count { + locations.append(delta * CGFloat(i)) + } + let colorSpace = CGColorSpaceCreateDeviceRGB() + let gradient = CGGradient(colorsSpace: colorSpace, colors: gradientColors, locations: &locations)! + + c.saveGState() + c.translateBy(x: arguments.drawingSize.width / 2.0, y: arguments.drawingSize.height / 2.0) + c.rotate(by: CGFloat(settings.rotation ?? 0) * CGFloat.pi / -180.0) + c.translateBy(x: -arguments.drawingSize.width / 2.0, y: -arguments.drawingSize.height / 2.0) + + c.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: 0.0, y: arguments.drawingSize.height), options: [.drawsBeforeStartLocation, .drawsAfterEndLocation]) + c.restoreGState() + } + + if let thumbnailImage = thumbnailImage { + let fittedSize = CGSize(width: thumbnailImage.width, height: thumbnailImage.height).aspectFilled(arguments.boundingSize) + let fittedRect = CGRect(origin: CGPoint(x: (arguments.boundingSize.width - fittedSize.width) / 2.0, y: (arguments.boundingSize.height - fittedSize.height) / 2.0), size: fittedSize) + + c.clip(to: fittedRect, mask: thumbnailImage) + + c.setBlendMode(.softLight) + + if UIColor.average(of: colors).hsb.b > 0.3 { + c.setFillColor(UIColor(white: 0.0, alpha: 0.6).cgColor) + } else { + c.setFillColor(UIColor(white: 1.0, alpha: 0.6).cgColor) + } + c.fill(fittedRect) + } + } + + addCorners(context, arguments: arguments) + + return context + } + } + default: + return .single({ _ in nil }) + } +} diff --git a/third-party/libvpx/BUILD b/third-party/libvpx/BUILD index 9ca8530ae4..ed92e4eb38 100644 --- a/third-party/libvpx/BUILD +++ b/third-party/libvpx/BUILD @@ -75,7 +75,7 @@ genrule( mkdir -p "$$BUILD_DIR/Public/libvpx" - sh $$BUILD_DIR/build-libvpx-bazel.sh $$BUILD_ARCH "$$BUILD_DIR/libvpx" "$$BUILD_DIR" + PATH="$$PATH:$$ABS_YASM_DIR" sh $$BUILD_DIR/build-libvpx-bazel.sh $$BUILD_ARCH "$$BUILD_DIR/libvpx" "$$BUILD_DIR" """ + "\n".join([ "cp -f \"$$BUILD_DIR/VPX.framework/Headers/vpx/{}\" \"$(location Public/vpx/{})\"".format(header, header) for header in headers diff --git a/third-party/libvpx/build-libvpx-bazel.sh b/third-party/libvpx/build-libvpx-bazel.sh index a2ac3011d2..aec6d40fd2 100755 --- a/third-party/libvpx/build-libvpx-bazel.sh +++ b/third-party/libvpx/build-libvpx-bazel.sh @@ -16,8 +16,10 @@ devnull='> /dev/null 2>&1' BUILD_ROOT="_iosbuild" CONFIGURE_ARGS="--disable-docs --disable-examples - --disable-libyuv - --disable-unit-tests" + --enable-libyuv + --disable-unit-tests + --enable-realtime-only + --enable-multi-res-encoding" DIST_DIR="_dist" FRAMEWORK_DIR="VPX.framework" FRAMEWORK_LIB="VPX.framework/VPX" diff --git a/third-party/webrtc/BUILD b/third-party/webrtc/BUILD index 1cbc0d6c87..b86189f7c7 100644 --- a/third-party/webrtc/BUILD +++ b/third-party/webrtc/BUILD @@ -9,7 +9,8 @@ config_setting( ) optimization_flags = select({ - ":debug_build": ["-Os", "-DNDEBUG"], + ":debug_build": ["-O2", "-DNDEBUG"], + #":debug_build": [], "//conditions:default": ["-DNDEBUG"], }) @@ -59,7 +60,6 @@ absl_sources = [ "dependencies/third_party/abseil-cpp/" + x for x in [ "absl/debugging/internal/examine_stack.cc", "absl/debugging/internal/stack_consumption.cc", "absl/debugging/internal/vdso_support.cc", - "absl/debugging/leak_check.cc", "absl/debugging/leak_check_disable.cc", "absl/debugging/stacktrace.cc", "absl/debugging/symbolize.cc", @@ -123,7 +123,6 @@ absl_sources = [ "dependencies/third_party/abseil-cpp/" + x for x in [ "absl/synchronization/internal/graphcycles.cc", "absl/synchronization/internal/per_thread_sem.cc", "absl/synchronization/internal/waiter.cc", - "absl/synchronization/mutex.cc", "absl/synchronization/notification.cc", "absl/time/civil_time.cc", "absl/time/clock.cc", @@ -171,7 +170,6 @@ absl_sources = [ "dependencies/third_party/abseil-cpp/" + x for x in [ "absl/time/civil_time.h", "absl/synchronization/blocking_counter.h", "absl/synchronization/barrier.h", - "absl/synchronization/mutex.h", "absl/base/internal/low_level_alloc.h", "absl/strings/str_replace.h", "absl/strings/substitute.h", @@ -209,7 +207,6 @@ absl_sources = [ "dependencies/third_party/abseil-cpp/" + x for x in [ "absl/flags/internal/usage.h", "absl/flags/internal/registry.h", "absl/debugging/internal/vdso_support.h", - "absl/debugging/leak_check.h", "absl/debugging/stacktrace.h", "absl/flags/flag.h", "absl/debugging/internal/elf_mem_image.h", @@ -351,7 +348,6 @@ webrtc_sources = [ "rtc_base/task_queue.h", "rtc_base/system/file_wrapper.h", "rtc_base/task_utils/repeating_task.h", - "rtc_base/task_queue_stdlib.h", "rtc_base/synchronization/yield_policy.h", "rtc_base/string_utils.h", "rtc_base/strings/audio_format_to_string.h", @@ -431,7 +427,7 @@ webrtc_sources = [ "rtc_base/third_party/sigslot/sigslot.h", "rtc_base/timestamp_aligner.h", "rtc_base/ssl_stream_adapter.h", - "rtc_base/task_queue_libevent.h", + "rtc_base/task_queue_gcd.h", "rtc_base/string_encode.h", "rtc_base/ssl_fingerprint.h", "rtc_base/rtc_certificate_generator.h", @@ -548,8 +544,7 @@ webrtc_sources = [ "rtc_base/synchronization/yield.cc", "rtc_base/system/file_wrapper.cc", "rtc_base/task_queue.cc", - "rtc_base/task_queue_libevent.cc", - "rtc_base/task_queue_stdlib.cc", + "rtc_base/task_queue_gcd.cc", "rtc_base/task_utils/repeating_task.cc", "rtc_base/third_party/base64/base64.cc", "rtc_base/third_party/sigslot/sigslot.cc", @@ -626,7 +621,7 @@ webrtc_sources = [ "api/rtp_transceiver_interface.cc", "api/sctp_transport_interface.cc", "api/stats_types.cc", - "api/task_queue/default_task_queue_factory_libevent.cc", + "api/task_queue/default_task_queue_factory_gcd.cc", "api/task_queue/task_queue_base.cc", "api/transport/bitrate_settings.cc", "api/transport/field_trial_based_config.cc", @@ -1497,7 +1492,6 @@ webrtc_sources = [ "logging/rtc_event_log/fake_rtc_event_log.cc", "logging/rtc_event_log/fake_rtc_event_log_factory.cc", "logging/rtc_event_log/ice_logger.cc", - "logging/rtc_event_log/rtc_event_log_impl.cc", "logging/rtc_event_log/rtc_stream_config.cc", "video/adaptation/encode_usage_resource.cc", "video/adaptation/overuse_frame_detector.cc", @@ -2725,21 +2719,22 @@ webrtc_sources = [ "modules/rtp_rtcp/source/rtp_rtcp_interface.h", "rtc_base/boringssl_identity.h", "rtc_base/boringssl_identity.cc", - "rtc_base/deprecated/recursive_critical_section.h", - "rtc_base/deprecated/recursive_critical_section.cc", "rtc_base/network_monitor_factory.h", "rtc_base/network_monitor_factory.cc", "rtc_base/openssl_key_pair.h", "rtc_base/openssl_key_pair.cc", "rtc_base/synchronization/mutex.h", "rtc_base/synchronization/mutex.cc", + "rtc_base/synchronization/mutex_critical_section.h", + "rtc_base/synchronization/mutex_pthread.h", + "rtc_base/deprecated/recursive_critical_section.h", + "rtc_base/deprecated/recursive_critical_section.cc", "rtc_base/task_utils/pending_task_safety_flag.h", "rtc_base/task_utils/pending_task_safety_flag.cc", "api/video/video_frame_metadata.h", "api/video/video_frame_metadata.cc", "modules/rtp_rtcp/source/rtp_rtcp_impl2.h", "modules/rtp_rtcp/source/rtp_rtcp_impl2.cc", - "rtc_base/synchronization/mutex_pthread.h", "api/set_local_description_observer_interface.h", "common_video/frame_counts.h", "rtc_base/system/no_unique_address.h", @@ -2892,6 +2887,8 @@ webrtc_sources = [ "modules/audio_processing/capture_levels_adjuster/capture_levels_adjuster.cc", "modules/audio_processing/capture_levels_adjuster/audio_samples_scaler.h", "modules/audio_processing/capture_levels_adjuster/audio_samples_scaler.cc", + "rtc_base/system/gcd_helpers.h", + "rtc_base/system/gcd_helpers.m", ] ios_objc_sources = [ @@ -3221,6 +3218,17 @@ common_flags = [ "-DHAVE_WEBRTC_VIDEO", "-DRTC_ENABLE_VP9", "-DHAVE_SCTP", + "-DWEBRTC_NS_FLOAT", + "-DRTC_DISABLE_TRACE_EVENTS", + "-DWEBRTC_OPUS_SUPPORT_120MS_PTIME=1", + "-DWEBRTC_APM_DEBUG_DUMP=0", + "-DBWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0", + "-DABSL_ALLOCATOR_NOTHROW=1", + "-DDYNAMIC_ANNOTATIONS_ENABLED=0", + "-DNS_BLOCK_ASSERTIONS=1", + "-DWEBRTC_ENABLE_PROTOBUF=0", + "-DWEBRTC_ENABLE_AVX2", + "-DWEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0", ] arm_specific_flags = [ @@ -3232,6 +3240,7 @@ arm_specific_flags = [ arm64_specific_flags = [ "-DWEBRTC_ARCH_ARM64", "-DWEBRTC_HAS_NEON", + "-mfpu=neon", ] x86_64_specific_flags = [ @@ -3339,6 +3348,7 @@ cc_library( "-D__Userspace_os_Darwin", "-DPACKAGE_VERSION=''", "-DHAVE_SCTP", + "-DNON_WINDOWS_DEFINE", ] + arch_specific_cflags + optimization_flags, visibility = ["//visibility:public"], ) @@ -3425,49 +3435,6 @@ cc_library( visibility = ["//visibility:public"], ) -cc_library( - name = "libevent", - srcs = [ "dependencies/base/third_party/libevent/" + path for path in [ - "buffer.c", - "evbuffer.c", - "evdns.c", - "evdns.h", - "event-config.h", - "event-internal.h", - "event.c", - "event.h", - "event_tagging.c", - "evhttp.h", - "evrpc-internal.h", - "evrpc.c", - "evrpc.h", - "evsignal.h", - "evutil.c", - "evutil.h", - "http-internal.h", - "http.c", - "log.c", - "log.h", - "min_heap.h", - "poll.c", - "select.c", - "signal.c", - "strlcpy-internal.h", - "strlcpy.c", - "kqueue.c", - "mac/config.h", - "mac/event-config.h", - ]], - copts = [ - "-DHAVE_CONFIG_H", - "-Ithird-party/webrtc/dependencies/base/third_party/libevent/mac", - "-Ithird-party/webrtc/dependencies/base/third_party/libevent", - "-Ithird-party/webrtc/dependencies", - "-Ithird-party/webrtc/" + webrtc_source_dir, - ] + arch_specific_cflags + optimization_flags, - visibility = ["//visibility:public"], -) - cc_library( name = "libyuv", srcs = [ "dependencies/third_party/libyuv/" + path for path in [ @@ -3542,6 +3509,7 @@ cc_library( copts = [ "-ffp-contract=fast", "-Ithird-party/webrtc/dependencies/third_party/libyuv/include", + "-DLIBYUV_NEON", ] + arch_specific_cflags + optimization_flags, visibility = ["//visibility:public"], ) @@ -3586,6 +3554,9 @@ objc_library( "-D__Userspace_os_Darwin", "-DPACKAGE_VERSION='\"\"'", "-DHAVE_SCTP", + "-DNO_MAIN_THREAD_WRAPPING", + "-DRTC_DISABLE_TRACE_EVENTS", + "-DRTC_DISABLE_METRICS", ] + arch_specific_cflags + optimization_flags, deps = [ "//third-party/boringssl:crypto", @@ -3593,7 +3564,6 @@ objc_library( "//third-party/opus:opus", ":usrsctp", ":libsrtp", - ":libevent", ":libyuv", "//third-party/libvpx:vpx", ], diff --git a/third-party/webrtc/webrtc b/third-party/webrtc/webrtc index 172d5b024b..469686eb88 160000 --- a/third-party/webrtc/webrtc +++ b/third-party/webrtc/webrtc @@ -1 +1 @@ -Subproject commit 172d5b024b5674d9ebe381ea245071141082f2aa +Subproject commit 469686eb88520ff4c37cab24b55ad496cbc0b5d4