diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 8559364046..afa80d1900 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -8910,3 +8910,12 @@ Sorry for the inconvenience."; "Appearance.VoiceOver.Theme" = "%@ Theme"; "ChatList.EmptyChatListWithArchive" = "All of your chats are archived."; + +"Conversation.AudioRateTooltip15X" = "Audio will play at 1.5X speed."; +"Conversation.AudioRateOptionsTooltip" = "Long tap for more speed values."; + +"ImportStickerPack.EmojiCount_1" = "%@ Emoji"; +"ImportStickerPack.EmojiCount_any" = "%@ Emojis"; + +"ImportStickerPack.ImportingEmojis" = "Importing Emojis"; +"ImportStickerPack.CreateNewEmojiPack" = "Create a New Emoji Pack"; diff --git a/submodules/AttachmentUI/Sources/AttachmentPanel.swift b/submodules/AttachmentUI/Sources/AttachmentPanel.swift index ac8c8bf667..15dfef93e9 100644 --- a/submodules/AttachmentUI/Sources/AttachmentPanel.swift +++ b/submodules/AttachmentUI/Sources/AttachmentPanel.swift @@ -371,12 +371,12 @@ private final class LoadingProgressNode: ASDisplayNode { } public struct AttachmentMainButtonState { - let text: String? - let backgroundColor: UIColor - let textColor: UIColor - let isVisible: Bool - let isLoading: Bool - let isEnabled: Bool + public let text: String? + public let backgroundColor: UIColor + public let textColor: UIColor + public let isVisible: Bool + public let isLoading: Bool + public let isEnabled: Bool public init( text: String?, diff --git a/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift b/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift index d495ab1dbf..f21543054f 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift @@ -2713,7 +2713,7 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { strongSelf.context.sharedContext.mediaManager.setPlaylist(nil, type: type, control: SharedMediaPlayerControlAction.playback(.pause)) } } - mediaAccessoryPanel.setRate = { [weak self] rate in + mediaAccessoryPanel.setRate = { [weak self] rate, fromMenu in guard let strongSelf = self else { return } @@ -2742,21 +2742,28 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { }) let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } - let slowdown: Bool? + let text: String? + let rate: CGFloat? if baseRate == .x1 { - slowdown = true + text = presentationData.strings.Conversation_AudioRateTooltipNormal + rate = 1.0 + } else if baseRate == .x1_5 { + text = presentationData.strings.Conversation_AudioRateTooltip15X + rate = 1.5 } else if baseRate == .x2 { - slowdown = false + text = presentationData.strings.Conversation_AudioRateTooltipSpeedUp + rate = 2.0 } else { - slowdown = nil + text = nil + rate = nil } - if let slowdown = slowdown { + if let rate, let text, !fromMenu { controller.present( UndoOverlayController( presentationData: presentationData, content: .audioRate( - slowdown: slowdown, - text: slowdown ? presentationData.strings.Conversation_AudioRateTooltipNormal : presentationData.strings.Conversation_AudioRateTooltipSpeedUp + rate: rate, + text: text ), elevatedLayout: false, animateInAsReplacement: hasTooltip, diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index 9166b6a686..6be7db083f 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -1357,7 +1357,9 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } strongSelf.updateVideoVisibility() } else { - let _ = context.engine.peers.fetchAndUpdateCachedPeerData(peerId: peer.id).start() + if let photo = peer.largeProfileImage, photo.hasVideo { + let _ = context.engine.peers.fetchAndUpdateCachedPeerData(peerId: peer.id).start() + } } })) } else { diff --git a/submodules/GalleryUI/BUILD b/submodules/GalleryUI/BUILD index ba2b6e0711..82b0612031 100644 --- a/submodules/GalleryUI/BUILD +++ b/submodules/GalleryUI/BUILD @@ -45,6 +45,7 @@ swift_library( "//submodules/TelegramUI/Components/TextNodeWithEntities:TextNodeWithEntities", "//submodules/TelegramUI/Components/AnimationCache:AnimationCache", "//submodules/TelegramUI/Components/MultiAnimationRenderer:MultiAnimationRenderer", + "//submodules/TelegramUI/Components/SliderContextItem:SliderContextItem", ], visibility = [ "//visibility:public", diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index d8dc50ca3d..e0481a0677 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -22,6 +22,7 @@ import TelegramUIPreferences import OpenInExternalAppUI import AVKit import TextFormat +import SliderContextItem public enum UniversalVideoGalleryItemContentInfo { case message(Message) @@ -1267,17 +1268,11 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { strongSelf.moreBarButtonRateTimestamp = CFAbsoluteTimeGetCurrent() if abs(effectiveBaseRate - 1.0) > 0.01 { - let rateString: String - if abs(effectiveBaseRate - 0.5) < 0.01 { - rateString = "0.5x" - } else if abs(effectiveBaseRate - 1.5) < 0.01 { - rateString = "1.5x" - } else if abs(effectiveBaseRate - 2.0) < 0.01 { - rateString = "2x" - } else { - rateString = "x" + var stringValue = String(format: "%.1fx", effectiveBaseRate) + if stringValue.hasSuffix(".0x") { + stringValue = stringValue.replacingOccurrences(of: ".0x", with: "x") } - strongSelf.moreBarButton.setContent(.image(optionsRateImage(rate: rateString, isLarge: true)), animated: animated) + strongSelf.moreBarButton.setContent(.image(optionsRateImage(rate: stringValue, isLarge: true)), animated: animated) } else { strongSelf.moreBarButton.setContent(.more(optionsCircleImage(dark: false)), animated: animated) } @@ -2428,15 +2423,19 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } private func openMoreMenu(sourceNode: ASDisplayNode, gesture: ContextGesture?) { - let items: Signal<[ContextMenuItem], NoError> = self.contextMenuMainItems() guard let controller = self.baseNavigationController()?.topViewController as? ViewController else { return } - + var dismissImpl: (() -> Void)? + let items: Signal<[ContextMenuItem], NoError> = self.contextMenuMainItems(dismiss: { + dismissImpl?() + }) let contextController = ContextController(account: self.context.account, presentationData: self.presentationData.withUpdated(theme: defaultDarkColorPresentationTheme), source: .reference(HeaderContextReferenceContentSource(controller: controller, sourceNode: self.moreBarButton.referenceNode)), items: items |> map { ContextController.Items(content: .list($0)) }, gesture: gesture) self.isShowingContextMenuPromise.set(true) controller.presentInGlobalOverlay(contextController) - + dismissImpl = { [weak contextController] in + contextController?.dismiss() + } contextController.dismissed = { [weak self] in Queue.mainQueue().after(0.1, { self?.isShowingContextMenuPromise.set(false) @@ -2455,7 +2454,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { return speedList } - private func contextMenuMainItems() -> Signal<[ContextMenuItem], NoError> { + private func contextMenuMainItems(dismiss: @escaping () -> Void) -> Signal<[ContextMenuItem], NoError> { guard let videoNode = self.videoNode else { return .single([]) } @@ -2470,6 +2469,29 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { var items: [ContextMenuItem] = [] + var speedValue: String = strongSelf.presentationData.strings.PlaybackSpeed_Normal + var speedIconText: String = "1x" + for (text, iconText, speed) in strongSelf.speedList(strings: strongSelf.presentationData.strings) { + if abs(speed - status.baseRate) < 0.01 { + speedValue = text + speedIconText = iconText + break + } + } + + items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.PlaybackSpeed_Title, textLayout: .secondLineWithValue(speedValue), icon: { theme in + return optionsRateImage(rate: speedIconText, isLarge: false, color: theme.contextMenu.primaryColor) + }, action: { c, _ in + guard let strongSelf = self else { + c.dismiss(completion: nil) + return + } + + c.setItems(strongSelf.contextMenuSpeedItems(dismiss: dismiss) |> map { ContextController.Items(content: .list($0)) }, minHeight: nil) + }))) + + items.append(.separator) + if let (message, _, _) = strongSelf.contentInfo() { let context = strongSelf.context items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.SharedMedia_ViewInChat, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/GoToMessage"), color: theme.contextMenu.primaryColor)}, action: { [weak self] _, f in @@ -2493,27 +2515,6 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { }))) } - var speedValue: String = strongSelf.presentationData.strings.PlaybackSpeed_Normal - var speedIconText: String = "1x" - for (text, iconText, speed) in strongSelf.speedList(strings: strongSelf.presentationData.strings) { - if abs(speed - status.baseRate) < 0.01 { - speedValue = text - speedIconText = iconText - break - } - } - - items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.PlaybackSpeed_Title, textLayout: .secondLineWithValue(speedValue), icon: { theme in - return optionsRateImage(rate: speedIconText, isLarge: false, color: theme.contextMenu.primaryColor) - }, action: { c, _ in - guard let strongSelf = self else { - c.dismiss(completion: nil) - return - } - - c.setItems(strongSelf.contextMenuSpeedItems() |> map { ContextController.Items(content: .list($0)) }, minHeight: nil) - }))) - // if #available(iOS 11.0, *) { // items.append(.action(ContextMenuActionItem(text: "AirPlay", textColor: .primary, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/AirPlay"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in // f(.default) @@ -2593,7 +2594,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } } - private func contextMenuSpeedItems() -> Signal<[ContextMenuItem], NoError> { + private func contextMenuSpeedItems(dismiss: @escaping () -> Void) -> Signal<[ContextMenuItem], NoError> { guard let videoNode = self.videoNode else { return .single([]) } @@ -2607,7 +2608,29 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } var items: [ContextMenuItem] = [] + + items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor) + }, iconPosition: .left, action: { c, _ in + guard let strongSelf = self else { + c.dismiss(completion: nil) + return + } + c.setItems(strongSelf.contextMenuMainItems(dismiss: dismiss) |> map { ContextController.Items(content: .list($0)) }, minHeight: nil) + }))) + items.append(.custom(SliderContextItem(minValue: 0.05, maxValue: 2.5, value: status.baseRate, valueChanged: { [weak self] newValue, finished in + guard let strongSelf = self, let videoNode = strongSelf.videoNode else { + return + } + videoNode.setBaseRate(newValue) + if finished { + dismiss() + } + }), true)) + + items.append(.separator) + for (text, _, rate) in strongSelf.speedList(strings: strongSelf.presentationData.strings) { let isSelected = abs(status.baseRate - rate) < 0.01 items.append(.action(ContextMenuActionItem(text: text, icon: { theme in @@ -2631,17 +2654,6 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { }))) } - items.append(.separator) - items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor) - }, iconPosition: .left, action: { c, _ in - guard let strongSelf = self else { - c.dismiss(completion: nil) - return - } - c.setItems(strongSelf.contextMenuMainItems() |> map { ContextController.Items(content: .list($0)) }, minHeight: nil) - }))) - return items } } diff --git a/submodules/ImportStickerPackUI/Sources/ImportStickerPack.swift b/submodules/ImportStickerPackUI/Sources/ImportStickerPack.swift index 2a37ff824d..922ad9a4d8 100644 --- a/submodules/ImportStickerPackUI/Sources/ImportStickerPack.swift +++ b/submodules/ImportStickerPackUI/Sources/ImportStickerPack.swift @@ -11,18 +11,39 @@ enum StickerVerificationStatus { public class ImportStickerPack { public enum StickerPackType { - case image - case animation - case video - - var importType: CreateStickerSetType { - switch self { + public enum ContentType { + case image + case animation + case video + + var importType: CreateStickerSetType.ContentType { + switch self { case .image: return .image case .animation: return .animation case .video: return .video + } + } + } + + case stickers(content: ContentType) + case emoji(content: ContentType, textColored: Bool) + + var contentType: StickerPackType.ContentType { + switch self { + case let .stickers(content), let .emoji(content, _): + return content + } + } + + var importType: CreateStickerSetType { + switch self { + case let .stickers(content): + return .stickers(content: content.importType) + case let .emoji(content, textColored): + return .emoji(content: content.importType, textColored: textColored) } } } @@ -51,12 +72,14 @@ public class ImportStickerPack { let content: Content let emojis: [String] + let keywords: String let uuid: UUID var resource: MediaResource? - init(content: Content, emojis: [String], uuid: UUID = UUID()) { + init(content: Content, emojis: [String], keywords: String, uuid: UUID = UUID()) { self.content = content self.emojis = emojis + self.keywords = keywords self.uuid = uuid } @@ -88,13 +111,25 @@ public class ImportStickerPack { self.software = json["software"] as? String ?? "" let isAnimated = json["isAnimated"] as? Bool ?? false let isVideo = json["isVideo"] as? Bool ?? false + let isEmoji = json["isEmoji"] as? Bool ?? false + let isTextColored = json["isTextColored"] as? Bool ?? false let type: StickerPackType - if isAnimated { - type = .animation - } else if isVideo { - type = .video + if isEmoji { + if isAnimated { + type = .emoji(content: .animation, textColored: isTextColored) + } else if isVideo { + type = .emoji(content: .video, textColored: isTextColored) + } else { + type = .emoji(content: .image, textColored: isTextColored) + } } else { - type = .image + if isAnimated { + type = .stickers(content: .animation) + } else if isVideo { + type = .stickers(content: .video) + } else { + type = .stickers(content: .image) + } } self.type = type @@ -102,23 +137,23 @@ public class ImportStickerPack { if let dataString = sticker["data"] as? String, let mimeType = sticker["mimeType"] as? String, let data = Data(base64Encoded: dataString) { var content: Sticker.Content? switch mimeType.lowercased() { - case "image/png": - if case .image = type { - content = .image(data) - } - case "application/x-tgsticker": - if case .animation = type { - content = .animation(data) - } - case "video/webm", "image/webp", "image/gif": - if case .video = type { - content = .video(data, mimeType) - } - default: - break + case "image/png": + if case .image = type.contentType { + content = .image(data) + } + case "application/x-tgsticker": + if case .animation = type.contentType { + content = .animation(data) + } + case "video/webm", "image/webp", "image/gif": + if case .video = type.contentType { + content = .video(data, mimeType) + } + default: + break } if let content = content { - return Sticker(content: content, emojis: sticker["emojis"] as? [String] ?? []) + return Sticker(content: content, emojis: sticker["emojis"] as? [String] ?? [], keywords: sticker["keywords"] as? String ?? "") } } return nil diff --git a/submodules/ImportStickerPackUI/Sources/ImportStickerPackController.swift b/submodules/ImportStickerPackUI/Sources/ImportStickerPackController.swift index 1f49b051f9..3fdf142b98 100644 --- a/submodules/ImportStickerPackUI/Sources/ImportStickerPackController.swift +++ b/submodules/ImportStickerPackUI/Sources/ImportStickerPackController.swift @@ -79,7 +79,7 @@ public final class ImportStickerPackController: ViewController, StandalonePresen Queue.mainQueue().after(0.1) { self.controllerNode.updateStickerPack(self.stickerPack, verifiedStickers: Set(), declinedStickers: Set(), uploadedStickerResources: [:]) - if case .image = self.stickerPack.type { + if case .image = self.stickerPack.type.contentType { } else { let _ = (self.context.account.postbox.loadedPeerWithId(self.context.account.peerId) |> deliverOnMainQueue).start(next: { [weak self] peer in diff --git a/submodules/ImportStickerPackUI/Sources/ImportStickerPackControllerNode.swift b/submodules/ImportStickerPackUI/Sources/ImportStickerPackControllerNode.swift index 95d4c99ab8..7a9600b7a0 100644 --- a/submodules/ImportStickerPackUI/Sources/ImportStickerPackControllerNode.swift +++ b/submodules/ImportStickerPackUI/Sources/ImportStickerPackControllerNode.swift @@ -394,19 +394,39 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll forceTitleUpdate = true } - if let _ = self.stickerPack, self.currentItems.isEmpty || self.currentItems.count != self.pendingItems.count || self.pendingItems != self.currentItems || forceTitleUpdate { + let itemsPerRow: Int + if let stickerPack = self.stickerPack, case .emoji = stickerPack.type { + itemsPerRow = 8 + } else { + itemsPerRow = 4 + } + if let stickerPack = self.stickerPack, self.currentItems.isEmpty || self.currentItems.count != self.pendingItems.count || self.pendingItems != self.currentItems || forceTitleUpdate { let previousItems = self.currentItems self.currentItems = self.pendingItems let titleFont = Font.medium(20.0) let title: String if let _ = self.progress { - title = self.presentationData.strings.ImportStickerPack_ImportingStickers + if case .emoji = stickerPack.type { + title = self.presentationData.strings.ImportStickerPack_ImportingEmojis + } else { + title = self.presentationData.strings.ImportStickerPack_ImportingStickers + } } else { - title = self.presentationData.strings.ImportStickerPack_StickerCount(Int32(self.currentItems.count)) + if case .emoji = stickerPack.type { + title = self.presentationData.strings.ImportStickerPack_EmojiCount(Int32(self.currentItems.count)) + } else { + title = self.presentationData.strings.ImportStickerPack_StickerCount(Int32(self.currentItems.count)) + } } self.contentTitleNode.attributedText = stringWithAppliedEntities(title, entities: [], baseColor: self.presentationData.theme.actionSheet.primaryTextColor, linkColor: self.presentationData.theme.actionSheet.controlAccentColor, baseFont: titleFont, linkFont: titleFont, boldFont: titleFont, italicFont: titleFont, boldItalicFont: titleFont, fixedFont: titleFont, blockQuoteFont: titleFont, message: nil) + if case .emoji = stickerPack.type { + self.createActionButtonNode.setTitle(self.presentationData.strings.ImportStickerPack_CreateNewEmojiPack, with: Font.regular(20.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal) + } else { + self.createActionButtonNode.setTitle(self.presentationData.strings.ImportStickerPack_CreateNewStickerSet, with: Font.regular(20.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal) + } + if !forceTitleUpdate { transaction = StickerPackPreviewGridTransaction(previousList: previousItems, list: self.currentItems, account: self.context.account, interaction: self.interaction, theme: self.presentationData.theme) } @@ -422,7 +442,7 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll transition.updateFrame(node: self.contentTitleNode, frame: titleFrame) transition.updateFrame(node: self.contentSeparatorNode, frame: CGRect(origin: CGPoint(x: contentContainerFrame.minX, y: self.contentBackgroundNode.frame.minY + titleAreaHeight), size: CGSize(width: contentContainerFrame.size.width, height: UIScreenPixel))) - let itemsPerRow = 4 + let itemWidth = floor(contentFrame.size.width / CGFloat(itemsPerRow)) let rowCount = itemCount / itemsPerRow + (itemCount % itemsPerRow != 0 ? 1 : 0) @@ -605,9 +625,9 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll if let localResource = item.stickerItem.resource { self.context.account.postbox.mediaBox.copyResourceData(from: localResource.id, to: resource.id) } - stickers.append(ImportSticker(resource: resource, emojis: item.stickerItem.emojis, dimensions: dimensions, mimeType: item.stickerItem.mimeType)) + stickers.append(ImportSticker(resource: resource, emojis: item.stickerItem.emojis, dimensions: dimensions, mimeType: item.stickerItem.mimeType, keywords: item.stickerItem.keywords)) } else if let resource = item.stickerItem.resource { - stickers.append(ImportSticker(resource: resource, emojis: item.stickerItem.emojis, dimensions: dimensions, mimeType: item.stickerItem.mimeType)) + stickers.append(ImportSticker(resource: resource, emojis: item.stickerItem.emojis, dimensions: dimensions, mimeType: item.stickerItem.mimeType, keywords: item.stickerItem.keywords)) } } var thumbnailSticker: ImportSticker? @@ -618,7 +638,7 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll } let resource = LocalFileMediaResource(fileId: Int64.random(in: Int64.min ... Int64.max)) self.context.account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnail.data) - thumbnailSticker = ImportSticker(resource: resource, emojis: [], dimensions: dimensions, mimeType: thumbnail.mimeType) + thumbnailSticker = ImportSticker(resource: resource, emojis: [], dimensions: dimensions, mimeType: thumbnail.mimeType, keywords: thumbnail.keywords) } let firstStickerItem = thumbnailSticker ?? stickers.first @@ -636,7 +656,7 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll if let (_, _, count) = strongSelf.progress { strongSelf.progress = (1.0, count, count) var animated = false - if case .image = stickerPack.type { + if case .image = stickerPack.type.contentType { animated = true } strongSelf.radialStatus.transitionToState(.progress(color: strongSelf.presentationData.theme.list.itemAccentColor, lineWidth: 6.0, value: 1.0, cancelEnabled: false, animateRotation: false), animated: animated, synchronous: true, completion: {}) @@ -804,7 +824,7 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll } self.pendingItems = updatedItems - if case .image = stickerPack.type { + if case .image = stickerPack.type.contentType { } else { self.stickerPackReady = stickerPack.stickers.count == (verifiedStickers.count + declinedStickers.count) && updatedItems.count > 0 } diff --git a/submodules/MediaResources/Sources/MediaPlaybackStoredState.swift b/submodules/MediaResources/Sources/MediaPlaybackStoredState.swift index d9bef73942..99360ec901 100644 --- a/submodules/MediaResources/Sources/MediaPlaybackStoredState.swift +++ b/submodules/MediaResources/Sources/MediaPlaybackStoredState.swift @@ -18,7 +18,7 @@ public final class MediaPlaybackStoredState: Codable { let container = try decoder.container(keyedBy: StringCodingKey.self) self.timestamp = try container.decode(Double.self, forKey: "timestamp") - self.playbackRate = AudioPlaybackRate(rawValue: try container.decode(Int32.self, forKey: "playbackRate")) ?? .x1 + self.playbackRate = AudioPlaybackRate(rawValue: try container.decode(Int32.self, forKey: "playbackRate")) } public func encode(to encoder: Encoder) throws { diff --git a/submodules/SemanticStatusNode/Sources/SemanticStatusNode.swift b/submodules/SemanticStatusNode/Sources/SemanticStatusNode.swift index ca2d5d5a5d..440082d668 100644 --- a/submodules/SemanticStatusNode/Sources/SemanticStatusNode.swift +++ b/submodules/SemanticStatusNode/Sources/SemanticStatusNode.swift @@ -145,6 +145,9 @@ private final class SemanticStatusNodeIconContext: SemanticStatusNodeStateContex if let iconImage = self.iconImage { context.saveGState() let iconRect = CGRect(origin: CGPoint(), size: iconImage.size) + context.translateBy(x: size.width / 2.0, y: size.height / 2.0) + context.scaleBy(x: 1.0, y: -1.0) + context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) context.clip(to: iconRect, mask: iconImage.cgImage!) context.fill(iconRect) context.restoreGState() @@ -180,6 +183,9 @@ private final class SemanticStatusNodeIconContext: SemanticStatusNodeStateContex if let iconImage = self.iconImage { context.saveGState() let iconRect = CGRect(origin: CGPoint(), size: iconImage.size) + context.translateBy(x: size.width / 2.0, y: size.height / 2.0) + context.scaleBy(x: 1.0, y: -1.0) + context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) context.clip(to: iconRect, mask: iconImage.cgImage!) context.fill(iconRect) context.restoreGState() diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index c032d2dc00..4f43d13390 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -379,7 +379,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1645763991] = { return Api.InputStickerSet.parse_inputStickerSetID($0) } dict[-930399486] = { return Api.InputStickerSet.parse_inputStickerSetPremiumGifts($0) } dict[-2044933984] = { return Api.InputStickerSet.parse_inputStickerSetShortName($0) } - dict[-6249322] = { return Api.InputStickerSetItem.parse_inputStickerSetItem($0) } + dict[853188252] = { return Api.InputStickerSetItem.parse_inputStickerSetItem($0) } dict[70813275] = { return Api.InputStickeredMedia.parse_inputStickeredMediaDocument($0) } dict[1251549527] = { return Api.InputStickeredMedia.parse_inputStickeredMediaPhoto($0) } dict[1634697192] = { return Api.InputStorePaymentPurpose.parse_inputStorePaymentGiftPremium($0) } diff --git a/submodules/TelegramApi/Sources/Api10.swift b/submodules/TelegramApi/Sources/Api10.swift index bcfe97264d..22bf87c5cb 100644 --- a/submodules/TelegramApi/Sources/Api10.swift +++ b/submodules/TelegramApi/Sources/Api10.swift @@ -392,26 +392,27 @@ public extension Api { } public extension Api { enum InputStickerSetItem: TypeConstructorDescription { - case inputStickerSetItem(flags: Int32, document: Api.InputDocument, emoji: String, maskCoords: Api.MaskCoords?) + case inputStickerSetItem(flags: Int32, document: Api.InputDocument, emoji: String, maskCoords: Api.MaskCoords?, keywords: String?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .inputStickerSetItem(let flags, let document, let emoji, let maskCoords): + case .inputStickerSetItem(let flags, let document, let emoji, let maskCoords, let keywords): if boxed { - buffer.appendInt32(-6249322) + buffer.appendInt32(853188252) } serializeInt32(flags, buffer: buffer, boxed: false) document.serialize(buffer, true) serializeString(emoji, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 0) != 0 {maskCoords!.serialize(buffer, true)} + if Int(flags) & Int(1 << 1) != 0 {serializeString(keywords!, buffer: buffer, boxed: false)} break } } public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .inputStickerSetItem(let flags, let document, let emoji, let maskCoords): - return ("inputStickerSetItem", [("flags", flags as Any), ("document", document as Any), ("emoji", emoji as Any), ("maskCoords", maskCoords as Any)]) + case .inputStickerSetItem(let flags, let document, let emoji, let maskCoords, let keywords): + return ("inputStickerSetItem", [("flags", flags as Any), ("document", document as Any), ("emoji", emoji as Any), ("maskCoords", maskCoords as Any), ("keywords", keywords as Any)]) } } @@ -428,12 +429,15 @@ public extension Api { if Int(_1!) & Int(1 << 0) != 0 {if let signature = reader.readInt32() { _4 = Api.parse(reader, signature: signature) as? Api.MaskCoords } } + var _5: String? + if Int(_1!) & Int(1 << 1) != 0 {_5 = parseString(reader) } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil let _c4 = (Int(_1!) & Int(1 << 0) == 0) || _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.InputStickerSetItem.inputStickerSetItem(flags: _1!, document: _2!, emoji: _3!, maskCoords: _4) + let _c5 = (Int(_1!) & Int(1 << 1) == 0) || _5 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 { + return Api.InputStickerSetItem.inputStickerSetItem(flags: _1!, document: _2!, emoji: _3!, maskCoords: _4, keywords: _5) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api30.swift b/submodules/TelegramApi/Sources/Api30.swift index a7b2b34a3e..49cfdf277e 100644 --- a/submodules/TelegramApi/Sources/Api30.swift +++ b/submodules/TelegramApi/Sources/Api30.swift @@ -7919,6 +7919,25 @@ public extension Api.functions.stickers { }) } } +public extension Api.functions.stickers { + static func changeSticker(flags: Int32, sticker: Api.InputDocument, emoji: String?, maskCoords: Api.MaskCoords?, keywords: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-179077444) + serializeInt32(flags, buffer: buffer, boxed: false) + sticker.serialize(buffer, true) + if Int(flags) & Int(1 << 0) != 0 {serializeString(emoji!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 1) != 0 {maskCoords!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {serializeString(keywords!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "stickers.changeSticker", parameters: [("flags", String(describing: flags)), ("sticker", String(describing: sticker)), ("emoji", String(describing: emoji)), ("maskCoords", String(describing: maskCoords)), ("keywords", String(describing: keywords))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.StickerSet? in + let reader = BufferReader(buffer) + var result: Api.messages.StickerSet? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.StickerSet + } + return result + }) + } +} public extension Api.functions.stickers { static func changeStickerPosition(sticker: Api.InputDocument, position: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() @@ -7991,12 +8010,30 @@ public extension Api.functions.stickers { } } public extension Api.functions.stickers { - static func setStickerSetThumb(stickerset: Api.InputStickerSet, thumb: Api.InputDocument) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func renameStickerSet(stickerset: Api.InputStickerSet, title: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-1707717072) + buffer.appendInt32(306912256) stickerset.serialize(buffer, true) - thumb.serialize(buffer, true) - return (FunctionDescription(name: "stickers.setStickerSetThumb", parameters: [("stickerset", String(describing: stickerset)), ("thumb", String(describing: thumb))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.StickerSet? in + serializeString(title, buffer: buffer, boxed: false) + return (FunctionDescription(name: "stickers.renameStickerSet", parameters: [("stickerset", String(describing: stickerset)), ("title", String(describing: title))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.StickerSet? in + let reader = BufferReader(buffer) + var result: Api.messages.StickerSet? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.StickerSet + } + return result + }) + } +} +public extension Api.functions.stickers { + static func setStickerSetThumb(flags: Int32, stickerset: Api.InputStickerSet, thumb: Api.InputDocument?, thumbDocumentId: Int64?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1486204014) + serializeInt32(flags, buffer: buffer, boxed: false) + stickerset.serialize(buffer, true) + if Int(flags) & Int(1 << 0) != 0 {thumb!.serialize(buffer, true)} + if Int(flags) & Int(1 << 1) != 0 {serializeInt64(thumbDocumentId!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "stickers.setStickerSetThumb", parameters: [("flags", String(describing: flags)), ("stickerset", String(describing: stickerset)), ("thumb", String(describing: thumb)), ("thumbDocumentId", String(describing: thumbDocumentId))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.StickerSet? in let reader = BufferReader(buffer) var result: Api.messages.StickerSet? if let signature = reader.readInt32() { diff --git a/submodules/TelegramBaseController/BUILD b/submodules/TelegramBaseController/BUILD index 1d6b6bf6f8..52f34d888a 100644 --- a/submodules/TelegramBaseController/BUILD +++ b/submodules/TelegramBaseController/BUILD @@ -24,6 +24,9 @@ swift_library( "//submodules/Markdown:Markdown", "//submodules/TelegramCallsUI:TelegramCallsUI", "//submodules/ManagedAnimationNode:ManagedAnimationNode", + "//submodules/TelegramNotices:TelegramNotices", + "//submodules/TooltipUI:TooltipUI", + "//submodules/TelegramUI/Components/SliderContextItem:SliderContextItem", ], visibility = [ "//visibility:public", diff --git a/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift b/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift index 4905cd1adf..9bf2178231 100644 --- a/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift +++ b/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift @@ -11,6 +11,9 @@ import AccountContext import TelegramStringFormatting import ManagedAnimationNode import ContextUI +import TelegramNotices +import TooltipUI +import SliderContextItem private let titleFont = Font.regular(12.0) private let subtitleFont = Font.regular(10.0) @@ -171,7 +174,7 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi public var tapAction: (() -> Void)? public var close: (() -> Void)? - public var setRate: ((AudioPlaybackRate) -> Void)? + public var setRate: ((AudioPlaybackRate, Bool) -> Void)? public var togglePlayPause: (() -> Void)? public var playPrevious: (() -> Void)? public var playNext: (() -> Void)? @@ -184,24 +187,11 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi guard self.playbackBaseRate != oldValue, let playbackBaseRate = self.playbackBaseRate else { return } - switch playbackBaseRate { - case .x0_5: - self.rateButton.setContent(.image(optionsRateImage(rate: "0.5X", color: self.theme.rootController.navigationBar.accentTextColor))) - case .x1: - self.rateButton.setContent(.image(optionsRateImage(rate: "1X", color: self.theme.rootController.navigationBar.controlColor))) - self.rateButton.accessibilityLabel = self.strings.VoiceOver_Media_PlaybackRate - self.rateButton.accessibilityValue = self.strings.VoiceOver_Media_PlaybackRateNormal - self.rateButton.accessibilityHint = self.strings.VoiceOver_Media_PlaybackRateChange - case .x1_5: - self.rateButton.setContent(.image(optionsRateImage(rate: "1.5X", color: self.theme.rootController.navigationBar.accentTextColor))) - case .x2: - self.rateButton.setContent(.image(optionsRateImage(rate: "2X", color: self.theme.rootController.navigationBar.accentTextColor))) - self.rateButton.accessibilityLabel = self.strings.VoiceOver_Media_PlaybackRate - self.rateButton.accessibilityValue = self.strings.VoiceOver_Media_PlaybackRateFast - self.rateButton.accessibilityHint = self.strings.VoiceOver_Media_PlaybackRateChange - default: - break - } + self.rateButton.accessibilityLabel = self.strings.VoiceOver_Media_PlaybackRate + self.rateButton.accessibilityHint = self.strings.VoiceOver_Media_PlaybackRateChange + self.rateButton.accessibilityValue = playbackBaseRate.stringValue + + self.rateButton.setContent(.image(optionsRateImage(rate: playbackBaseRate.stringValue.uppercased(), color: self.theme.rootController.navigationBar.controlColor))) } } @@ -374,18 +364,7 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi self.scrubbingNode.updateContent(.standard(lineHeight: 2.0, lineCap: .square, scrubberHandle: .none, backgroundColor: .clear, foregroundColor: self.theme.rootController.navigationBar.accentTextColor, bufferingColor: self.theme.rootController.navigationBar.accentTextColor.withAlphaComponent(0.5), chapters: [])) if let playbackBaseRate = self.playbackBaseRate { - switch playbackBaseRate { - case .x0_5: - self.rateButton.setContent(.image(optionsRateImage(rate: "0.5X", color: self.theme.rootController.navigationBar.accentTextColor))) - case .x1: - self.rateButton.setContent(.image(optionsRateImage(rate: "1X", color: self.theme.rootController.navigationBar.controlColor))) - case .x1_5: - self.rateButton.setContent(.image(optionsRateImage(rate: "1.5X", color: self.theme.rootController.navigationBar.accentTextColor))) - case .x2: - self.rateButton.setContent(.image(optionsRateImage(rate: "2X", color: self.theme.rootController.navigationBar.accentTextColor))) - default: - break - } + self.rateButton.setContent(.image(optionsRateImage(rate: playbackBaseRate.stringValue.uppercased(), color: self.theme.rootController.navigationBar.controlColor))) } if let (size, leftInset, rightInset) = self.validLayout { self.updateLayout(size: size, leftInset: leftInset, rightInset: rightInset, transition: .immediate) @@ -493,6 +472,7 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi transition.updateFrame(node: self.closeButton, frame: CGRect(origin: CGPoint(x: bounds.size.width - 44.0 - rightInset, y: 0.0), size: CGSize(width: 44.0, height: minHeight))) let rateButtonSize = CGSize(width: 30.0, height: minHeight) transition.updateFrame(node: self.rateButton, frame: CGRect(origin: CGPoint(x: bounds.size.width - 33.0 - closeButtonSize.width - rateButtonSize.width - rightInset, y: -4.0), size: rateButtonSize)) + transition.updateFrame(node: self.playPauseIconNode, frame: CGRect(origin: CGPoint(x: 6.0, y: 4.0 + UIScreenPixel), size: CGSize(width: 28.0, height: 28.0))) transition.updateFrame(node: self.actionButton, frame: CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: 40.0, height: 37.0))) transition.updateFrame(node: self.scrubbingNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 37.0 - 2.0), size: CGSize(width: size.width, height: 2.0))) @@ -520,7 +500,18 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi } else { nextRate = .x2 } - self.setRate?(nextRate) + self.setRate?(nextRate, false) + + let frame = self.rateButton.view.convert(self.rateButton.bounds, to: nil) + + let _ = (ApplicationSpecificNotice.incrementAudioRateOptionsTip(accountManager: self.context.sharedContext.accountManager) + |> deliverOnMainQueue).start(next: { [weak self] value in + if let strongSelf = self, let controller = strongSelf.getController?(), value == 4 { + controller.present(TooltipScreen(account: strongSelf.context.account, text: strongSelf.strings.Conversation_AudioRateOptionsTooltip, style: .default, icon: nil, location: .point(frame.offsetBy(dx: 0.0, dy: 4.0), .bottom), displayDuration: .custom(3.0), inset: 3.0, shouldDismissOnTouch: { _ in + return .dismiss(consume: false) + }), in: .window(.root)) + } + }) } private func speedList(strings: PresentationStrings) -> [(String, String, AudioPlaybackRate)] { @@ -533,9 +524,18 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi return speedList } - private func contextMenuSpeedItems() -> Signal<[ContextMenuItem], NoError> { + private func contextMenuSpeedItems(dismiss: @escaping () -> Void) -> Signal<[ContextMenuItem], NoError> { var items: [ContextMenuItem] = [] + items.append(.custom(SliderContextItem(minValue: 0.05, maxValue: 2.5, value: self.playbackBaseRate?.doubleValue ?? 1.0, valueChanged: { [weak self] newValue, finished in + self?.setRate?(AudioPlaybackRate(newValue), true) + if finished { + dismiss() + } + }), true)) + + items.append(.separator) + for (text, _, rate) in self.speedList(strings: self.strings) { let isSelected = self.playbackBaseRate == rate items.append(.action(ContextMenuActionItem(text: text, icon: { theme in @@ -547,7 +547,7 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi }, action: { [weak self] _, f in f(.default) - self?.setRate?(rate) + self?.setRate?(rate, true) }))) } @@ -558,9 +558,14 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi guard let controller = self.getController?() else { return } - let items: Signal<[ContextMenuItem], NoError> = self.contextMenuSpeedItems() + var dismissImpl: (() -> Void)? + let items: Signal<[ContextMenuItem], NoError> = self.contextMenuSpeedItems(dismiss: { + dismissImpl?() + }) let contextController = ContextController(account: self.context.account, presentationData: self.context.sharedContext.currentPresentationData.with { $0 }, source: .reference(HeaderContextReferenceContentSource(controller: controller, sourceNode: self.rateButton.referenceNode, shouldBeDismissed: self.dismissedPromise.get())), items: items |> map { ContextController.Items(content: .list($0)) }, gesture: gesture) - + dismissImpl = { [weak contextController] in + contextController?.dismiss() + } self.presentInGlobalOverlay?(contextController) } @@ -626,41 +631,38 @@ private final class PlayPauseIconNode: ManagedAnimationNode { } private func optionsRateImage(rate: String, color: UIColor = .white) -> UIImage? { - return generateImage(CGSize(width: 30.0, height: 16.0), rotatedContext: { size, context in + let isLarge = "".isEmpty + return generateImage(isLarge ? CGSize(width: 30.0, height: 30.0) : CGSize(width: 24.0, height: 24.0), rotatedContext: { size, context in UIGraphicsPushContext(context) context.clear(CGRect(origin: CGPoint(), size: size)) - let lineWidth = 1.0 + UIScreenPixel - context.setLineWidth(lineWidth) - context.setStrokeColor(color.cgColor) - + if let image = generateTintedImage(image: UIImage(bundleImageName: isLarge ? "Chat/Context Menu/Playspeed30" : "Chat/Context Menu/Playspeed24"), color: color) { + image.draw(at: CGPoint(x: 0.0, y: 0.0)) + } - let string = NSMutableAttributedString(string: rate, font: Font.with(size: 11.0, design: .round, weight: .bold), textColor: color) + let string = NSMutableAttributedString(string: rate, font: Font.with(size: isLarge ? 11.0 : 10.0, design: .round, weight: .semibold), textColor: color) var offset = CGPoint(x: 1.0, y: 0.0) - var width: CGFloat if rate.count >= 3 { - if rate == "0.5X" { + if rate == "0.5x" { string.addAttribute(.kern, value: -0.8 as NSNumber, range: NSRange(string.string.startIndex ..< string.string.endIndex, in: string.string)) offset.x += -0.5 } else { string.addAttribute(.kern, value: -0.5 as NSNumber, range: NSRange(string.string.startIndex ..< string.string.endIndex, in: string.string)) offset.x += -0.3 } - width = 29.0 } else { - string.addAttribute(.kern, value: -0.5 as NSNumber, range: NSRange(string.string.startIndex ..< string.string.endIndex, in: string.string)) - width = 19.0 offset.x += -0.3 } - - let path = UIBezierPath(roundedRect: CGRect(x: floorToScreenPixels((size.width - width) / 2.0), y: 0.0, width: width, height: 16.0).insetBy(dx: lineWidth / 2.0, dy: lineWidth / 2.0), byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 2.0, height: 2.0)) - context.addPath(path.cgPath) - context.strokePath() - + + if !isLarge { + offset.x *= 0.5 + offset.y *= 0.5 + } + let boundingRect = string.boundingRect(with: size, options: [], context: nil) - string.draw(at: CGPoint(x: offset.x + floor((size.width - boundingRect.width) / 2.0), y: offset.y + UIScreenPixel + floor((size.height - boundingRect.height) / 2.0))) + string.draw(at: CGPoint(x: offset.x + floor((size.width - boundingRect.width) / 2.0), y: offset.y + floor((size.height - boundingRect.height) / 2.0))) UIGraphicsPopContext() }) diff --git a/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryPanel.swift b/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryPanel.swift index 046e95439c..a10974bed6 100644 --- a/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryPanel.swift +++ b/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryPanel.swift @@ -11,7 +11,7 @@ public final class MediaNavigationAccessoryPanel: ASDisplayNode { public let containerNode: MediaNavigationAccessoryContainerNode public var close: (() -> Void)? - public var setRate: ((AudioPlaybackRate) -> Void)? + public var setRate: ((AudioPlaybackRate, Bool) -> Void)? public var togglePlayPause: (() -> Void)? public var tapAction: (() -> Void)? public var playPrevious: (() -> Void)? @@ -32,8 +32,8 @@ public final class MediaNavigationAccessoryPanel: ASDisplayNode { close() } } - self.containerNode.headerNode.setRate = { [weak self] rate in - self?.setRate?(rate) + self.containerNode.headerNode.setRate = { [weak self] rate, fromMenu in + self?.setRate?(rate, fromMenu) } self.containerNode.headerNode.togglePlayPause = { [weak self] in if let strongSelf = self, let togglePlayPause = strongSelf.togglePlayPause { diff --git a/submodules/TelegramBaseController/Sources/TelegramBaseController.swift b/submodules/TelegramBaseController/Sources/TelegramBaseController.swift index 9551940eec..a575233266 100644 --- a/submodules/TelegramBaseController/Sources/TelegramBaseController.swift +++ b/submodules/TelegramBaseController/Sources/TelegramBaseController.swift @@ -669,7 +669,7 @@ open class TelegramBaseController: ViewController, KeyShortcutResponder { strongSelf.context.sharedContext.mediaManager.setPlaylist(nil, type: type, control: SharedMediaPlayerControlAction.playback(.pause)) } } - mediaAccessoryPanel.setRate = { [weak self] rate in + mediaAccessoryPanel.setRate = { [weak self] rate, fromMenu in guard let strongSelf = self else { return } @@ -687,41 +687,48 @@ open class TelegramBaseController: ViewController, KeyShortcutResponder { } strongSelf.context.sharedContext.mediaManager.playlistControl(.setBaseRate(baseRate), type: type) -// var hasTooltip = false -// strongSelf.forEachController({ controller in -// if let controller = controller as? UndoOverlayController { -// hasTooltip = true -// controller.dismissWithCommitAction() -// } -// return true -// }) -// -// let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } -// let slowdown: Bool? -// if baseRate == .x1 { -// slowdown = true -// } else if baseRate == .x2 { -// slowdown = false -// } else { -// slowdown = nil -// } -// if let slowdown = slowdown { -// strongSelf.present( -// UndoOverlayController( -// presentationData: presentationData, -// content: .audioRate( -// slowdown: slowdown, -// text: slowdown ? presentationData.strings.Conversation_AudioRateTooltipNormal : presentationData.strings.Conversation_AudioRateTooltipSpeedUp -// ), -// elevatedLayout: false, -// animateInAsReplacement: hasTooltip, -// action: { action in -// return true -// } -// ), -// in: .current -// ) -// } + var hasTooltip = false + strongSelf.forEachController({ controller in + if let controller = controller as? UndoOverlayController { + hasTooltip = true + controller.dismissWithCommitAction() + } + return true + }) + + let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } + let text: String? + let rate: CGFloat? + if baseRate == .x1 { + text = presentationData.strings.Conversation_AudioRateTooltipNormal + rate = 1.0 + } else if baseRate == .x1_5 { + text = presentationData.strings.Conversation_AudioRateTooltip15X + rate = 1.5 + } else if baseRate == .x2 { + text = presentationData.strings.Conversation_AudioRateTooltipSpeedUp + rate = 2.0 + } else { + text = nil + rate = nil + } + if let rate, let text, !fromMenu { + strongSelf.present( + UndoOverlayController( + presentationData: presentationData, + content: .audioRate( + rate: rate, + text: text + ), + elevatedLayout: false, + animateInAsReplacement: hasTooltip, + action: { action in + return true + } + ), + in: .current + ) + } }) } mediaAccessoryPanel.togglePlayPause = { [weak self] in diff --git a/submodules/TelegramCore/Sources/State/Serialization.swift b/submodules/TelegramCore/Sources/State/Serialization.swift index 65f96a9d8b..5d7148df3a 100644 --- a/submodules/TelegramCore/Sources/State/Serialization.swift +++ b/submodules/TelegramCore/Sources/State/Serialization.swift @@ -210,7 +210,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 152 + return 153 } public func parseMessage(_ data: Data!) -> Any! { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Stickers/ImportStickers.swift b/submodules/TelegramCore/Sources/TelegramEngine/Stickers/ImportStickers.swift index 1c43133c1f..9e139f7c9a 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Stickers/ImportStickers.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Stickers/ImportStickers.swift @@ -81,12 +81,14 @@ public struct ImportSticker { let emojis: [String] public let dimensions: PixelDimensions public let mimeType: String + public let keywords: String - public init(resource: MediaResource, emojis: [String], dimensions: PixelDimensions, mimeType: String) { + public init(resource: MediaResource, emojis: [String], dimensions: PixelDimensions, mimeType: String, keywords: String) { self.resource = resource self.emojis = emojis self.dimensions = dimensions self.mimeType = mimeType + self.keywords = keywords } } @@ -96,9 +98,21 @@ public enum CreateStickerSetStatus { } public enum CreateStickerSetType { - case image - case animation - case video + public enum ContentType { + case image + case animation + case video + } + + case stickers(content: ContentType) + case emoji(content: ContentType, textColored: Bool) + + var contentType: ContentType { + switch self { + case let .stickers(content), let .emoji(content, _): + return content + } + } } func _internal_createStickerSet(account: Account, title: String, shortName: String, stickers: [ImportSticker], thumbnail: ImportSticker?, type: CreateStickerSetType, software: String?) -> Signal { @@ -133,7 +147,7 @@ func _internal_createStickerSet(account: Account, title: String, shortName: Stri } if resources.count == stickers.count { var flags: Int32 = 0 - switch type { + switch type.contentType { case .animation: flags |= (1 << 1) case .video: @@ -141,12 +155,24 @@ func _internal_createStickerSet(account: Account, title: String, shortName: Stri default: break } + if case let .emoji(_, textColored) = type { + flags |= (1 << 5) + if textColored { + flags |= (1 << 6) + } + } var inputStickers: [Api.InputStickerSetItem] = [] let stickerDocuments = thumbnail != nil ? resources.dropLast() : resources for i in 0 ..< stickerDocuments.count { let sticker = stickers[i] let resource = resources[i] - inputStickers.append(.inputStickerSetItem(flags: 0, document: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference ?? Data())), emoji: sticker.emojis.first ?? "", maskCoords: nil)) + + var flags: Int32 = 0 + if sticker.keywords.count > 0 { + flags |= (1 << 1) + } + + inputStickers.append(.inputStickerSetItem(flags: flags, document: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference ?? Data())), emoji: sticker.emojis.first ?? "", maskCoords: nil, keywords: sticker.keywords)) } var thumbnailDocument: Api.InputDocument? if thumbnail != nil, let resource = resources.last { diff --git a/submodules/TelegramNotices/Sources/Notices.swift b/submodules/TelegramNotices/Sources/Notices.swift index f80d464bdc..612c0a699f 100644 --- a/submodules/TelegramNotices/Sources/Notices.swift +++ b/submodules/TelegramNotices/Sources/Notices.swift @@ -167,6 +167,8 @@ private enum ApplicationSpecificGlobalNotice: Int32 { case audioTranscriptionSuggestion = 33 case clearStorageDismissedTipSize = 34 case dismissedTrendingEmojiPacks = 35 + case audioRateOptionsTip = 36 + case translationSuggestion = 37 var key: ValueBoxKey { let v = ValueBoxKey(length: 4) @@ -359,6 +361,14 @@ private struct ApplicationSpecificNoticeKeys { static func dismissedTrendingEmojiPacks() -> NoticeEntryKey { return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.dismissedTrendingEmojiPacks.key) } + + static func translationSuggestionNotice() -> NoticeEntryKey { + return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.translationSuggestion.key) + } + + static func audioRateOptionsTip() -> NoticeEntryKey { + return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.audioRateOptionsTip.key) + } } public struct ApplicationSpecificNotice { @@ -1207,22 +1217,84 @@ public struct ApplicationSpecificNotice { } } - public static func incrementAudioTranscriptionSuggestion(accountManager: AccountManager, count: Int = 1) -> Signal { - return accountManager.transaction { transaction -> Int in + public static func incrementAudioTranscriptionSuggestion(accountManager: AccountManager, count: Int32 = 1) -> Signal { + return accountManager.transaction { transaction -> Int32 in var currentValue: Int32 = 0 if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.audioTranscriptionSuggestion())?.get(ApplicationSpecificCounterNotice.self) { currentValue = value.value } let previousValue = currentValue - currentValue += Int32(count) + currentValue += count if let entry = CodableEntry(ApplicationSpecificCounterNotice(value: currentValue)) { transaction.setNotice(ApplicationSpecificNoticeKeys.audioTranscriptionSuggestion(), entry) } - return Int(previousValue) + return previousValue } } + + public static func translationSuggestion(accountManager: AccountManager) -> Signal<(Int32, Int32), NoError> { + return accountManager.noticeEntry(key: ApplicationSpecificNoticeKeys.translationSuggestionNotice()) + |> map { view -> (Int32, Int32) in + if let value = view.value?.get(ApplicationSpecificTimestampAndCounterNotice.self) { + return (value.counter, value.timestamp) + } else { + return (0, 0) + } + } + } + + public static func incrementTranslationSuggestion(accountManager: AccountManager, count: Int32 = 1, timestamp: Int32) -> Signal { + return accountManager.transaction { transaction -> Int32 in + var currentValue: Int32 = 0 + var currentTimestamp: Int32 = 0 + if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.translationSuggestionNotice())?.get(ApplicationSpecificTimestampAndCounterNotice.self) { + currentValue = value.counter + currentTimestamp = value.timestamp + } + + if currentTimestamp > timestamp { + return Int32(currentValue) + } else { + let previousValue = currentValue + currentValue = max(0, Int32(currentValue + count)) + + if let entry = CodableEntry(ApplicationSpecificTimestampAndCounterNotice(counter: currentValue, timestamp: timestamp)) { + transaction.setNotice(ApplicationSpecificNoticeKeys.translationSuggestionNotice(), entry) + } + + return Int32(previousValue) + } + } + } + + public static func getAudioRateOptionsTip(accountManager: AccountManager) -> Signal { + return accountManager.transaction { transaction -> Int32 in + if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.audioRateOptionsTip())?.get(ApplicationSpecificCounterNotice.self) { + return value.value + } else { + return 0 + } + } + } + + public static func incrementAudioRateOptionsTip(accountManager: AccountManager, count: Int32 = 1) -> Signal { + return accountManager.transaction { transaction -> Int32 in + var currentValue: Int32 = 0 + if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.audioRateOptionsTip())?.get(ApplicationSpecificCounterNotice.self) { + currentValue = value.value + } + let previousValue = currentValue + currentValue += count + + if let entry = CodableEntry(ApplicationSpecificCounterNotice(value: currentValue)) { + transaction.setNotice(ApplicationSpecificNoticeKeys.audioRateOptionsTip(), entry) + } + return previousValue + } + } + public static func reset(accountManager: AccountManager) -> Signal { return accountManager.transaction { transaction -> Void in } diff --git a/submodules/TelegramUI/Components/SliderContextItem/BUILD b/submodules/TelegramUI/Components/SliderContextItem/BUILD new file mode 100644 index 0000000000..849f6e3715 --- /dev/null +++ b/submodules/TelegramUI/Components/SliderContextItem/BUILD @@ -0,0 +1,22 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "SliderContextItem", + module_name = "SliderContextItem", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", + "//submodules/AsyncDisplayKit:AsyncDisplayKit", + "//submodules/Display:Display", + "//submodules/ContextUI:ContextUI", + "//submodules/TelegramPresentationData:TelegramPresentationData", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Components/SliderContextItem/Sources/SliderContextItem.swift b/submodules/TelegramUI/Components/SliderContextItem/Sources/SliderContextItem.swift new file mode 100644 index 0000000000..197ec449ea --- /dev/null +++ b/submodules/TelegramUI/Components/SliderContextItem/Sources/SliderContextItem.swift @@ -0,0 +1,184 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import ContextUI +import TelegramPresentationData + +public final class SliderContextItem: ContextMenuCustomItem { + private let minValue: CGFloat + private let maxValue: CGFloat + private let value: CGFloat + private let valueChanged: (CGFloat, Bool) -> Void + + public init(minValue: CGFloat, maxValue: CGFloat, value: CGFloat, valueChanged: @escaping (CGFloat, Bool) -> Void) { + self.minValue = minValue + self.maxValue = maxValue + self.value = value + self.valueChanged = valueChanged + } + + public func node(presentationData: PresentationData, getController: @escaping () -> ContextControllerProtocol?, actionSelected: @escaping (ContextMenuActionResult) -> Void) -> ContextMenuCustomNode { + return SliderContextItemNode(presentationData: presentationData, getController: getController, minValue: self.minValue, maxValue: self.maxValue, value: self.value, valueChanged: self.valueChanged) + } +} + +private let textFont = Font.regular(17.0) + +private final class SliderContextItemNode: ASDisplayNode, ContextMenuCustomNode { + private var presentationData: PresentationData + + private let backgroundTextNode: ImmediateTextNode + + private let foregroundNode: ASDisplayNode + private let foregroundTextNode: ImmediateTextNode + + let minValue: CGFloat + let maxValue: CGFloat + var value: CGFloat = 1.0 { + didSet { + self.updateValue() + } + } + + private let valueChanged: (CGFloat, Bool) -> Void + + private let hapticFeedback = HapticFeedback() + + init(presentationData: PresentationData, getController: @escaping () -> ContextControllerProtocol?, minValue: CGFloat, maxValue: CGFloat, value: CGFloat, valueChanged: @escaping (CGFloat, Bool) -> Void) { + self.presentationData = presentationData + self.minValue = minValue + self.maxValue = maxValue + self.value = value + self.valueChanged = valueChanged + + self.backgroundTextNode = ImmediateTextNode() + self.backgroundTextNode.isAccessibilityElement = false + self.backgroundTextNode.isUserInteractionEnabled = false + self.backgroundTextNode.displaysAsynchronously = false + self.backgroundTextNode.textAlignment = .left + + self.foregroundNode = ASDisplayNode() + self.foregroundNode.clipsToBounds = true + self.foregroundNode.isAccessibilityElement = false + self.foregroundNode.backgroundColor = UIColor(rgb: 0xffffff) + self.foregroundNode.isUserInteractionEnabled = false + + self.foregroundTextNode = ImmediateTextNode() + self.foregroundTextNode.isAccessibilityElement = false + self.foregroundTextNode.isUserInteractionEnabled = false + self.foregroundTextNode.displaysAsynchronously = false + self.foregroundTextNode.textAlignment = .left + + super.init() + + self.isUserInteractionEnabled = true + + self.addSubnode(self.backgroundTextNode) + self.addSubnode(self.foregroundNode) + self.foregroundNode.addSubnode(self.foregroundTextNode) + } + + override func didLoad() { + super.didLoad() + + let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:))) + self.view.addGestureRecognizer(panGestureRecognizer) + + let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:))) + self.view.addGestureRecognizer(tapGestureRecognizer) + } + + func updateTheme(presentationData: PresentationData) { + self.presentationData = presentationData + self.updateValue() + } + + private func updateValue(transition: ContainedViewLayoutTransition = .immediate) { + let width = self.frame.width + + let range = self.maxValue - self.minValue + let value = (self.value - self.minValue) / range + transition.updateFrameAdditive(node: self.foregroundNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: value * width, height: self.frame.height))) + + var stringValue = String(format: "%.1fx", self.value) + if stringValue.hasSuffix(".0x") { + stringValue = stringValue.replacingOccurrences(of: ".0x", with: "x") + } + self.backgroundTextNode.attributedText = NSAttributedString(string: stringValue, font: textFont, textColor: UIColor(rgb: 0xffffff)) + self.foregroundTextNode.attributedText = NSAttributedString(string: stringValue, font: textFont, textColor: UIColor(rgb: 0x000000)) + + let _ = self.backgroundTextNode.updateLayout(CGSize(width: 70.0, height: .greatestFiniteMagnitude)) + let _ = self.foregroundTextNode.updateLayout(CGSize(width: 70.0, height: .greatestFiniteMagnitude)) + } + + func updateLayout(constrainedWidth: CGFloat, constrainedHeight: CGFloat) -> (CGSize, (CGSize, ContainedViewLayoutTransition) -> Void) { + let valueWidth: CGFloat = 70.0 + let height: CGFloat = 45.0 + + var textSize = self.backgroundTextNode.updateLayout(CGSize(width: valueWidth, height: .greatestFiniteMagnitude)) + textSize.width = valueWidth + + return (CGSize(width: height * 3.0, height: height), { size, transition in + let leftInset: CGFloat = 17.0 + + let textFrame = CGRect(origin: CGPoint(x: leftInset, y: floor((size.height - textSize.height) / 2.0)), size: textSize) + transition.updateFrameAdditive(node: self.backgroundTextNode, frame: textFrame) + transition.updateFrameAdditive(node: self.foregroundTextNode, frame: textFrame) + + self.updateValue(transition: transition) + }) + } + + @objc private func panGesture(_ gestureRecognizer: UIPanGestureRecognizer) { + let range = self.maxValue - self.minValue + switch gestureRecognizer.state { + case .began: + break + case .changed: + let previousValue = self.value + + let translation: CGFloat = gestureRecognizer.translation(in: gestureRecognizer.view).x + let delta = translation / self.bounds.width * range + self.value = max(self.minValue, min(self.maxValue, self.value + delta)) + gestureRecognizer.setTranslation(CGPoint(), in: gestureRecognizer.view) + + if self.value == 2.0 && previousValue != 2.0 { + self.hapticFeedback.impact(.soft) + } else if self.value == 1.0 && previousValue != 1.0 { + self.hapticFeedback.impact(.soft) + } else if self.value == 2.5 && previousValue != 2.5 { + self.hapticFeedback.impact(.soft) + } else if self.value == 0.05 && previousValue != 0.05 { + self.hapticFeedback.impact(.soft) + } + if abs(previousValue - self.value) >= 0.001 { + self.valueChanged(self.value, false) + } + case .ended: + let translation: CGFloat = gestureRecognizer.translation(in: gestureRecognizer.view).x + let delta = translation / self.bounds.width * range + self.value = max(self.minValue, min(self.maxValue, self.value + delta)) + self.valueChanged(self.value, true) + default: + break + } + } + + @objc private func tapGesture(_ gestureRecognizer: UITapGestureRecognizer) { + let range = self.maxValue - self.minValue + let location = gestureRecognizer.location(in: gestureRecognizer.view) + self.value = max(self.minValue, min(self.maxValue, location.x / range)) + self.valueChanged(self.value, true) + } + + func canBeHighlighted() -> Bool { + return false + } + + func updateIsHighlighted(isHighlighted: Bool) { + } + + func performAction() { + } +} diff --git a/submodules/TelegramUI/Resources/Animations/anim_voice1_5x.json b/submodules/TelegramUI/Resources/Animations/anim_voice1_5x.json new file mode 100644 index 0000000000..5ebc2935b4 --- /dev/null +++ b/submodules/TelegramUI/Resources/Animations/anim_voice1_5x.json @@ -0,0 +1 @@ +{"v":"5.10.1","fr":60,"ip":0,"op":75,"w":512,"h":512,"nm":"1xto15","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[11,-240,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[11,-244,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[11,-258,0],"to":[0,0,0],"ti":[1.667,-3.167,0]},{"i":{"x":0.517,"y":0.697},"o":{"x":0.167,"y":0.167},"t":17,"s":[11,-246,0],"to":[-0.989,1.88,0],"ti":[2.756,-4.755,0]},{"i":{"x":0.57,"y":1},"o":{"x":0.243,"y":1},"t":33,"s":[2.977,-229.433,0],"to":[-1.887,3.255,0],"ti":[-1.084,-0.474,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":55,"s":[1,-227,0],"to":[2.667,1.167,0],"ti":[-4.333,2,0]},{"t":68,"s":[27,-239,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-134,120],[115,119]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":29,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-134,120],[115,119]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":29,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":55,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":65,"s":[3]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":70,"s":[-1]},{"t":74,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[199,388,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":7,"s":[199,280,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":13,"s":[199,306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":18,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":25,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":32,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":39,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":46,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":53,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[199,306,0]}],"ix":2,"l":2},"a":{"a":0,"k":[50,50,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"t":9,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Body 2","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":2,"s":[10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":13,"s":[-14]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[-10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":27,"s":[-13]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":34,"s":[-10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":41,"s":[-12]},{"i":{"x":[0.506],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":48,"s":[-9]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":55,"s":[-13]},{"t":65,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.2,"y":0},"t":2,"s":[-82.367,118.339,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[-95.349,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":41,"s":[62.651,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":0.7},"o":{"x":0.01,"y":0.01},"t":62,"s":[-41.349,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"t":66,"s":[-41.349,134.878,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-148.349,134.878,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[-24.6,0],[27.466,18.448],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.144,3.193],[-10.795,1.146],[-9.238,0],[-3.164,-4.027],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[-6.091,-4.091],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.552,-2.377],[8.238,-0.854],[16.865,0],[10.352,13.178],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[51.053,-111.701],[101.415,-128.294],[59.252,-123.525],[25.739,-120.89],[32.729,-122.612],[30.112,-115.221],[91.342,-115.221],[91.329,-126.251],[75.015,-127.005],[7.017,-127.005],[-10.399,-120.772],[-9.62,-116.714],[-9.727,-115.425],[9.119,-113.875],[30.246,-120.317],[56.361,-121.442],[74.008,-123.067],[47.46,-122.918],[18.843,-120.242],[4.664,-128.299],[-7.075,-122.368],[-2.701,-119.015]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-24.6,0],[27.466,18.448],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.144,3.193],[-10.795,1.146],[-9.238,0],[-3.164,-4.027],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[-6.091,-4.091],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.552,-2.377],[8.238,-0.854],[16.865,0],[10.352,13.178],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[47.059,-134.351],[97.421,-150.945],[55.258,-146.175],[21.745,-143.541],[28.735,-145.263],[26.118,-137.871],[87.348,-137.871],[87.335,-148.901],[71.021,-149.656],[3.023,-149.656],[-14.393,-143.423],[-13.614,-139.365],[-13.721,-138.076],[5.125,-136.526],[26.252,-142.968],[52.367,-144.093],[70.014,-145.717],[43.466,-145.569],[14.85,-142.893],[0.67,-150.95],[-11.069,-145.018],[-6.695,-141.665]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-24.6,0],[0.199,19.559],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.437]],"o":[[35.342,0],[-0.141,-13.794],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[51.558,-89.845],[107.994,-136.319],[48.678,-131.256],[37.42,-135.965],[14.381,-134.236],[16.022,-128.607],[79.861,-126.497],[83.483,-134.866],[78.435,-134.162],[33.31,-140.393],[1.59,-135.775],[-6.293,-133.445],[-6.4,-132.156],[9.645,-126.62],[34.88,-126.131],[58.484,-128.973],[78.951,-137.198],[51.558,-115.627],[22.877,-133.566],[8.697,-141.623],[-4.838,-128.41],[-2.26,-117.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[-24.6,0],[0,33.086],[29.649,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[48.437,-65.19],[108.378,-120.62],[55.77,-125.642],[34.084,-123.355],[21.129,-125.526],[21.891,-123.418],[83.122,-123.418],[95.083,-122.84],[95.202,-131.33],[27.204,-131.33],[-5.257,-125.24],[-7.024,-124.286],[-7.132,-122.997],[13.247,-118.673],[31.251,-118.864],[53.443,-117.994],[77.441,-119.868],[48.437,-90.971],[19.755,-108.911],[5.575,-116.967],[-7.96,-103.755],[-5.382,-93.12]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[-24.6,0],[0,33.086],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[48.159,-31.34],[108.1,-86.77],[58.304,-122.619],[22.592,-120.93],[21.948,-120.93],[15.974,-120.048],[77.204,-120.048],[97.931,-115.445],[84.611,-128.336],[16.613,-128.336],[-3.797,-109.967],[-6.089,-114.592],[-6.197,-113.303],[9.057,-97.19],[25.815,-104.709],[48.266,-113.948],[77.163,-86.018],[48.159,-57.121],[19.477,-75.061],[5.298,-83.118],[-8.238,-69.905],[-5.659,-59.27]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[-24.6,0],[0,33.086],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[51.505,4.78],[111.447,-50.65],[60.744,-101.03],[25.939,-84.81],[25.294,-84.81],[29.998,-113.364],[88.723,-118.485],[100.173,-107.758],[86.852,-120.649],[19.869,-113.286],[-0.956,-114.925],[-2.743,-78.472],[-2.85,-77.183],[12.404,-61.069],[29.162,-68.589],[51.613,-77.827],[80.509,-49.898],[51.505,-21.001],[22.824,-38.941],[8.644,-46.997],[-4.891,-33.784],[-2.313,-23.15]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[-24.6,0],[0,33.086],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[50.596,33.287],[110.538,-22.143],[59.835,-72.524],[25.03,-56.303],[24.385,-56.303],[28.038,-99.379],[89.268,-99.379],[102.589,-112.27],[89.268,-125.16],[21.27,-125.16],[0.86,-106.791],[-3.652,-49.965],[-3.759,-48.676],[11.495,-32.563],[28.253,-40.082],[50.704,-49.321],[79.6,-21.391],[50.596,7.506],[21.915,-10.434],[7.735,-18.491],[-5.8,-5.278],[-3.222,5.357]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[-24.6,0],[0,33.086],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[50.483,74.843],[110.425,19.413],[59.722,-30.968],[24.917,-14.747],[24.272,-14.747],[27.925,-57.823],[89.155,-57.823],[102.476,-70.714],[89.155,-83.604],[21.157,-83.604],[0.747,-65.235],[-3.765,-8.409],[-3.872,-7.12],[11.382,8.993],[28.14,1.474],[50.591,-7.765],[79.487,20.165],[50.483,49.062],[21.802,31.122],[7.622,23.065],[-5.913,36.278],[-3.335,46.913]],"c":true}]},{"i":{"x":0.19,"y":1},"o":{"x":0.81,"y":0},"t":45,"s":[{"i":[[-24.6,0],[0,33.086],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[57.91,80.335],[117.852,24.906],[67.149,-25.475],[32.344,-9.255],[31.699,-9.255],[35.352,-52.331],[96.582,-52.331],[109.903,-65.221],[96.582,-78.112],[28.584,-78.112],[8.174,-59.743],[3.662,-2.917],[3.555,-1.628],[18.809,14.486],[35.567,6.966],[58.018,-2.272],[86.914,25.658],[57.91,54.554],[29.229,36.615],[15.049,28.558],[1.514,41.771],[4.092,52.406]],"c":true}]},{"t":68,"s":[{"i":[[-24.6,0],[0,33.086],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[83.5,84.938],[143.441,29.508],[92.738,-20.873],[57.933,-4.652],[57.289,-4.652],[60.941,-47.729],[122.172,-47.729],[135.492,-60.619],[122.172,-73.51],[54.174,-73.51],[33.764,-55.141],[29.252,1.686],[29.144,2.975],[44.398,19.088],[61.156,11.568],[83.607,2.33],[112.504,30.26],[83.5,59.156],[54.818,41.217],[40.639,33.16],[27.103,46.373],[29.682,57.008]],"c":true}]}],"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-0.007,0],[0,-0.049],[0.007,0],[0,0.05]],"o":[[0.007,0],[0,0.05],[-0.007,0],[0,-0.049]],"v":[[-19.862,63.58],[-19.851,63.668],[-19.862,63.757],[-19.874,63.668]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":30,"s":[{"i":[[-9.668,0],[0,9.561],[9.561,0],[0,-9.668]],"o":[[9.561,0],[0,-9.668],[-9.668,0],[0,9.561]],"v":[[-31.482,77.279],[-14.187,59.984],[-31.482,42.689],[-48.777,59.984]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":45,"s":[{"i":[[-9.668,0],[0,9.561],[9.561,0],[0,-9.668]],"o":[[9.561,0],[0,-9.668],[-9.668,0],[0,9.561]],"v":[[-31.482,77.279],[-14.187,59.984],[-31.482,42.689],[-48.777,59.984]],"c":true}]},{"t":63,"s":[{"i":[[-9.668,0],[0,9.561],[9.561,0],[0,-9.668]],"o":[[9.561,0],[0,-9.668],[-9.668,0],[0,9.561]],"v":[[-16.435,83.489],[0.86,66.194],[-16.435,48.899],[-33.729,66.194]],"c":true}]}],"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":2,"s":[{"i":[[2.918,-3.404],[5.234,-5.12],[0,0],[1.578,-3.059],[-8.515,-0.332],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.717,-3.187],[-10.267,0.568],[-0.621,7.097],[0,0],[0,0],[0,0],[0,0],[0.924,6.601]],"o":[[-1.396,1.629],[-10.963,10.723],[0,0],[-2.424,4.699],[9.44,0.368],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.337,-0.351],[0.289,-3.306],[0,0],[0,0],[0,0],[0,0],[-2.072,-14.802]],"v":[[-32.087,-67.908],[-43.056,-56.827],[-68.908,-31.93],[-74.329,-23.551],[-64.105,-6.331],[-49.974,-10.777],[-38.372,-23.327],[-37.981,-21.666],[-38.367,14.331],[-38.67,52.382],[-37.9,65.219],[-34.837,81.422],[-22.077,85.239],[-9.867,74.134],[-9.922,66.74],[-9.943,51.172],[-9.94,28.221],[-10.147,-28.672],[-10.934,-60.083]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-0.699,7.737],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.326,-3.604],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-87.804,-94.075],[-100.158,-81.994],[-129.274,-54.851],[-135.38,-45.716],[-123.864,-26.943],[-107.949,-31.79],[-94.882,-45.472],[-94.442,-43.661],[-94.877,-4.417],[-95.218,37.067],[-94.351,51.062],[-90.901,68.727],[-76.53,72.888],[-62.779,60.781],[-62.84,52.72],[-62.864,35.747],[-62.861,10.726],[-63.094,-51.299],[-63.979,-85.543]],"c":true}]},{"t":68,"s":[{"i":[[7.804,-3.019],[7.02,-4.077],[0,0],[1.208,-3.503],[-9.593,-0.283],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-1.033,7.594],[0,0],[0,0],[0,0],[0,0],[1.063,8.076]],"o":[[-2.212,0.856],[-13.279,7.713],[0,0],[-1.893,5.488],[6.551,0.193],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.488,-3.586],[0,0],[0,0],[0,0],[0,0],[-1.458,-11.082]],"v":[[-95.929,-73.606],[-110.471,-65.588],[-137.587,-47.507],[-142.583,-40.122],[-133.551,-24.693],[-119.394,-30.735],[-100.468,-42.972],[-100.458,-41.161],[-99.877,14.958],[-99.968,41.567],[-100.351,62.312],[-97.151,78.102],[-82.78,84.138],[-68.717,72.031],[-68.465,63.97],[-68.489,47.31],[-68.486,32.288],[-68.188,-28.299],[-69.042,-64.293]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":2,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[137.788,-73.187],[124.781,-65.383],[90.963,-16.047],[90.156,-16.047],[57.415,-64.306],[42.973,-73.187],[26.737,-58.117],[31.401,-45.828],[68.269,4.405],[68.269,5.213],[30.146,58.406],[25.84,69.977],[41,83.881],[54.455,76.077],[88.003,28.445],[88.811,28.445],[122.897,75.987],[136.801,83.971],[152.14,69.529],[147.924,57.868],[109.352,5.841],[109.352,5.123],[149.09,-47.98],[153.306,-59.462]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[7.908,-0.143],[3.384,-6.028],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[0.079,4.596]],"o":[[-5.782,0.104],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[-0.059,-8.411]],"v":[[89.471,-101.108],[77.287,-92.378],[46.149,-38.016],[45.384,-38.003],[13.445,-90.052],[-0.412,-99.486],[-15.522,-82.781],[-10.871,-69.463],[25.017,-15.333],[25.032,-14.453],[-10.115,44.187],[-13.981,56.875],[0.65,71.773],[13.26,63.036],[44.174,10.537],[44.939,10.523],[78.14,61.767],[91.47,70.233],[105.742,54.227],[101.527,41.586],[63.99,-14.471],[63.977,-15.253],[100.656,-73.823],[104.439,-86.412]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[7.908,-0.143],[3.384,-6.028],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[0.079,4.596]],"o":[[-5.782,0.104],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[-0.059,-8.411]],"v":[[91.511,-56.339],[79.327,-47.609],[48.189,6.753],[47.424,6.766],[15.485,-45.283],[1.628,-54.717],[-13.482,-38.012],[-8.831,-24.694],[27.057,29.436],[27.072,30.316],[-8.075,88.956],[-11.941,101.644],[2.69,116.542],[15.3,107.805],[46.214,55.306],[46.979,55.292],[80.18,106.536],[93.51,115.002],[107.782,98.996],[103.567,86.355],[66.03,30.298],[66.017,29.516],[102.696,-29.054],[106.479,-41.643]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[{"i":[[7.908,-0.143],[3.384,-6.028],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[0.079,4.596]],"o":[[-5.782,0.104],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[-0.059,-8.411]],"v":[[94.101,0.512],[81.917,9.242],[50.779,63.604],[50.014,63.617],[18.075,11.568],[4.218,2.134],[-10.892,18.839],[-6.241,32.157],[29.647,86.287],[29.662,87.167],[12.694,111.517],[10.516,116.898],[25.147,131.796],[37.757,123.059],[48.804,112.157],[49.569,112.143],[56.54,121.411],[69.87,129.877],[84.142,113.871],[83.756,107.566],[68.62,87.149],[68.607,86.367],[105.286,27.797],[109.069,15.208]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[7.908,-0.143],[3.384,-6.028],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[0.079,4.596]],"o":[[-5.782,0.104],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[-0.059,-8.411]],"v":[[96.575,54.801],[84.391,63.531],[53.253,117.893],[52.488,117.906],[20.549,65.857],[6.692,56.423],[-8.418,73.128],[-3.767,86.446],[16.693,109.297],[16.708,110.177],[10.374,120.587],[8.57,121.581],[19.76,130.795],[35.811,127.742],[50.222,125.643],[50.987,125.629],[80.126,127.924],[94.469,127.049],[107.728,120.384],[101.451,119.437],[85.21,115.368],[85.197,114.586],[107.76,82.086],[111.543,69.497]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[9.39,2.067],[5.643,-4.721],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[-2.75,5.262]],"o":[[-5.648,-1.243],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[3.109,-7.595]],"v":[[101.179,83.803],[82.716,90.779],[50.874,114.312],[44.703,115.749],[21.817,93.688],[7.96,84.254],[-7.15,100.959],[1.108,112.189],[24.076,111.568],[24.091,112.448],[8.724,121.279],[7.965,118.098],[21.359,127.941],[34.41,128.163],[51.698,126.558],[52.463,126.544],[90.031,122.725],[103.867,126.521],[110.937,124.001],[110.084,119.403],[77.821,115.034],[96.15,116.866],[107.348,105.735],[112.811,97.328]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[8.649,0.962],[4.513,-5.374],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[-1.336,4.929]],"o":[[-5.715,-0.57],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[1.525,-8.003]],"v":[[100.145,97.133],[84.821,104.987],[49.685,112.522],[40.811,114.67],[22.451,107.604],[8.594,98.17],[-6.516,114.875],[2.498,114.914],[27.767,112.703],[27.782,113.583],[7.899,121.625],[7.663,116.357],[22.159,126.513],[33.709,128.374],[52.437,127.016],[53.202,127.002],[94.984,120.126],[108.567,126.257],[112.541,125.81],[114.4,119.387],[74.126,114.868],[83.284,115.392],[107.143,117.559],[113.445,111.244]],"c":true}]},{"t":42,"s":[{"i":[[7.908,-0.143],[3.384,-6.028],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[0.079,4.596]],"o":[[-5.782,0.104],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[-0.059,-8.411]],"v":[[99.111,110.464],[86.927,119.194],[48.496,110.732],[36.919,113.592],[23.085,121.52],[9.228,112.086],[-5.882,128.791],[3.887,117.638],[31.459,113.839],[31.474,114.719],[7.075,121.971],[7.361,114.615],[22.958,125.086],[33.009,128.584],[53.175,127.473],[53.94,127.46],[99.936,117.527],[113.266,125.993],[114.145,127.619],[118.717,119.37],[70.432,114.701],[70.419,113.919],[106.937,129.384],[114.079,125.16]],"c":true}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,-30.199],[0,0],[27.483,0],[0,0],[0,30.199],[0,0],[-27.483,0]],"o":[[27.483,0],[0,0],[0,30.199],[0,0],[-27.483,0],[0,0],[0,-30.199],[0,0]],"v":[[126.631,-155.306],[176.396,-100.624],[176.396,81.711],[126.631,136.393],[-138.928,136.393],[-188.693,81.711],[-188.693,-100.624],[-138.928,-155.306]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":51,"s":[{"i":[[0,0],[0,-26.886],[0,0],[26.444,0],[0,0],[0,26.886],[0,0],[-26.444,0]],"o":[[26.444,0],[0,0],[0,26.886],[0,0],[-26.444,0],[0,0],[0,-26.886],[0,0]],"v":[[114.899,-124.335],[162.782,-75.651],[162.782,86.683],[114.899,135.367],[-140.619,135.367],[-188.502,86.683],[-188.502,-75.651],[-140.619,-124.335]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":63,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"t":68,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":7,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Lines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[70,277.55,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":41,"s":[130,267.55,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[178,259.55,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-186,-0.45,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-208,100.1]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":20,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-174,99.6]],"c":false}]},{"t":34,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-269.667,101.3],[-155,98.1]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[38]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":35,"s":[67]},{"t":42,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":33,"s":[100]},{"t":41,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-204],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-174,99.6]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-299.667,101.8],[-174,99.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":26,"s":[72]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":33,"s":[15]},{"t":40,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":31,"s":[100]},{"t":39,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-100],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.238,87.8],[-134.571,87.6]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":7,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.965,68.8],[-135.299,68.6]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-271.153,77.8],[-135.486,77.6]],"c":false}]},{"t":15,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-269.76,95.8],[-134.094,95.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":15,"s":[19]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":23,"s":[67]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":30,"s":[0]},{"t":37,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":28,"s":[100]},{"t":36,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":180,"st":0,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/submodules/TelegramUI/Resources/Animations/anim_voicespeedstop.json b/submodules/TelegramUI/Resources/Animations/anim_voice1x.json similarity index 100% rename from submodules/TelegramUI/Resources/Animations/anim_voicespeedstop.json rename to submodules/TelegramUI/Resources/Animations/anim_voice1x.json diff --git a/submodules/TelegramUI/Resources/Animations/anim_voice2x.json b/submodules/TelegramUI/Resources/Animations/anim_voice2x.json new file mode 100644 index 0000000000..2913491a5f --- /dev/null +++ b/submodules/TelegramUI/Resources/Animations/anim_voice2x.json @@ -0,0 +1 @@ +{"v":"5.10.1","fr":60,"ip":0,"op":75,"w":512,"h":512,"nm":"15to2x","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-0.5,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[8.467,-240.582,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[8.432,-244.582,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[8.31,-258.582,0],"to":[0,0,0],"ti":[1.639,-3.181,0]},{"i":{"x":0.517,"y":0.697},"o":{"x":0.167,"y":0.167},"t":17,"s":[8.414,-246.582,0],"to":[-0.973,1.888,0],"ti":[2.714,-4.779,0]},{"i":{"x":0.57,"y":1},"o":{"x":0.243,"y":1},"t":33,"s":[0.536,-229.946,0],"to":[-1.858,3.272,0],"ti":[-1.088,-0.465,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":55,"s":[-1.419,-227.496,0],"to":[2.677,1.143,0],"ti":[-4.316,2.038,0]},{"t":68,"s":[24.475,-239.722,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-134,120],[115,119]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":29,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-0.5,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[-0.438,-0.496,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[14.562,-0.496,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35,"s":[-0.438,-0.496,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-134,120],[115,119]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":29,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":55,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":65,"s":[3]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":70,"s":[-1]},{"t":74,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[199,388,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":7,"s":[199,280,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":13,"s":[199,306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":18,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":25,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":32,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":39,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":46,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":53,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[199,306,0]}],"ix":2,"l":2},"a":{"a":0,"k":[50,50,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"t":9,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Body 3","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":2,"s":[10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":13,"s":[-14]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[-10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":27,"s":[-13]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":34,"s":[-10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":41,"s":[-12]},{"i":{"x":[0.506],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":48,"s":[-9]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":55,"s":[-13]},{"t":65,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.2,"y":0},"t":2,"s":[-82.367,118.339,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[-95.349,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":41,"s":[62.651,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":0.7},"o":{"x":0.01,"y":0.01},"t":62,"s":[-41.349,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"t":66,"s":[-41.349,134.878,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-148.349,134.878,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":5,"s":[{"i":[[24.106,0],[7.475,-14.494],[0.623,-2.03],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[9.439,-10.305],[4.674,-4.475],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[-5.427,7.72],[0,9.974],[2.678,5.514]],"o":[[-25.426,0],[-1.017,1.971],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,8.309],[-3.096,3.379],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[11.648,-10.98],[6.233,-8.866],[0.046,-6.749],[-7.717,-15.886]],"v":[[-69.915,-119.144],[-81.071,-127.952],[-83.534,-121.938],[-84.7,-115.031],[-106.53,-119.012],[-94.632,-119.117],[-82.608,-121.454],[-69.076,-118.238],[-84.492,-117.888],[-98.676,-122.821],[-114.673,-124.035],[-130.911,-123.81],[-115.841,-110.175],[-31.253,-110.175],[-17.977,-122.913],[-32.684,-127.764],[-86.867,-124.864],[-57.984,-119.64],[-50.091,-118.062],[-38.039,-120.391],[-32.204,-120.47]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[24.106,0],[7.475,-14.494],[0.623,-2.03],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[9.439,-10.305],[4.674,-4.475],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[-5.427,7.72],[0,9.974],[2.678,5.514]],"o":[[-25.426,0],[-1.017,1.971],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,8.309],[-3.096,3.379],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[11.648,-10.98],[6.233,-8.866],[0.046,-6.749],[-7.717,-15.886]],"v":[[-70.67,-139.13],[-81.825,-147.938],[-84.288,-141.924],[-85.454,-135.017],[-107.284,-138.997],[-95.386,-139.103],[-83.362,-141.44],[-69.831,-138.224],[-85.247,-137.874],[-99.43,-142.806],[-115.428,-144.021],[-131.666,-143.795],[-116.596,-130.16],[-32.008,-130.16],[-18.732,-142.898],[-33.438,-147.749],[-87.622,-144.85],[-58.738,-139.626],[-50.846,-138.048],[-38.794,-140.377],[-32.958,-140.456]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[24.106,0],[7.475,-14.494],[0.623,-2.03],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[9.439,-10.305],[4.674,-4.475],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[-5.427,7.72],[0,9.974],[2.678,5.514]],"o":[[-25.426,0],[-1.017,1.971],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,8.309],[-3.096,3.379],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[11.648,-10.98],[6.233,-8.866],[0.046,-6.749],[-7.717,-15.886]],"v":[[-80.188,-129.175],[-111.827,-130.849],[-126.024,-132.68],[-127.19,-125.773],[-113.556,-112.766],[-99.383,-122.095],[-75.732,-126.734],[-54.056,-125.302],[-72.744,-127.674],[-82.073,-127.787],[-121.792,-112.18],[-130.583,-96.213],[-115.513,-82.578],[-30.925,-82.578],[-17.649,-95.316],[-30.925,-108.054],[-88.513,-108.054],[-41.605,-119.958],[-29.358,-132.237],[-27.752,-118.689],[-33.395,-128.821]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[24.106,0],[7.475,-14.494],[0.623,-2.03],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[9.439,-10.305],[4.674,-4.475],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[-5.427,7.72],[0,9.974],[2.678,5.514]],"o":[[-25.426,0],[-1.017,1.971],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,8.309],[-3.096,3.379],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[11.648,-10.98],[6.233,-8.866],[0.046,-6.749],[-7.717,-15.886]],"v":[[-76.632,-120.018],[-117.879,-122.928],[-121.985,-125.465],[-128.336,-127.886],[-114.702,-114.879],[-100.529,-124.208],[-76.625,-120.084],[-50.834,-120.979],[-63.02,-96.143],[-74.605,-84.47],[-120.173,-40.965],[-128.964,-24.998],[-113.894,-11.363],[-29.306,-11.363],[-16.03,-24.101],[-29.306,-36.839],[-86.894,-36.839],[-53.883,-69.221],[-28.618,-96.317],[-19.797,-123.132],[-28.663,-119.635]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[24.106,0],[7.475,-14.494],[0.623,-2.03],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[9.439,-10.305],[4.674,-4.475],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[-5.427,7.72],[0,9.974],[2.678,5.514]],"o":[[-25.426,0],[-1.017,1.971],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,8.309],[-3.096,3.379],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[11.648,-10.98],[6.233,-8.866],[0.046,-6.749],[-7.717,-15.886]],"v":[[-73.199,-118.253],[-123.829,-102.213],[-126.292,-96.199],[-127.458,-89.292],[-113.824,-76.285],[-99.651,-85.614],[-73.368,-104.003],[-49.956,-82.385],[-62.142,-57.549],[-73.727,-45.876],[-119.295,-2.371],[-128.086,13.596],[-113.016,27.231],[-28.428,27.231],[-15.152,14.493],[-28.428,1.755],[-86.016,1.755],[-53.006,-30.627],[-27.741,-57.723],[-18.919,-84.538],[-22.964,-103.019]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[24.106,0],[7.475,-14.494],[0.623,-2.03],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[9.439,-10.305],[4.674,-4.475],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[-5.427,7.72],[0,9.974],[2.678,5.514]],"o":[[-25.426,0],[-1.017,1.971],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,8.309],[-3.096,3.379],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[11.648,-10.98],[6.233,-8.866],[0.046,-6.749],[-7.717,-15.886]],"v":[[-72.34,-99.528],[-123.16,-72.801],[-125.623,-66.787],[-126.789,-59.88],[-113.155,-46.873],[-98.982,-56.202],[-72.699,-74.591],[-49.287,-52.973],[-61.473,-28.137],[-73.058,-16.464],[-118.626,27.041],[-127.417,43.008],[-112.347,56.643],[-27.759,56.643],[-14.483,43.905],[-27.759,31.167],[-85.347,31.167],[-52.337,-1.215],[-27.072,-28.311],[-18.25,-55.126],[-22.295,-73.607]],"c":true}]},{"t":45,"s":[{"i":[[24.106,0],[7.475,-14.494],[0.623,-2.03],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[9.439,-10.305],[4.674,-4.475],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[-5.427,7.72],[0,9.974],[2.678,5.514]],"o":[[-25.426,0],[-1.017,1.971],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,8.309],[-3.096,3.379],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[11.648,-10.98],[6.233,-8.866],[0.046,-6.749],[-7.717,-15.886]],"v":[[-71.806,-76.067],[-122.626,-49.34],[-125.089,-43.326],[-126.255,-36.419],[-112.621,-23.412],[-98.448,-32.741],[-72.165,-51.13],[-48.753,-29.512],[-60.939,-4.676],[-72.524,6.997],[-118.092,50.502],[-126.883,66.469],[-111.813,80.104],[-27.225,80.104],[-13.949,67.366],[-27.225,54.628],[-84.813,54.628],[-51.803,22.246],[-26.538,-4.85],[-17.716,-31.665],[-21.761,-50.146]],"c":true}]}],"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":5,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[83.558,-136.441],[70.552,-128.637],[77.57,-127.936],[60.749,-129.826],[47.695,-126.366],[33.253,-135.246],[17.017,-120.176],[21.681,-107.887],[21.953,-126.42],[21.953,-125.613],[6.545,-137.37],[2.24,-125.798],[17.399,-111.894],[30.855,-119.699],[81.063,-113.781],[81.87,-113.781],[99.297,-119.788],[113.201,-111.805],[128.54,-126.247],[124.324,-137.908],[102.412,-136.386],[102.412,-137.104],[94.861,-111.235],[99.077,-122.717]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[82.949,-152.554],[69.943,-144.75],[76.961,-144.05],[60.141,-145.94],[47.087,-142.48],[32.645,-151.36],[16.409,-136.29],[21.073,-124.001],[21.344,-142.534],[21.344,-141.727],[5.936,-153.483],[1.631,-141.911],[16.79,-128.007],[30.246,-135.812],[80.455,-129.895],[81.262,-129.895],[98.688,-135.901],[112.592,-127.918],[127.931,-142.36],[123.715,-154.021],[101.804,-152.5],[101.804,-153.218],[94.252,-127.348],[98.468,-138.83]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[96.092,-135.159],[84.308,-133.739],[79.324,-131.319],[52.856,-127.576],[24.005,-132.329],[8.436,-135.316],[-6.673,-126.139],[-2.009,-113.85],[30.621,-137.226],[30.621,-136.419],[7.019,-105.901],[2.714,-94.329],[17.873,-80.425],[31.329,-88.23],[64.877,-135.861],[65.684,-135.861],[99.771,-88.319],[113.675,-80.336],[129.014,-94.778],[124.798,-106.439],[102.579,-137.518],[102.579,-138.236],[108.617,-116.337],[112.833,-127.819]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[93.249,-119.629],[81.457,-124.356],[69.456,-109.138],[68.649,-109.138],[58.938,-124.703],[44.354,-125.936],[28.26,-118.513],[32.924,-106.225],[46.762,-88.686],[46.762,-87.879],[8.638,-34.686],[4.333,-23.114],[19.492,-9.21],[32.949,-17.015],[66.497,-64.646],[67.304,-64.646],[101.39,-17.104],[115.294,-9.121],[130.633,-23.563],[126.417,-35.224],[87.845,-87.251],[87.845,-87.969],[105.766,-106.954],[109.982,-118.436]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[117.158,-127.684],[104.152,-119.88],[70.334,-70.544],[69.527,-70.544],[36.786,-118.804],[22.344,-127.684],[6.108,-112.614],[10.772,-100.325],[47.64,-50.092],[47.64,-49.285],[9.516,3.908],[5.211,15.48],[20.37,29.384],[33.826,21.579],[67.374,-26.052],[68.181,-26.052],[102.268,21.49],[116.172,29.473],[131.511,15.031],[127.295,3.37],[88.723,-48.657],[88.723,-49.375],[128.461,-102.478],[132.677,-113.96]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[117.827,-98.272],[104.821,-90.468],[71.003,-41.132],[70.196,-41.132],[37.455,-89.392],[23.013,-98.272],[6.777,-83.202],[11.441,-70.913],[48.309,-20.68],[48.309,-19.873],[10.185,33.32],[5.88,44.892],[21.039,58.796],[34.495,50.991],[68.043,3.36],[68.85,3.36],[102.937,50.902],[116.841,58.885],[132.18,44.443],[127.964,32.782],[89.392,-19.245],[89.392,-19.963],[129.13,-73.066],[133.346,-84.548]],"c":true}]},{"t":45,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[118.361,-74.811],[105.355,-67.007],[71.537,-17.671],[70.73,-17.671],[37.989,-65.931],[23.547,-74.811],[7.311,-59.741],[11.975,-47.452],[48.843,2.781],[48.843,3.588],[10.719,56.781],[6.414,68.353],[21.573,82.257],[35.029,74.452],[68.577,26.821],[69.384,26.821],[103.471,74.363],[117.375,82.346],[132.714,67.904],[128.498,56.243],[89.926,4.216],[89.926,3.498],[129.664,-49.605],[133.88,-61.087]],"c":true}]}],"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[-24.6,0],[0,33.086],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[83.5,84.938],[143.441,29.508],[92.738,-20.873],[57.933,-4.652],[57.289,-4.652],[60.941,-47.729],[122.172,-47.729],[135.492,-60.619],[122.172,-73.51],[54.174,-73.51],[33.764,-55.141],[29.252,1.686],[29.144,2.975],[44.398,19.088],[61.156,11.568],[83.607,2.33],[112.504,30.26],[83.5,59.156],[54.818,41.217],[40.639,33.16],[27.103,46.373],[29.682,57.008]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[-24.6,0],[0,33.086],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[0,-29.541],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[82.14,130.651],[142.081,75.221],[91.378,24.841],[56.574,41.061],[55.929,41.061],[59.581,-2.015],[120.812,-2.015],[134.132,-14.906],[120.812,-27.796],[52.814,-27.796],[32.404,-9.427],[27.892,47.399],[27.784,48.688],[43.038,64.801],[59.796,57.282],[82.247,48.044],[111.144,75.973],[82.14,104.87],[53.458,86.93],[39.279,78.874],[25.743,92.087],[28.322,102.721]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[-24.6,0],[0.15,1.539],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.341,0],[-1.75,-17.914],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[82.061,123.979],[136.72,120.628],[89.532,86.887],[54.728,103.107],[54.083,103.107],[57.736,60.031],[118.966,60.031],[132.286,47.141],[118.966,34.25],[50.968,34.25],[30.558,52.619],[26.046,109.445],[25.939,110.734],[41.193,126.848],[57.95,119.328],[80.402,110.09],[102.518,117.592],[74.249,117.472],[53.11,121.151],[31.57,118.646],[21.368,121.329],[38.668,120.86]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[-24.599,0],[-2.056,16.076],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-1.611,-3.438]],"o":[[35.342,0],[2.065,-16.143],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.866,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[7.734,16.436]],"v":[[75.932,124.526],[131.518,119.266],[88.636,117.003],[56.239,115.593],[55.025,113.431],[56.84,90.147],[118.07,90.147],[131.39,77.257],[118.07,64.366],[50.072,64.366],[29.662,82.735],[27.606,110.703],[27.498,111.992],[29.874,126.18],[62.64,121.496],[80.364,120.209],[100.58,120.018],[77.691,122.098],[58.973,120.033],[39.797,111.443],[34.466,117.176],[35.459,118.285]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[-24.6,0],[0.993,16.176],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-3.795,-0.095]],"o":[[35.342,0],[-1.148,-18.696],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[3.767,0.094]],"v":[[76.405,120.895],[121.932,117.745],[84.694,111.417],[54.232,114.7],[53.587,114.7],[56.202,111.563],[117.433,111.563],[130.753,98.673],[117.433,85.782],[49.435,85.782],[29.025,104.151],[28.661,114.99],[28.554,116.279],[41.312,120.773],[60.865,120.355],[82.806,119.661],[90.994,118.497],[75.632,119.355],[49.903,116.164],[35.723,108.108],[22.188,121.32],[24.766,131.955]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[-24.6,0],[-0.267,33.085],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-3.678,-0.942]],"o":[[35.342,0],[0.179,-22.18],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[9.722,2.49]],"v":[[66.499,109.49],[119.348,116.947],[81.325,113.173],[54.063,120.25],[53.419,120.25],[55.82,124.428],[117.05,124.428],[130.371,111.538],[117.05,98.647],[49.052,98.647],[28.642,117.016],[28.084,121.025],[27.977,122.315],[37.46,126.996],[47.264,118.525],[69.716,109.286],[88.41,117.699],[78.507,118.934],[51.698,124.892],[41.328,108.439],[27.793,121.652],[30.371,132.287]],"c":true}]},{"t":45,"s":[{"i":[[-24.6,0],[-5.387,13.697],[29.648,0],[6.338,-9.99],[0,0],[0,0],[0,0],[0,7.842],[8.057,0],[0,0],[1.074,-13.105],[0,0],[0,-0.43],[-10.635,0],[-6.338,5.908],[-9.238,0],[0,-16.328],[16.865,0],[5.586,11.172],[6.445,0],[0,-8.271],[-2.531,-2.83]],"o":[[35.342,0],[10.812,-27.491],[-15.791,0],[0,0],[0,0],[0,0],[8.164,0],[0,-7.842],[0,0],[-12.568,0],[0,0],[-0.107,0.537],[-0.43,8.701],[7.197,0],[5.479,-5.264],[16.865,0],[0,16.758],[-13.965,0],[-3.652,-5.801],[-8.379,0],[0,3.867],[1.877,2.098]],"v":[[81.651,122.242],[117.32,119.853],[83.158,113.089],[57.455,118.246],[56.811,118.246],[55.648,130.187],[116.879,130.187],[125.761,117.26],[116.879,104.405],[48.881,104.405],[28.471,122.775],[34.806,122.113],[34.699,123.402],[39.813,122.451],[56.571,114.932],[77.882,117.681],[86.383,120.605],[73.781,120.446],[54.697,116.934],[40.517,108.877],[26.982,122.09],[29.56,132.725]],"c":true}]}],"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0},"t":12,"s":[{"i":[[-9.668,0],[0,9.561],[9.561,0],[0,-9.668]],"o":[[9.561,0],[0,-9.668],[-9.668,0],[0,9.561]],"v":[[-16.435,83.489],[0.86,66.194],[-16.435,48.899],[-33.729,66.194]],"c":true}]},{"t":25,"s":[{"i":[[0.018,0],[0,-0.016],[-0.017,0],[0,0.016]],"o":[[-0.017,0],[0,0.016],[0.018,0],[0,-0.016]],"v":[[-16.435,66.164],[-16.466,66.194],[-16.435,66.223],[-16.403,66.194]],"c":true}]}],"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[7.804,-3.019],[7.02,-4.077],[0,0],[1.208,-3.503],[-9.593,-0.283],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-1.033,7.594],[0,0],[0,0],[0,0],[0,0],[1.063,8.076]],"o":[[-2.212,0.856],[-13.279,7.713],[0,0],[-1.893,5.488],[6.551,0.193],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.488,-3.586],[0,0],[0,0],[0,0],[0,0],[-1.458,-11.082]],"v":[[-95.929,-73.606],[-110.471,-65.588],[-137.587,-47.507],[-142.583,-40.122],[-133.551,-24.693],[-119.394,-30.735],[-100.468,-42.972],[-100.458,-41.161],[-99.877,14.958],[-99.968,41.567],[-100.351,62.312],[-97.151,78.102],[-82.78,84.138],[-68.717,72.031],[-68.465,63.97],[-68.489,47.31],[-68.486,32.288],[-68.188,-28.299],[-69.042,-64.293]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[7.804,-3.019],[7.02,-4.077],[0,0],[1.208,-3.503],[-9.593,-0.283],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-1.033,7.594],[0,0],[0,0],[0,0],[0,0],[1.063,8.076]],"o":[[-2.212,0.856],[-13.279,7.713],[0,0],[-1.893,5.488],[6.551,0.193],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.488,-3.586],[0,0],[0,0],[0,0],[0,0],[-1.458,-11.082]],"v":[[-90.723,-17.795],[-105.265,-9.776],[-132.381,8.304],[-137.378,15.689],[-128.346,31.118],[-114.189,25.076],[-95.262,12.839],[-95.252,14.65],[-94.671,70.769],[-94.762,97.378],[-95.145,118.123],[-91.945,133.913],[-76.008,127.777],[-63.511,127.842],[-63.259,119.781],[-63.283,103.121],[-63.28,88.1],[-62.982,27.512],[-63.836,-8.482]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[7.804,-3.019],[7.02,-4.077],[0,0],[1.208,-3.503],[-9.593,-0.283],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-1.033,7.594],[0,0],[0,0],[0,0],[0,0],[1.063,8.076]],"o":[[-2.212,0.856],[-13.279,7.713],[0,0],[-1.893,5.488],[6.551,0.193],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.488,-3.586],[0,0],[0,0],[0,0],[0,0],[-1.458,-11.082]],"v":[[-85.408,39.199],[-99.949,47.218],[-127.065,65.298],[-132.062,72.683],[-123.03,88.113],[-108.873,82.07],[-89.946,69.834],[-89.936,71.645],[-89.356,127.764],[-81.559,123.086],[-75.102,116.154],[-73.523,124.166],[-82.291,127.173],[-68.227,115.066],[-72.077,124.534],[-58.192,127.305],[-58.189,112.284],[-57.666,84.507],[-58.52,48.513]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[7.804,-3.019],[7.02,-4.077],[0,0],[1.208,-3.503],[-9.593,-0.283],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-1.033,7.594],[0,0],[0,0],[0,0],[0,0],[1.063,8.076]],"o":[[-2.212,0.856],[-13.279,7.713],[0,0],[-1.893,5.488],[6.551,0.193],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.488,-3.586],[0,0],[0,0],[0,0],[0,0],[-1.458,-11.082]],"v":[[-82.527,70.086],[-97.068,78.105],[-124.184,96.185],[-129.181,103.57],[-120.149,119],[-105.992,112.957],[-87.066,100.721],[-87.055,102.532],[-86.645,121.582],[-81.976,119.304],[-82.584,109.353],[-79.384,125.143],[-65.013,131.179],[-50.95,119.072],[-50.698,111.011],[-50.497,125.046],[-50.494,110.025],[-54.785,115.394],[-55.639,79.4]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[7.804,-3.019],[7.02,-4.077],[0,0],[1.208,-3.503],[-9.593,-0.283],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-1.033,7.594],[0,0],[0,0],[0,0],[0,0],[1.063,8.076]],"o":[[-2.212,0.856],[-13.279,7.713],[0,0],[-1.893,5.488],[6.551,0.193],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.488,-3.586],[0,0],[0,0],[0,0],[0,0],[-1.458,-11.082]],"v":[[-80.331,93.626],[-94.873,101.644],[-121.989,119.725],[-126.985,127.11],[-113.577,126.56],[-94.269,122.961],[-84.87,124.26],[-84.86,126.071],[-85.018,132.283],[-76.337,118.302],[-75.472,109.303],[-72.272,125.093],[-57.901,131.129],[-43.838,119.022],[-43.586,110.961],[-44.858,124.044],[-44.855,109.023],[-52.695,119.614],[-53.444,102.939]],"c":true}]},{"t":40,"s":[{"i":[[7.804,-3.019],[7.02,-4.077],[0,0],[1.208,-3.503],[-9.593,-0.283],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-1.033,7.594],[0,0],[0,0],[0,0],[0,0],[1.063,8.076]],"o":[[-2.212,0.856],[-13.279,7.713],[0,0],[-1.893,5.488],[6.551,0.193],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.488,-3.586],[0,0],[0,0],[0,0],[0,0],[-1.458,-11.082]],"v":[[-78.989,108.018],[-93.53,116.036],[-120.646,134.117],[-125.16,112.48],[-116.129,127.909],[-101.971,121.867],[-86.441,125.777],[-79.12,112.264],[-71.474,98.338],[-71.565,124.947],[-72.368,108.816],[-69.168,124.606],[-54.797,130.642],[-40.734,118.535],[-40.482,110.474],[-40.086,130.69],[-40.083,115.669],[-43.453,118.688],[-52.101,117.331]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,-30.199],[0,0],[27.483,0],[0,0],[0,30.199],[0,0],[-27.483,0]],"o":[[27.483,0],[0,0],[0,30.199],[0,0],[-27.483,0],[0,0],[0,-30.199],[0,0]],"v":[[126.631,-155.306],[176.396,-100.624],[176.396,81.711],[126.631,136.393],[-138.928,136.393],[-188.693,81.711],[-188.693,-100.624],[-138.928,-155.306]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":51,"s":[{"i":[[0,0],[0,-26.886],[0,0],[26.444,0],[0,0],[0,26.886],[0,0],[-26.444,0]],"o":[[26.444,0],[0,0],[0,26.886],[0,0],[-26.444,0],[0,0],[0,-26.886],[0,0]],"v":[[114.899,-124.335],[162.782,-75.651],[162.782,86.683],[114.899,135.367],[-140.619,135.367],[-188.502,86.683],[-188.502,-75.651],[-140.619,-124.335]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":63,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"t":68,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":7,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Lines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[70,277.55,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":41,"s":[130,267.55,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[178,259.55,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-186,-0.45,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-208,100.1]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":20,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-174,99.6]],"c":false}]},{"t":34,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-269.667,101.3],[-155,98.1]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[38]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":35,"s":[67]},{"t":42,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":33,"s":[100]},{"t":41,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-204],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-174,99.6]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-299.667,101.8],[-174,99.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":26,"s":[72]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":33,"s":[15]},{"t":40,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":31,"s":[100]},{"t":39,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-100],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.238,87.8],[-134.571,87.6]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":7,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.965,68.8],[-135.299,68.6]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-271.153,77.8],[-135.486,77.6]],"c":false}]},{"t":15,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-269.76,95.8],[-134.094,95.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":15,"s":[19]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":23,"s":[67]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":30,"s":[0]},{"t":37,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":28,"s":[100]},{"t":36,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":180,"st":0,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/submodules/TelegramUI/Resources/Animations/anim_voicespeed.json b/submodules/TelegramUI/Resources/Animations/anim_voicespeed.json deleted file mode 100644 index e6dd4e3928..0000000000 --- a/submodules/TelegramUI/Resources/Animations/anim_voicespeed.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.7.1","fr":60,"ip":0,"op":75,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":55,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":65,"s":[3]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":70,"s":[-1]},{"t":74,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[199,388,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":7,"s":[199,280,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":13,"s":[199,306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":18,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":25,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":32,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":39,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":46,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":53,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[199,306,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"t":9,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Body","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":2,"s":[10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":13,"s":[-14]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[-10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":27,"s":[-13]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":34,"s":[-10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":41,"s":[-12]},{"i":{"x":[0.506],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":48,"s":[-9]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":55,"s":[-13]},{"t":65,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.2,"y":0},"t":2,"s":[-82.367,118.339,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[-95.349,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":41,"s":[62.651,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[-41.349,134.878,0]}],"ix":2},"a":{"a":0,"k":[-148.349,134.878,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.024],[-10.136,0],[0,0],[0,-0.03],[8.342,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.267,-0.007],[0,-0.032],[0,0],[8.253,0],[0,0.031],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-120.513,-117.597],[-121.338,-117.599],[-121.524,-117.599],[-120.774,-117.596],[-121.123,-117.599],[-120.99,-117.597],[-120.724,-117.595],[-120.419,-117.597],[-135.694,-117.598],[-136.53,-117.597],[-145.275,-117.642],[-130.205,-117.697],[-45.617,-117.697],[-32.341,-117.646],[-45.617,-117.594],[-103.205,-117.594],[-104.413,-117.594],[-118.132,-117.596],[-119.348,-117.596],[-119.759,-117.596]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.024],[-10.136,0],[0,0],[0,-0.03],[13.034,-0.954],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.137,1.403],[0,-0.032],[0,0],[8.253,0],[0,0.031],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-120.345,-121.271],[-121.17,-121.273],[-121.355,-121.274],[-120.605,-121.27],[-120.955,-121.273],[-120.821,-121.272],[-120.556,-121.269],[-120.251,-121.271],[-135.526,-121.272],[-138.665,-120.691],[-139.552,-116.895],[-130.244,-110.538],[-45.655,-110.538],[-32.341,-117.646],[-46.083,-120.129],[-103.823,-121.186],[-105.03,-121.185],[-117.964,-121.271],[-119.18,-121.271],[-119.591,-121.271]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.039,-5.963],[-9.837,0.066],[0,0],[0.049,7.476],[8.096,-0.054],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.229,5.916],[0.052,8.01],[0,0],[8.009,-0.053],[-0.05,-7.654],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-122.419,-121.338],[-122.439,-121.311],[-122.411,-121.281],[-122.313,-121.32],[-122.47,-121.35],[-122.546,-121.353],[-122.502,-121.295],[-122.451,-121.09],[-122.58,-121.327],[-139.297,-105.56],[-147.724,-89.661],[-133.011,-76.23],[-50.922,-76.777],[-38.121,-89.501],[-51.087,-102.053],[-106.974,-101.681],[-92.584,-120.09],[-101.867,-120.536],[-107.919,-120.778],[-110.081,-120.923]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.063,-5.934],[-9.65,0.106],[0,0],[0.079,7.439],[7.942,-0.088],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.086,5.913],[0.085,7.971],[0,0],[7.856,-0.087],[-0.081,-7.617],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-90.929,-117.304],[-103.529,-117.63],[-106.364,-117.703],[-106.115,-116.732],[-106.103,-116.634],[-105.536,-116.522],[-105.006,-115.202],[-104.947,-115.411],[-105.434,-115.293],[-141.055,-79.473],[-149.255,-63.616],[-134.765,-50.313],[-54.238,-51.201],[-41.734,-63.917],[-54.507,-76.354],[-109.33,-75.749],[-78.246,-108.067],[-76.387,-113.467],[-76.385,-115.326],[-76.385,-115.954]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.675,-7.566],[0,0],[-0.088,-5.904],[-9.462,0.147],[0,0],[0.11,7.403],[7.788,-0.121],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.943,5.91],[0.118,7.931],[0,0],[7.704,-0.12],[-0.113,-7.579],[0,0],[0,0],[14.21,-15.05],[0,0],[0,0],[0,0]],"v":[[-64.173,-111.906],[-129.827,-112.253],[-134.85,-112.3],[-134.798,-112.304],[-134.784,-112.222],[-134.677,-112.303],[-133.467,-112.233],[-89.125,-112.337],[-100.909,-96.791],[-142.813,-53.386],[-150.786,-37.572],[-136.519,-24.396],[-57.554,-25.626],[-45.347,-38.333],[-57.926,-50.654],[-111.686,-49.817],[-81.343,-82.111],[-63.276,-110.187],[-63.506,-110.975],[-63.583,-111.241]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[0,0],[0,0],[-0.045,-2.368],[-7.798,0.158],[-3.165,6.293],[-11.245,0.228],[-7.202,-1.462],[16.981,-18.065],[0,0],[-0.112,-5.875],[-9.275,0.188],[0,0],[0.14,7.366],[7.634,-0.155],[0,0],[0,0],[0.348,18.24],[4.464,-0.059],[0,0]],"o":[[0,0],[0,0],[0,0],[0.149,7.804],[6.32,-0.128],[3.938,-0.037],[12.476,-0.253],[0.206,10.786],[0,0],[-5.799,5.908],[0.15,7.892],[0,0],[7.551,-0.153],[-0.144,-7.541],[0,0],[0,0],[22.461,-23.528],[-5.384,0.37],[-2.181,0.029],[0,0]],"v":[[-107.081,-109.419],[-144.461,-109.504],[-152.871,-109.524],[-153.66,-112.119],[-140.941,-99.658],[-128.146,-109.041],[-107.401,-109.496],[-82.842,-108.372],[-103.684,-70.676],[-144.57,-27.3],[-152.317,-11.528],[-138.273,1.521],[-60.871,-0.051],[-48.96,-12.75],[-61.345,-24.955],[-114.042,-23.885],[-84.439,-56.154],[-54.253,-109.489],[-57.274,-109.113],[-75.378,-108.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[0,0],[13.478,-0.866],[1.34,-5.201],[-0.055,-2.356],[-7.64,0.193],[-3.072,6.276],[-11.018,0.278],[-0.287,-12.303],[16.558,-18.053],[0,0],[-0.136,-5.846],[-9.088,0.229],[0,0],[0.171,7.329],[7.479,-0.189],[0,0],[0,0],[0.423,18.149],[4.717,6.573],[0,0]],"o":[[0,0],[-3.698,4.601],[-0.593,2.198],[0.181,7.765],[6.193,-0.156],[4.627,-12.077],[12.225,-0.309],[0.25,10.732],[0,0],[-5.656,5.905],[0.183,7.853],[0,0],[7.399,-0.187],[-0.175,-7.504],[0,0],[0,0],[21.903,-23.514],[-0.156,-9.157],[-5.138,-0.457],[0,0]],"v":[[-108.908,-107.489],[-147.12,-107.243],[-154.731,-92.321],[-155.619,-85.576],[-143.1,-73.233],[-130.604,-82.628],[-107.457,-101.109],[-85.976,-80.611],[-106.46,-44.562],[-146.328,-1.213],[-153.848,14.517],[-140.027,27.438],[-64.187,25.524],[-52.573,12.834],[-64.765,0.744],[-116.397,2.047],[-87.536,-30.198],[-58.198,-83.408],[-65.748,-107.229],[-72.493,-107.035]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[13.069,-0.397],[7.702,-10.942],[1.126,-4.528],[-0.065,-2.344],[-7.483,0.227],[-2.98,6.26],[-10.791,0.328],[-0.338,-12.241],[16.135,-18.041],[0,0],[-0.161,-5.817],[-8.901,0.27],[0,0],[0.202,7.292],[7.325,-0.223],[0,0],[0,0],[0.499,18.058],[4.76,6.562],[3.24,2.406]],"o":[[-18.422,0.559],[-2.902,4.123],[-0.57,2.189],[0.214,7.727],[6.065,-0.184],[4.476,-12.04],[11.973,-0.364],[0.295,10.678],[0,0],[-5.513,5.902],[0.216,7.813],[0,0],[7.247,-0.22],[-0.206,-7.466],[0,0],[0,0],[21.345,-23.5],[-0.198,-9.226],[-2.326,-3.206],[-8.354,-6.203]],"v":[[-111.22,-93.847],[-151.056,-73.861],[-157.133,-60.739],[-157.972,-54.023],[-145.651,-41.798],[-133.455,-51.205],[-110.868,-69.703],[-89.732,-49.405],[-109.629,-13.438],[-148.479,29.883],[-155.771,45.571],[-142.174,58.365],[-67.896,56.109],[-56.579,43.427],[-68.577,31.453],[-119.146,32.989],[-91.026,0.768],[-62.536,-52.316],[-70.218,-76.231],[-78.595,-84.676]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":53,"s":[{"i":[[12.739,-0.469],[7.446,-10.922],[1.072,-4.508],[-0.077,-2.33],[-7.294,0.269],[-2.87,6.24],[-10.519,0.387],[-0.4,-12.167],[15.628,-18.027],[0,0],[-0.19,-5.781],[-8.676,0.319],[0,0],[0.238,7.248],[7.141,-0.263],[0,0],[0,0],[0.59,17.948],[4.678,6.497],[3.173,2.373]],"o":[[-17.958,0.661],[-2.805,4.115],[-0.543,2.18],[0.252,7.68],[5.912,-0.218],[4.295,-11.994],[11.671,-0.43],[0.349,10.614],[0,0],[-5.341,5.899],[0.255,7.766],[0,0],[7.064,-0.26],[-0.244,-7.421],[0,0],[0,0],[20.676,-23.483],[-0.245,-9.171],[-2.286,-3.174],[-8.18,-6.119]],"v":[[-114.549,-68.496],[-153.272,-48.4],[-159.121,-35.321],[-159.901,-28.639],[-147.82,-16.557],[-135.983,-25.978],[-114.068,-44.496],[-93.345,-24.438],[-112.538,11.432],[-150.167,54.718],[-157.186,70.355],[-143.857,82.996],[-71.453,80.33],[-60.492,67.659],[-72.258,55.824],[-121.551,57.639],[-94.32,25.448],[-66.847,-27.487],[-74.474,-51.217],[-82.69,-59.564]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":63,"s":[{"i":[[14.883,0],[9.108,-11.055],[1.424,-4.639],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[18.927,-18.12],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[0,18.658],[5.21,6.924],[3.611,2.586]],"o":[[-20.98,0],[-3.431,4.165],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,11.033],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[25.027,-23.592],[0.065,-9.531],[-2.545,-3.383],[-9.31,-6.666]],"v":[[-65.81,-76.276],[-111.766,-56.892],[-119.093,-43.535],[-120.259,-36.628],[-106.624,-23.622],[-92.451,-32.951],[-66.169,-51.339],[-42.757,-29.721],[-66.528,6.787],[-112.096,50.293],[-120.887,66.26],[-105.817,79.894],[-21.228,79.894],[-7.952,67.157],[-21.228,54.419],[-78.817,54.419],[-45.806,22.037],[-11.72,-31.874],[-19.709,-56.804],[-28.976,-65.785]],"c":true}]},{"t":68,"s":[{"i":[[14.883,0],[9.108,-11.055],[1.424,-4.639],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[18.927,-18.12],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[0,18.658],[5.21,6.924],[3.611,2.586]],"o":[[-20.98,0],[-3.431,4.165],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,11.033],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[25.027,-23.592],[0.065,-9.531],[-2.545,-3.383],[-9.31,-6.666]],"v":[[-71.806,-76.067],[-117.762,-56.683],[-125.089,-43.326],[-126.255,-36.419],[-112.621,-23.412],[-98.448,-32.741],[-72.165,-51.13],[-48.753,-29.512],[-72.524,6.997],[-118.092,50.502],[-126.883,66.469],[-111.813,80.104],[-27.225,80.104],[-13.949,67.366],[-27.225,54.628],[-84.813,54.628],[-51.803,22.246],[-17.716,-31.665],[-25.706,-56.594],[-34.972,-65.576]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":2,"s":[{"i":[[2.918,-3.404],[5.234,-5.12],[0,0],[1.578,-3.059],[-8.515,-0.332],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.717,-3.187],[-10.267,0.568],[-0.621,7.097],[0,0],[0,0],[0,0],[0,0],[0.924,6.601]],"o":[[-1.396,1.629],[-10.963,10.723],[0,0],[-2.424,4.699],[9.44,0.368],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.337,-0.351],[0.289,-3.306],[0,0],[0,0],[0,0],[0,0],[-2.072,-14.802]],"v":[[-32.087,-67.908],[-43.056,-56.827],[-68.908,-31.93],[-74.329,-23.551],[-64.105,-6.331],[-49.974,-10.777],[-38.372,-23.327],[-37.981,-21.666],[-38.367,14.331],[-38.67,52.382],[-37.9,65.219],[-34.837,81.422],[-22.077,85.239],[-9.867,74.134],[-9.922,66.74],[-9.943,51.172],[-9.94,28.221],[-10.147,-28.672],[-10.934,-60.083]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-0.699,7.737],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.326,-3.604],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-87.804,-94.075],[-100.158,-81.994],[-129.274,-54.851],[-135.38,-45.716],[-123.864,-26.943],[-107.949,-31.79],[-94.882,-45.472],[-94.442,-43.661],[-94.877,-4.417],[-95.218,37.067],[-94.351,51.062],[-90.901,68.727],[-76.53,72.888],[-62.779,60.781],[-62.84,52.72],[-62.864,35.747],[-62.861,10.726],[-63.094,-51.299],[-63.979,-85.543]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-0.699,7.737],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.326,-3.604],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-87.397,-74.143],[-99.751,-62.062],[-128.868,-34.92],[-134.973,-25.784],[-123.458,-7.011],[-107.543,-11.858],[-94.476,-25.54],[-94.036,-23.73],[-94.471,15.514],[-94.811,56.999],[-93.945,70.993],[-90.495,88.658],[-76.123,92.82],[-62.372,80.713],[-62.434,72.651],[-62.457,55.679],[-62.454,30.658],[-62.687,-31.367],[-63.573,-65.612]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-0.699,7.737],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.326,-3.604],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-86.991,-54.212],[-99.345,-42.13],[-128.462,-14.988],[-134.567,-5.853],[-123.052,12.921],[-107.136,8.073],[-94.069,-5.609],[-93.629,-3.798],[-94.064,35.446],[-94.405,76.93],[-93.538,90.925],[-90.088,108.59],[-75.717,112.751],[-61.966,100.645],[-62.027,92.583],[-62.051,75.611],[-62.048,50.59],[-62.281,-11.435],[-63.167,-45.68]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-86.483,-29.297],[-98.837,-17.216],[-127.954,9.926],[-134.059,19.062],[-122.544,37.835],[-106.628,32.988],[-93.561,19.306],[-93.121,21.116],[-93.556,60.36],[-93.897,101.845],[-93.03,115.839],[-87.784,115.982],[-78.737,116.416],[-69.291,116.93],[-61.847,116.658],[-61.543,100.525],[-61.54,75.504],[-61.773,13.479],[-62.659,-20.766]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-85.975,-4.383],[-98.329,7.699],[-127.446,34.841],[-133.551,43.976],[-122.036,62.749],[-106.12,57.902],[-93.053,44.22],[-92.613,46.031],[-93.048,85.275],[-92.51,115.833],[-85.593,116.151],[-81.357,116.613],[-78.425,116.851],[-72.961,116.293],[-65.685,115.895],[-60.947,115.242],[-61.032,100.418],[-61.265,38.394],[-62.151,4.149]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-85.467,20.532],[-97.821,32.613],[-126.938,59.755],[-133.043,68.891],[-121.528,87.664],[-105.612,82.817],[-92.545,69.135],[-92.105,70.945],[-92.25,117.098],[-92.073,117.28],[-87.167,117.902],[-82.509,118.133],[-77.665,118.053],[-70.629,117.953],[-65.478,117.679],[-61.257,117.464],[-60.999,116.614],[-60.757,63.308],[-61.643,29.063]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-84.959,45.446],[-97.313,57.528],[-126.43,84.67],[-132.535,93.805],[-121.02,112.578],[-105.104,107.731],[-92.037,94.049],[-91.597,95.86],[-91.322,117.754],[-91.208,118.203],[-91.181,117.971],[-82.605,117.937],[-71.575,117.946],[-64.955,117.88],[-59.748,117.568],[-59.845,117.952],[-59.94,117.691],[-60.249,88.223],[-61.135,53.978]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[7.009,0.476],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-83.888,84.178],[-96.242,96.26],[-110.312,110.36],[-116.3,116.722],[-115.867,116.61],[-99.837,116.42],[-90.188,116.093],[-89.687,117.216],[-89.774,116.389],[-90.17,117.222],[-90.181,116.326],[-84.933,115.518],[-77.277,116.058],[-72.884,115.731],[-64.096,116.373],[-59.381,116.129],[-58.818,114.831],[-59.111,115.282],[-60.064,92.71]],"c":true}]},{"t":53,"s":[{"i":[[3.286,-0.056],[5.895,-0.085],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,0.11]],"o":[[-1.572,0.027],[-12.347,0.178],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-0.246]],"v":[[-86.652,114.148],[-99.006,114.332],[-110.411,114.495],[-110.888,114.503],[-104.681,114.416],[-98.122,114.318],[-93.796,114.221],[-93.296,114.238],[-93.383,114.226],[-93.778,114.238],[-93.79,114.225],[-88.504,114.189],[-80.902,114.153],[-76.569,114.134],[-67.917,114.176],[-63.095,114.262],[-62.459,114.483],[-62.757,114.232],[-62.828,114.277]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":2,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[137.788,-73.187],[124.781,-65.383],[90.963,-16.047],[90.156,-16.047],[57.415,-64.306],[42.973,-73.187],[26.737,-58.117],[31.401,-45.828],[68.269,4.405],[68.269,5.213],[30.146,58.406],[25.84,69.977],[41,83.881],[54.455,76.077],[88.003,28.445],[88.811,28.445],[122.897,75.987],[136.801,83.971],[152.14,69.529],[147.924,57.868],[109.352,5.841],[109.352,5.123],[149.09,-47.98],[153.306,-59.462]],"c":true}]},{"i":{"x":0.2,"y":0.742},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[7.908,-0.143],[3.384,-6.028],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[0.079,4.596]],"o":[[-5.782,0.104],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[-0.059,-8.411]],"v":[[89.471,-101.108],[77.287,-92.378],[46.149,-38.016],[45.384,-38.003],[13.445,-90.052],[-0.412,-99.486],[-15.522,-82.781],[-10.871,-69.463],[25.017,-15.333],[25.032,-14.453],[-10.115,44.187],[-13.981,56.875],[0.65,71.773],[13.26,63.036],[44.174,10.537],[44.939,10.523],[78.14,61.767],[91.47,70.233],[105.742,54.227],[101.527,41.586],[63.99,-14.471],[63.977,-15.253],[100.656,-73.823],[104.439,-86.412]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.3,"y":0.097},"t":25,"s":[{"i":[[7.535,-0.207],[3.163,-5.561],[0,0],[0,0],[0,0],[5.51,-0.151],[-0.253,-8.698],[-3.296,-4.576],[0,0],[0,0],[0,0],[-0.115,-3.945],[-7.697,0.211],[-3.477,5.928],[0,0],[0,0],[0,0],[-5.266,0.145],[0.245,8.429],[2.786,3.782],[0,0],[0,0],[0,0],[0.123,4.214]],"o":[[-5.51,0.151],[0,0],[0,0],[0,0],[-3.91,-6.174],[-8.426,0.231],[0.12,4.125],[0,0],[0,0],[0,0],[-2.632,4.29],[0.224,7.711],[5.429,-0.149],[0,0],[0,0],[0,0],[3.891,5.547],[8.021,-0.22],[-0.123,-4.214],[0,0],[0,0],[0,0],[2.64,-4.021],[-0.143,-7.714]],"v":[[64.636,-75.371],[53.114,-67.248],[24.003,-17.092],[23.273,-17.072],[-7.703,-64.501],[-21.006,-73.019],[-35.233,-57.553],[-30.662,-45.384],[4.098,3.914],[4.122,4.721],[-28.767,58.839],[-32.319,70.512],[-18.222,84.035],[-6.296,75.9],[22.622,27.455],[23.351,27.435],[55.522,74.113],[68.313,81.748],[81.748,66.931],[77.601,55.379],[41.249,4.33],[41.228,3.613],[75.577,-50.455],[79.052,-62.037]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":53,"s":[{"i":[[7.126,-0.196],[2.991,-5.258],[0,0],[0,0],[0,0],[5.21,-0.143],[-0.239,-8.224],[-3.116,-4.327],[0,0],[0,0],[0,0],[-0.108,-3.73],[-7.279,0.2],[-3.288,5.605],[0,0],[0,0],[0,0],[-4.98,0.137],[0.232,7.969],[2.635,3.576],[0,0],[0,0],[0,0],[0.116,3.985]],"o":[[-5.21,0.143],[0,0],[0,0],[0,0],[-3.697,-5.838],[-7.969,0.219],[0.113,3.9],[0,0],[0,0],[0,0],[-2.489,4.056],[0.212,7.291],[5.134,-0.141],[0,0],[0,0],[0,0],[3.68,5.244],[7.586,-0.208],[-0.116,-3.985],[0,0],[0,0],[0,0],[2.497,-3.802],[-0.135,-7.293]],"v":[[52.827,-69.634],[41.932,-61.953],[14.401,-14.531],[13.712,-14.512],[-15.582,-59.356],[-28.162,-67.411],[-41.617,-52.787],[-37.294,-41.281],[-4.422,5.331],[-4.4,6.094],[-35.502,57.263],[-38.862,68.301],[-25.53,81.087],[-14.251,73.395],[13.096,27.59],[13.785,27.571],[44.209,71.705],[56.305,78.925],[69.01,64.915],[65.088,53.993],[30.71,5.724],[30.691,5.046],[63.175,-46.076],[66.46,-57.027]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":63,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[124.358,-75.021],[111.351,-67.217],[77.533,-17.881],[76.726,-17.881],[43.985,-66.14],[29.543,-75.021],[13.307,-59.951],[17.972,-47.662],[54.839,2.571],[54.839,3.379],[16.716,56.572],[12.41,68.143],[27.57,82.047],[41.025,74.243],[74.573,26.611],[75.381,26.611],[109.467,74.153],[123.371,82.137],[138.71,67.695],[134.494,56.034],[95.922,4.007],[95.922,3.289],[135.66,-49.814],[139.876,-61.296]],"c":true}]},{"t":68,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[118.361,-74.811],[105.355,-67.007],[71.537,-17.671],[70.73,-17.671],[37.989,-65.931],[23.547,-74.811],[7.311,-59.741],[11.975,-47.452],[48.843,2.781],[48.843,3.588],[10.719,56.781],[6.414,68.353],[21.573,82.257],[35.029,74.452],[68.577,26.821],[69.384,26.821],[103.471,74.363],[117.375,82.346],[132.714,67.904],[128.498,56.243],[89.926,4.216],[89.926,3.498],[129.664,-49.605],[133.88,-61.087]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.2,"y":0},"t":4,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,-30.199],[0,0],[27.483,0],[0,0],[0,30.199],[0,0],[-27.483,0]],"o":[[27.483,0],[0,0],[0,30.199],[0,0],[-27.483,0],[0,0],[0,-30.199],[0,0]],"v":[[126.631,-155.306],[176.396,-100.624],[176.396,81.711],[126.631,136.393],[-138.928,136.393],[-188.693,81.711],[-188.693,-100.624],[-138.928,-155.306]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":51,"s":[{"i":[[0,0],[0,-26.886],[0,0],[26.444,0],[0,0],[0,26.886],[0,0],[-26.444,0]],"o":[[26.444,0],[0,0],[0,26.886],[0,0],[-26.444,0],[0,0],[0,-26.886],[0,0]],"v":[[114.899,-124.335],[162.782,-75.651],[162.782,86.683],[114.899,135.367],[-140.619,135.367],[-188.502,86.683],[-188.502,-75.651],[-140.619,-124.335]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":63,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"t":68,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Lines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[70,277.55,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":41,"s":[130,267.55,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[178,259.55,0]}],"ix":2},"a":{"a":0,"k":[-186,-0.45,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-208,100.1]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-174,99.6]],"c":false}]},{"t":34,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-269.667,101.3],[-155,98.1]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[38]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":35,"s":[67]},{"t":42,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":33,"s":[100]},{"t":41,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-204],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-174,99.6]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-299.667,101.8],[-174,99.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":26,"s":[72]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":33,"s":[15]},{"t":40,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":31,"s":[100]},{"t":39,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-100],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.238,87.8],[-134.571,87.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.965,68.8],[-135.299,68.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-271.153,77.8],[-135.486,77.6]],"c":false}]},{"t":15,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-269.76,95.8],[-134.094,95.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":15,"s":[19]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":23,"s":[67]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":30,"s":[0]},{"t":37,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":28,"s":[100]},{"t":36,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/submodules/TelegramUI/Sources/ChatAvatarNavigationNode.swift b/submodules/TelegramUI/Sources/ChatAvatarNavigationNode.swift index fa894203e5..645374c204 100644 --- a/submodules/TelegramUI/Sources/ChatAvatarNavigationNode.swift +++ b/submodules/TelegramUI/Sources/ChatAvatarNavigationNode.swift @@ -174,7 +174,9 @@ final class ChatAvatarNavigationNode: ASDisplayNode { } strongSelf.updateVideoVisibility() } else { - let _ = context.engine.peers.fetchAndUpdateCachedPeerData(peerId: peer.id).start() + if let photo = peer.largeProfileImage, photo.hasVideo { + let _ = context.engine.peers.fetchAndUpdateCachedPeerData(peerId: peer.id).start() + } } })) } else { diff --git a/submodules/TelegramUI/Sources/ChatBotInfoItem.swift b/submodules/TelegramUI/Sources/ChatBotInfoItem.swift index d04a1a9329..f450b25a81 100644 --- a/submodules/TelegramUI/Sources/ChatBotInfoItem.swift +++ b/submodules/TelegramUI/Sources/ChatBotInfoItem.swift @@ -428,7 +428,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { } return .url(url: url, concealed: concealed) } else if let peerMention = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerMention)] as? TelegramPeerMention { - return .peerMention(peerMention.peerId, peerMention.mention) + return .peerMention(peerId: peerMention.peerId, mention: peerMention.mention, openProfile: false) } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { return .textMention(peerName) } else if let botCommand = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.BotCommand)] as? String { @@ -455,7 +455,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { break case let .url(url, concealed): self.item?.controllerInteraction.openUrl(url, concealed, nil, nil) - case let .peerMention(peerId, _): + case let .peerMention(peerId, _, _): if let item = self.item { let _ = (item.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)) |> deliverOnMainQueue).start(next: { [weak self] peer in @@ -481,7 +481,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { break case let .url(url, _): item.controllerInteraction.longTap(.url(url), nil) - case let .peerMention(peerId, mention): + case let .peerMention(peerId, mention, _): item.controllerInteraction.longTap(.peerMention(peerId, mention), nil) case let .textMention(name): item.controllerInteraction.longTap(.mention(name), nil) diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 559552e153..f1af62e80b 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -3550,7 +3550,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let f = { let _ = (context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.translationSettings]) |> take(1) - |> deliverOnMainQueue).start(next: { sharedData in + |> deliverOnMainQueue).start(next: { [weak self] sharedData in + guard let strongSelf = self else { + return + } let translationSettings: TranslationSettings if let current = sharedData.entries[ApplicationSpecificSharedDataKeys.translationSettings]?.get(TranslationSettings.self) { translationSettings = current @@ -3565,6 +3568,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let (_, language) = canTranslateText(context: context, text: text.string, showTranslate: translationSettings.showTranslate, showTranslateIfTopical: showTranslateIfTopical, ignoredLanguages: translationSettings.ignoredLanguages) + let _ = ApplicationSpecificNotice.incrementTranslationSuggestion(accountManager: context.sharedContext.accountManager, timestamp: Int32(Date().timeIntervalSince1970)).start() + let controller = TranslateScreen(context: context, text: text.string, canCopy: canCopy, fromLanguage: language) controller.pushController = { [weak self] c in self?.effectiveNavigationController?._keepModalDismissProgress = true @@ -6717,9 +6722,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.translationStateDisposable = (combineLatest( queue: .concurrentDefaultQueue(), isPremium, - isHidden - ) |> mapToSignal { isPremium, isHidden -> Signal in - if isPremium && !isHidden { + isHidden, + ApplicationSpecificNotice.translationSuggestion(accountManager: self.context.sharedContext.accountManager) + ) |> mapToSignal { isPremium, isHidden, counterAndTimestamp -> Signal in + var maybeSuggestPremium = false + if counterAndTimestamp.0 >= 3 { + maybeSuggestPremium = true + } + if (isPremium || maybeSuggestPremium) && !isHidden { return chatTranslationState(context: context, peerId: peerId) |> map { translationState -> ChatPresentationTranslationState? in if let translationState, !translationState.fromLang.isEmpty { diff --git a/submodules/TelegramUI/Sources/ChatMessageActionItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageActionItemNode.swift index ceac4555b1..4b03ec537a 100644 --- a/submodules/TelegramUI/Sources/ChatMessageActionItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageActionItemNode.swift @@ -475,7 +475,7 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { } return .url(url: url, concealed: concealed) } else if let peerMention = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerMention)] as? TelegramPeerMention { - return .peerMention(peerMention.peerId, peerMention.mention) + return .peerMention(peerId: peerMention.peerId, mention: peerMention.mention, openProfile: true) } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { return .textMention(peerName) } else if let botCommand = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.BotCommand)] as? String { diff --git a/submodules/TelegramUI/Sources/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageAttachedContentNode.swift index 2ef2cd0fa2..cd8f4d13dd 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAttachedContentNode.swift @@ -1163,7 +1163,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { } return .url(url: url, concealed: concealed) } else if let peerMention = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerMention)] as? TelegramPeerMention { - return .peerMention(peerMention.peerId, peerMention.mention) + return .peerMention(peerId: peerMention.peerId, mention: peerMention.mention, openProfile: false) } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { return .textMention(peerName) } else if let botCommand = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.BotCommand)] as? String { diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift index 9b8df19d73..314e21b57d 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift @@ -109,7 +109,7 @@ enum ChatMessageBubbleContentTapAction { case none case url(url: String, concealed: Bool) case textMention(String) - case peerMention(PeerId, String) + case peerMention(peerId: PeerId, mention: String, openProfile: Bool) case botCommand(String) case hashtag(String?, String) case instantPage diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift index 7504cde026..ab1ec32a4f 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift @@ -3650,13 +3650,13 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode return .action({ self.item?.controllerInteraction.openUrl(url, concealed, nil, self.item?.content.firstMessage) }) - case let .peerMention(peerId, _): + case let .peerMention(peerId, _, openProfile): return .action({ [weak self] in if let item = self?.item { let _ = (item.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)) |> deliverOnMainQueue).start(next: { peer in if let self = self, let item = self.item, let peer = peer { - item.controllerInteraction.openPeer(peer, .chat(textInputState: nil, subject: nil, peekData: nil), nil, .default) + item.controllerInteraction.openPeer(peer, openProfile ? .info : .chat(textInputState: nil, subject: nil, peekData: nil), nil, .default) } }) } @@ -3791,7 +3791,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode return .action({ item.controllerInteraction.longTap(.url(url), message) }) - case let .peerMention(peerId, mention): + case let .peerMention(peerId, mention, _): return .action({ item.controllerInteraction.longTap(.peerMention(peerId, mention), message) }) diff --git a/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift b/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift index a6b412936b..60bf278fbc 100644 --- a/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift +++ b/submodules/TelegramUI/Sources/ChatMessageDateHeader.swift @@ -586,50 +586,10 @@ final class ChatMessageAvatarHeaderNode: ListViewItemHeaderNode { } strongSelf.updateVideoVisibility() } else { - let _ = context.engine.peers.fetchAndUpdateCachedPeerData(peerId: peer.id).start() + if let photo = peer.largeProfileImage, photo.hasVideo { + let _ = context.engine.peers.fetchAndUpdateCachedPeerData(peerId: peer.id).start() + } } - - - - -// let cachedPeerData = peerView.cachedData -// if let cachedPeerData = cachedPeerData as? CachedUserData, case let .known(maybePhoto) = cachedPeerData.photo { -// if let photo = maybePhoto, let video = photo.videoRepresentations.last, let peerReference = PeerReference(peer) { -// let videoId = photo.id?.id ?? peer.id.id._internalGetInt64Value() -// let videoFileReference = FileMediaReference.avatarList(peer: peerReference, media: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 0), partialReference: nil, resource: video.resource, previewRepresentations: photo.representations, videoThumbnails: [], immediateThumbnailData: photo.immediateThumbnailData, mimeType: "video/mp4", size: nil, attributes: [.Animated, .Video(duration: 0, size: video.dimensions, flags: [])])) -// let videoContent = NativeVideoContent(id: .profileVideo(videoId, "\(Int32.random(in: 0 ..< Int32.max))"), userLocation: .other, fileReference: videoFileReference, streamVideo: isMediaStreamable(resource: video.resource) ? .conservative : .none, loopVideo: true, enableSound: false, fetchAutomatically: true, onlyFullSizeThumbnail: false, useLargeThumbnail: true, autoFetchFullSizeThumbnail: true, startTimestamp: video.startTimestamp, continuePlayingWithoutSoundOnLostAudioSession: false, placeholderColor: .clear, captureProtected: false, storeAfterDownload: nil) -// if videoContent.id != strongSelf.videoContent?.id { -// strongSelf.videoNode?.removeFromSupernode() -// strongSelf.videoContent = videoContent -// } -// -// if strongSelf.hierarchyTrackingLayer == nil { -// let hierarchyTrackingLayer = HierarchyTrackingLayer() -// hierarchyTrackingLayer.didEnterHierarchy = { [weak self] in -// guard let strongSelf = self else { -// return -// } -// strongSelf.trackingIsInHierarchy = true -// } -// -// hierarchyTrackingLayer.didExitHierarchy = { [weak self] in -// guard let strongSelf = self else { -// return -// } -// strongSelf.trackingIsInHierarchy = false -// } -// strongSelf.hierarchyTrackingLayer = hierarchyTrackingLayer -// strongSelf.layer.addSublayer(hierarchyTrackingLayer) -// } -// } else { -// strongSelf.videoContent = nil -// -// strongSelf.hierarchyTrackingLayer?.removeFromSuperlayer() -// strongSelf.hierarchyTrackingLayer = nil -// } -// -// strongSelf.updateVideoVisibility() -// } else { })) } else { self.cachedDataDisposable.set(nil) diff --git a/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift index f3367076ce..8718d4588b 100644 --- a/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageGiftItemNode.swift @@ -416,7 +416,7 @@ class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { } return .url(url: url, concealed: concealed) } else if let peerMention = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerMention)] as? TelegramPeerMention { - return .peerMention(peerMention.peerId, peerMention.mention) + return .peerMention(peerId: peerMention.peerId, mention: peerMention.mention, openProfile: false) } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { return .textMention(peerName) } else if let botCommand = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.BotCommand)] as? String { diff --git a/submodules/TelegramUI/Sources/ChatMessagePollBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessagePollBubbleContentNode.swift index 84eab063fb..508370a227 100644 --- a/submodules/TelegramUI/Sources/ChatMessagePollBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessagePollBubbleContentNode.swift @@ -1703,7 +1703,7 @@ class ChatMessagePollBubbleContentNode: ChatMessageBubbleContentNode { } return .url(url: url, concealed: concealed) } else if let peerMention = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerMention)] as? TelegramPeerMention { - return .peerMention(peerMention.peerId, peerMention.mention) + return .peerMention(peerId: peerMention.peerId, mention: peerMention.mention, openProfile: false) } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { return .textMention(peerName) } else if let botCommand = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.BotCommand)] as? String { diff --git a/submodules/TelegramUI/Sources/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageTextBubbleContentNode.swift index ebac741e74..5851b5bc98 100644 --- a/submodules/TelegramUI/Sources/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageTextBubbleContentNode.swift @@ -582,7 +582,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { } return .url(url: url, concealed: concealed) } else if let peerMention = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerMention)] as? TelegramPeerMention { - return .peerMention(peerMention.peerId, peerMention.mention) + return .peerMention(peerId: peerMention.peerId, mention: peerMention.mention, openProfile: false) } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { return .textMention(peerName) } else if let botCommand = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.BotCommand)] as? String { diff --git a/submodules/TelegramUI/Sources/ChatTranslationPanelNode.swift b/submodules/TelegramUI/Sources/ChatTranslationPanelNode.swift index 1ccf63ee3d..eec1aaf56e 100644 --- a/submodules/TelegramUI/Sources/ChatTranslationPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatTranslationPanelNode.swift @@ -16,6 +16,8 @@ import MoreButtonNode import ContextUI import TranslateUI import TelegramUIPreferences +import TelegramNotices +import PremiumUI final class ChatTranslationPanelNode: ASDisplayNode { private let context: AccountContext @@ -26,7 +28,8 @@ final class ChatTranslationPanelNode: ASDisplayNode { private let buttonIconNode: ASImageNode private let buttonTextNode: ImmediateTextNode private let moreButton: MoreButtonNode - + private let closeButton: HighlightableButtonNode + private var theme: PresentationTheme? private var chatInterfaceState: ChatPresentationInterfaceState? @@ -47,6 +50,11 @@ final class ChatTranslationPanelNode: ASDisplayNode { self.moreButton = MoreButtonNode(theme: context.sharedContext.currentPresentationData.with { $0 }.theme) self.moreButton.iconNode.enqueueState(.more, animated: false) + self.moreButton.hitTestSlop = UIEdgeInsets(top: -8.0, left: -8.0, bottom: -8.0, right: -8.0) + + self.closeButton = HighlightableButtonNode() + self.closeButton.hitTestSlop = UIEdgeInsets(top: -8.0, left: -8.0, bottom: -8.0, right: -8.0) + self.closeButton.displaysAsynchronously = false super.init() @@ -65,6 +73,9 @@ final class ChatTranslationPanelNode: ASDisplayNode { strongSelf.morePressed(node: strongSelf.moreButton.contextSourceNode, gesture: gesture) } } + + self.closeButton.addTarget(self, action: #selector(self.closePressed), forControlEvents: [.touchUpInside]) + self.addSubnode(self.closeButton) } func animateOut() { @@ -90,6 +101,7 @@ final class ChatTranslationPanelNode: ASDisplayNode { self.buttonIconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Title Panels/Translate"), color: interfaceState.theme.chat.inputPanel.panelControlAccentColor) self.moreButton.theme = interfaceState.theme self.separatorNode.backgroundColor = interfaceState.theme.rootController.navigationBar.separatorColor + self.closeButton.setImage(PresentationResourcesChat.chatInputPanelEncircledCloseIconImage(interfaceState.theme), for: []) } if themeUpdated || isEnabledUpdated { @@ -139,6 +151,17 @@ final class ChatTranslationPanelNode: ASDisplayNode { let moreButtonSize = self.moreButton.measure(CGSize(width: 100.0, height: panelHeight)) self.moreButton.frame = CGRect(origin: CGPoint(x: width - contentRightInset - moreButtonSize.width, y: floorToScreenPixels((panelHeight - moreButtonSize.height) / 2.0)), size: moreButtonSize) + let closeButtonSize = self.closeButton.measure(CGSize(width: 100.0, height: 100.0)) + self.closeButton.frame = CGRect(origin: CGPoint(x: width - contentRightInset - closeButtonSize.width, y: floorToScreenPixels((panelHeight - closeButtonSize.height) / 2.0)), size: closeButtonSize) + + if interfaceState.isPremium { + self.moreButton.isHidden = false + self.closeButton.isHidden = true + } else { + self.moreButton.isHidden = true + self.closeButton.isHidden = false + } + let buttonPadding: CGFloat = 10.0 let buttonSpacing: CGFloat = 10.0 let buttonTextSize = self.buttonTextNode.updateLayout(CGSize(width: width - contentRightInset - moreButtonSize.width, height: panelHeight)) @@ -154,12 +177,30 @@ final class ChatTranslationPanelNode: ASDisplayNode { return panelHeight } + @objc private func closePressed() { + let _ = ApplicationSpecificNotice.incrementTranslationSuggestion(accountManager: self.context.sharedContext.accountManager, count: -100, timestamp: Int32(Date().timeIntervalSince1970) + 60 * 60 * 24 * 7).start() + } + @objc private func buttonPressed() { guard let translationState = self.chatInterfaceState?.translationState else { return } - self.interfaceInteraction?.toggleTranslation(translationState.isEnabled ? .original : .translated) + let isPremium = self.chatInterfaceState?.isPremium ?? false + if isPremium { + self.interfaceInteraction?.toggleTranslation(translationState.isEnabled ? .original : .translated) + } else if !translationState.isEnabled { + let context = self.context + var replaceImpl: ((ViewController) -> Void)? + let controller = PremiumDemoScreen(context: context, subject: .translation, action: { + let controller = PremiumIntroScreen(context: context, source: .translation) + replaceImpl?(controller) + }) + replaceImpl = { [weak controller] c in + controller?.replace(with: c) + } + self.interfaceInteraction?.chatController()?.push(controller) + } } @objc private func morePressed(node: ContextReferenceContentNode, gesture: ContextGesture?) { diff --git a/submodules/TelegramUI/Sources/OverlayPlayerControlsNode.swift b/submodules/TelegramUI/Sources/OverlayPlayerControlsNode.swift index 41df961a91..e450ad44e1 100644 --- a/submodules/TelegramUI/Sources/OverlayPlayerControlsNode.swift +++ b/submodules/TelegramUI/Sources/OverlayPlayerControlsNode.swift @@ -36,7 +36,7 @@ private func generateCollapseIcon(theme: PresentationTheme) -> UIImage? { } private func optionsRateImage(rate: String, color: UIColor = .white) -> UIImage? { - return generateImage(CGSize(width: 30.0, height: 16.0), rotatedContext: { size, context in + return generateImage(CGSize(width: 36.0, height: 16.0), rotatedContext: { size, context in UIGraphicsPushContext(context) context.clear(CGRect(origin: CGPoint(), size: size)) @@ -50,7 +50,11 @@ private func optionsRateImage(rate: String, color: UIColor = .white) -> UIImage? var offset = CGPoint(x: 1.0, y: 0.0) var width: CGFloat - if rate.count >= 3 { + if rate.count >= 5 { + string.addAttribute(.kern, value: -0.8 as NSNumber, range: NSRange(string.string.startIndex ..< string.string.endIndex, in: string.string)) + offset.x += -0.5 + width = 33.0 + } else if rate.count >= 3 { if rate == "0.5X" { string.addAttribute(.kern, value: -0.8 as NSNumber, range: NSRange(string.string.startIndex ..< string.string.endIndex, in: string.string)) offset.x += -0.5 @@ -420,6 +424,8 @@ final class OverlayPlayerControlsNode: ASDisplayNode { baseRate = .x2 } else if value.status.baseRate.isEqual(to: 1.5) { baseRate = .x1_5 + } else if value.status.baseRate.isEqual(to: 0.5) { + baseRate = .x0_5 } else { baseRate = .x1 } @@ -786,6 +792,8 @@ final class OverlayPlayerControlsNode: ASDisplayNode { self.rateButton.setImage(optionsRateImage(rate: "2X", color: self.presentationData.theme.list.itemAccentColor), for: []) case .x1_5: self.rateButton.setImage(optionsRateImage(rate: "1.5X", color: self.presentationData.theme.list.itemAccentColor), for: []) + case .x0_5: + self.rateButton.setImage(optionsRateImage(rate: "0.5X", color: self.presentationData.theme.list.itemAccentColor), for: []) default: self.rateButton.setImage(optionsRateImage(rate: "1X", color: self.presentationData.theme.list.itemSecondaryTextColor), for: []) } diff --git a/submodules/TelegramUI/Sources/PeerInfo/Panes/PeerInfoListPaneNode.swift b/submodules/TelegramUI/Sources/PeerInfo/Panes/PeerInfoListPaneNode.swift index a44175621a..af6d37211a 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/Panes/PeerInfoListPaneNode.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/Panes/PeerInfoListPaneNode.swift @@ -262,7 +262,7 @@ final class PeerInfoListPaneNode: ASDisplayNode, PeerInfoPaneNode { strongSelf.context.sharedContext.mediaManager.setPlaylist(nil, type: type, control: SharedMediaPlayerControlAction.playback(.pause)) } } - mediaAccessoryPanel.setRate = { [weak self] rate in + mediaAccessoryPanel.setRate = { [weak self] rate, fromMenu in guard let strongSelf = self else { return } @@ -291,21 +291,28 @@ final class PeerInfoListPaneNode: ASDisplayNode, PeerInfoPaneNode { }) let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } - let slowdown: Bool? + let text: String? + let rate: CGFloat? if baseRate == .x1 { - slowdown = true + text = presentationData.strings.Conversation_AudioRateTooltipNormal + rate = 1.0 + } else if baseRate == .x1_5 { + text = presentationData.strings.Conversation_AudioRateTooltip15X + rate = 1.5 } else if baseRate == .x2 { - slowdown = false + text = presentationData.strings.Conversation_AudioRateTooltipSpeedUp + rate = 2.0 } else { - slowdown = nil + text = nil + rate = nil } - if let slowdown = slowdown { + if let rate, let text, !fromMenu { controller.present( UndoOverlayController( presentationData: presentationData, content: .audioRate( - slowdown: slowdown, - text: slowdown ? presentationData.strings.Conversation_AudioRateTooltipNormal : presentationData.strings.Conversation_AudioRateTooltipSpeedUp + rate: rate, + text: text ), elevatedLayout: false, animateInAsReplacement: hasTooltip, diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift index 2fa0a79bec..9fe87b78e3 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift @@ -2821,7 +2821,7 @@ final class PeerInfoHeaderNode: ASDisplayNode { } titleStringText = title - titleAttributes = MultiScaleTextState.Attributes(font: Font.regular(30.0), color: presentationData.theme.list.itemPrimaryTextColor) + titleAttributes = MultiScaleTextState.Attributes(font: Font.medium(30.0), color: presentationData.theme.list.itemPrimaryTextColor) smallTitleAttributes = MultiScaleTextState.Attributes(font: Font.regular(30.0), color: .white) if self.isSettings, let user = peer as? TelegramUser { diff --git a/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift b/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift index f094a19775..d69d8491e0 100644 --- a/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift @@ -15,26 +15,73 @@ public enum MusicPlaybackSettingsLooping: Int32 { case all = 2 } -public enum AudioPlaybackRate: Int32 { - case x0_5 = 500 - case x1 = 1000 - case x1_5 = 1500 - case x2 = 2000 - case x4 = 4000 - case x8 = 8000 - case x16 = 16000 +public enum AudioPlaybackRate: Equatable { + case x0_5 + case x1 + case x1_5 + case x2 + case x4 + case x8 + case x16 + case custom(Int32) public var doubleValue: Double { return Double(self.rawValue) / 1000.0 } + + public var rawValue: Int32 { + switch self { + case .x0_5: + return 500 + case .x1: + return 1000 + case .x1_5: + return 1500 + case .x2: + return 2000 + case .x4: + return 4000 + case .x8: + return 8000 + case .x16: + return 16000 + case let .custom(value): + return value + } + } public init(_ value: Double) { - if let resolved = AudioPlaybackRate(rawValue: Int32(value * 1000.0)) { - self = resolved - } else { + self.init(rawValue: Int32(value * 1000.0)) + } + + public init(rawValue: Int32) { + switch rawValue { + case 500: + self = .x0_5 + case 1000: self = .x1 + case 1500: + self = .x1_5 + case 2000: + self = .x2 + case 4000: + self = .x4 + case 8000: + self = .x8 + case 16000: + self = .x16 + default: + self = .custom(rawValue) } } + + public var stringValue: String { + var stringValue = String(format: "%.1fx", self.doubleValue) + if stringValue.hasSuffix(".0x") { + stringValue = stringValue.replacingOccurrences(of: ".0x", with: "x") + } + return stringValue + } } public struct MusicPlaybackSettings: Codable, Equatable { @@ -57,7 +104,7 @@ public struct MusicPlaybackSettings: Codable, Equatable { self.order = MusicPlaybackSettingsOrder(rawValue: try container.decode(Int32.self, forKey: "order")) ?? .regular self.looping = MusicPlaybackSettingsLooping(rawValue: try container.decode(Int32.self, forKey: "looping")) ?? .none - self.voicePlaybackRate = AudioPlaybackRate(rawValue: try container.decodeIfPresent(Int32.self, forKey: "voicePlaybackRate") ?? AudioPlaybackRate.x1.rawValue) ?? .x1 + self.voicePlaybackRate = AudioPlaybackRate(rawValue: try container.decodeIfPresent(Int32.self, forKey: "voicePlaybackRate") ?? AudioPlaybackRate.x1.rawValue) } public func encode(to encoder: Encoder) throws { diff --git a/submodules/UndoUI/Sources/UndoOverlayController.swift b/submodules/UndoUI/Sources/UndoOverlayController.swift index 13392ae062..d2d036ff82 100644 --- a/submodules/UndoUI/Sources/UndoOverlayController.swift +++ b/submodules/UndoUI/Sources/UndoOverlayController.swift @@ -26,7 +26,7 @@ public enum UndoOverlayContent { case linkCopied(text: String) case banned(text: String) case importedMessage(text: String) - case audioRate(slowdown: Bool, text: String) + case audioRate(rate: CGFloat, text: String) case forward(savedMessages: Bool, text: String) case autoDelete(isOn: Bool, title: String?, text: String) case gigagroupConversion(text: String) diff --git a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift index b81dc5a47b..d8a51f8f73 100644 --- a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift +++ b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift @@ -540,11 +540,21 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { displayUndo = false } self.originalRemainingSeconds = duration - case let .audioRate(slowdown, text): + case let .audioRate(rate, text): self.avatarNode = nil self.iconNode = nil self.iconCheckNode = nil - self.animationNode = AnimationNode(animation: slowdown ? "anim_voicespeedstop" : "anim_voicespeed", colors: [:], scale: 0.066) + + let animationName: String + if rate == 1.5 { + animationName = "anim_voice1_5x" + } else if rate == 2.0 { + animationName = "anim_voice2x" + } else { + animationName = "anim_voice1x" + } + + self.animationNode = AnimationNode(animation: animationName, colors: [:], scale: 0.066) self.animatedStickerNode = nil let body = MarkdownAttributeSet(font: Font.regular(14.0), textColor: .white) diff --git a/submodules/WebUI/Sources/WebAppController.swift b/submodules/WebUI/Sources/WebAppController.swift index 7d7b62fcea..f00d536de3 100644 --- a/submodules/WebUI/Sources/WebAppController.swift +++ b/submodules/WebUI/Sources/WebAppController.swift @@ -199,6 +199,12 @@ public final class WebAppController: ViewController, AttachmentContainable { private var placeholderNode: ShimmerEffectNode? fileprivate let loadingProgressPromise = Promise(nil) + + fileprivate var mainButtonState: AttachmentMainButtonState? { + didSet { + self.mainButtonStatePromise.set(.single(self.mainButtonState)) + } + } fileprivate let mainButtonStatePromise = Promise(nil) private let context: AccountContext @@ -397,6 +403,9 @@ public final class WebAppController: ViewController, AttachmentContainable { } @objc fileprivate func mainButtonPressed() { + if let mainButtonState = self.mainButtonState, !mainButtonState.isVisible || !mainButtonState.isEnabled { + return + } self.webView?.lastTouchTimestamp = CACurrentMediaTime() self.webView?.sendEvent(name: "main_button_pressed", data: nil) } @@ -635,7 +644,7 @@ public final class WebAppController: ViewController, AttachmentContainable { let isLoading = json["is_progress_visible"] as? Bool let isEnabled = json["is_active"] as? Bool let state = AttachmentMainButtonState(text: text, backgroundColor: backgroundColor, textColor: textColor, isVisible: isVisible, isLoading: isLoading ?? false, isEnabled: isEnabled ?? true) - self.mainButtonStatePromise.set(.single(state)) + self.mainButtonState = state } } case "web_app_request_viewport": @@ -971,7 +980,7 @@ public final class WebAppController: ViewController, AttachmentContainable { if let id = id { paramsString = "{button_id: \"\(id)\"}" } - self.webView?.sendEvent(name: "popup_closed", data: paramsString) + self.webView?.sendEvent(name: "popup_closed", data: paramsString ?? "{}") } fileprivate func sendPhoneRequestedEvent(phone: String?) {