Show room encryption state in the composer (#3841)

* Fixes #3835 - Show room encryption state in the composer

* Update the preview test snapshots

* Update the UI test snapshots.
This commit is contained in:
Stefan Ceriu
2025-02-27 22:16:26 +02:00
committed by GitHub
parent 0c8333cb35
commit 13bbc4b31f
92 changed files with 258 additions and 180 deletions

View File

@@ -353,6 +353,7 @@
"rich_text_editor_bullet_list" = "Toggle bullet list";
"rich_text_editor_close_formatting_options" = "Close formatting options";
"rich_text_editor_code_block" = "Toggle code block";
"rich_text_editor_composer_encrypted_placeholder" = "Encrypted message…";
"rich_text_editor_composer_placeholder" = "Message…";
"rich_text_editor_create_link" = "Create a link";
"rich_text_editor_edit_link" = "Edit link";
@@ -479,9 +480,15 @@
"screen_security_and_privacy_room_publishing_section_header" = "Room publishing";
"screen_security_and_privacy_room_visibility_section_footer" = "Room addresses are ways to find and access rooms. This also ensures you can easily share your room with others.\nThe address is also required to make the room visible in %1$@ public room directory.";
"screen_security_and_privacy_title" = "Security & privacy";
"screen_start_chat_join_room_by_address_invalid_address" = "Not a valid address";
"screen_start_chat_join_room_by_address_placeholder" = "Enter...";
"screen_start_chat_join_room_by_address_room_found" = "Matching room found";
"screen_start_chat_join_room_by_address_room_not_found" = "Room not found";
"screen_start_chat_join_room_by_address_supporting_text" = "e.g. #room-name:matrix.org";
"screen_timeline_item_menu_send_failure_changed_identity" = "Message not sent because %1$@s verified identity has changed.";
"screen_timeline_item_menu_send_failure_unsigned_device" = "Message not sent because %1$@ has not verified all devices.";
"screen_timeline_item_menu_send_failure_you_unsigned_device" = "Message not sent because you have not verified one or more of your devices.";
"screen.start_chat.join_room_by_address_action" = "Join room by address";
"screen_account_provider_form_hint" = "Homeserver address";
"screen_account_provider_form_notice" = "Enter a search term or a domain address.";
"screen_account_provider_form_subtitle" = "Search for a company, community, or private server.";

View File

@@ -353,6 +353,7 @@
"rich_text_editor_bullet_list" = "Toggle bullet list";
"rich_text_editor_close_formatting_options" = "Close formatting options";
"rich_text_editor_code_block" = "Toggle code block";
"rich_text_editor_composer_encrypted_placeholder" = "Encrypted message…";
"rich_text_editor_composer_placeholder" = "Message…";
"rich_text_editor_create_link" = "Create a link";
"rich_text_editor_edit_link" = "Edit link";
@@ -479,9 +480,15 @@
"screen_security_and_privacy_room_publishing_section_header" = "Room publishing";
"screen_security_and_privacy_room_visibility_section_footer" = "Room addresses are ways to find and access rooms. This also ensures you can easily share your room with others.\nThe address is also required to make the room visible in %1$@ public room directory.";
"screen_security_and_privacy_title" = "Security & privacy";
"screen_start_chat_join_room_by_address_invalid_address" = "Not a valid address";
"screen_start_chat_join_room_by_address_placeholder" = "Enter...";
"screen_start_chat_join_room_by_address_room_found" = "Matching room found";
"screen_start_chat_join_room_by_address_room_not_found" = "Room not found";
"screen_start_chat_join_room_by_address_supporting_text" = "e.g. #room-name:matrix.org";
"screen_timeline_item_menu_send_failure_changed_identity" = "Message not sent because %1$@s verified identity has changed.";
"screen_timeline_item_menu_send_failure_unsigned_device" = "Message not sent because %1$@ has not verified all devices.";
"screen_timeline_item_menu_send_failure_you_unsigned_device" = "Message not sent because you have not verified one or more of your devices.";
"screen.start_chat.join_room_by_address_action" = "Join room by address";
"screen_account_provider_form_hint" = "Homeserver address";
"screen_account_provider_form_notice" = "Enter a search term or a domain address.";
"screen_account_provider_form_subtitle" = "Search for a company, community, or private server.";

View File

@@ -846,6 +846,8 @@ internal enum L10n {
internal static var richTextEditorCodeBlock: String { return L10n.tr("Localizable", "rich_text_editor_code_block") }
/// Add a caption
internal static var richTextEditorComposerCaptionPlaceholder: String { return L10n.tr("Localizable", "rich_text_editor_composer_caption_placeholder") }
/// Encrypted message
internal static var richTextEditorComposerEncryptedPlaceholder: String { return L10n.tr("Localizable", "rich_text_editor_composer_encrypted_placeholder") }
/// Message
internal static var richTextEditorComposerPlaceholder: String { return L10n.tr("Localizable", "rich_text_editor_composer_placeholder") }
/// Create a link
@@ -2458,6 +2460,16 @@ internal enum L10n {
internal static var screenSignoutSaveRecoveryKeyTitle: String { return L10n.tr("Localizable", "screen_signout_save_recovery_key_title") }
/// An error occurred when trying to start a chat
internal static var screenStartChatErrorStartingChat: String { return L10n.tr("Localizable", "screen_start_chat_error_starting_chat") }
/// Not a valid address
internal static var screenStartChatJoinRoomByAddressInvalidAddress: String { return L10n.tr("Localizable", "screen_start_chat_join_room_by_address_invalid_address") }
/// Enter...
internal static var screenStartChatJoinRoomByAddressPlaceholder: String { return L10n.tr("Localizable", "screen_start_chat_join_room_by_address_placeholder") }
/// Matching room found
internal static var screenStartChatJoinRoomByAddressRoomFound: String { return L10n.tr("Localizable", "screen_start_chat_join_room_by_address_room_found") }
/// Room not found
internal static var screenStartChatJoinRoomByAddressRoomNotFound: String { return L10n.tr("Localizable", "screen_start_chat_join_room_by_address_room_not_found") }
/// e.g. #room-name:matrix.org
internal static var screenStartChatJoinRoomByAddressSupportingText: String { return L10n.tr("Localizable", "screen_start_chat_join_room_by_address_supporting_text") }
/// Message not sent because %1$@s verified identity has changed.
internal static func screenTimelineItemMenuSendFailureChangedIdentity(_ p1: Any) -> String {
return L10n.tr("Localizable", "screen_timeline_item_menu_send_failure_changed_identity", String(describing: p1))
@@ -2862,6 +2874,13 @@ internal enum L10n {
/// You
internal static var you: String { return L10n.tr("Localizable", "common.you") }
}
internal enum Screen {
internal enum StartChat {
/// Join room by address
internal static var joinRoomByAddressAction: String { return L10n.tr("Localizable", "screen.start_chat.join_room_by_address_action") }
}
}
}
// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces

View File

@@ -15,6 +15,7 @@ struct MediaUploadPreviewScreenViewState: BindableState {
let url: URL
let title: String?
let shouldShowCaptionWarning: Bool
let isRoomEncrypted: Bool
var shouldDisableInteraction = false
var bindings = MediaUploadPreviewScreenBindings()

View File

@@ -40,7 +40,10 @@ class MediaUploadPreviewScreenViewModel: MediaUploadPreviewScreenViewModelType,
// Start processing the media whilst the user is reviewing it/adding a caption.
processingTask = Task { await mediaUploadingPreprocessor.processMedia(at: url) }
super.init(initialViewState: MediaUploadPreviewScreenViewState(url: url, title: title, shouldShowCaptionWarning: shouldShowCaptionWarning))
super.init(initialViewState: MediaUploadPreviewScreenViewState(url: url,
title: title,
shouldShowCaptionWarning: shouldShowCaptionWarning,
isRoomEncrypted: roomProxy.isEncrypted))
}
override func process(viewAction: MediaUploadPreviewScreenViewAction) {

View File

@@ -69,7 +69,7 @@ struct MediaUploadPreviewScreen: View {
captionWarningButton
}
}
.messageComposerStyle()
.messageComposerStyle(isEncrypted: context.viewState.isRoomEncrypted)
SendButton {
context.send(viewAction: .send)
@@ -228,7 +228,7 @@ struct MediaUploadPreviewScreen_Previews: PreviewProvider, TestablePreview {
static let testURL = Bundle.main.url(forResource: "AppIcon60x60@2x", withExtension: "png")
static let viewModel = MediaUploadPreviewScreenViewModel(userIndicatorController: UserIndicatorControllerMock.default,
roomProxy: JoinedRoomProxyMock(),
roomProxy: JoinedRoomProxyMock(.init()),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings),
title: "App Icon.png",
url: snapshotURL,

View File

@@ -73,6 +73,8 @@ struct ComposerToolbarViewState: BindableState {
var audioPlayerState: AudioPlayerState
var audioRecorderState: AudioRecorderState
let isRoomEncrypted: Bool
var bindings: ComposerToolbarViewStateBindings
var isUploading: Bool {

View File

@@ -66,6 +66,7 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
title: L10n.commonVoiceMessage,
duration: 0),
audioRecorderState: .init(),
isRoomEncrypted: roomProxy.isEncrypted,
bindings: .init()),
mediaProvider: mediaProvider)

View File

@@ -157,9 +157,11 @@ struct ComposerToolbar: View {
selectedRange: $context.selectedRange,
composerView: composerView,
mode: context.viewState.composerMode,
placeholder: placeholder,
composerFormattingEnabled: context.composerFormattingEnabled,
showResizeGrabber: context.composerFormattingEnabled,
isExpanded: $context.composerExpanded) {
isExpanded: $context.composerExpanded,
isEncrypted: context.viewState.isRoomEncrypted) {
sendMessage()
} editAction: {
context.send(viewAction: .editLastMessage)
@@ -222,8 +224,16 @@ struct ComposerToolbar: View {
private var placeholder: String {
switch context.viewState.composerMode {
case .reply(_, _, let isThread):
return isThread ? L10n.actionReplyInThread : L10n.richTextEditorComposerPlaceholder
return isThread ? L10n.actionReplyInThread : composerPlaceholder
default:
return composerPlaceholder
}
}
private var composerPlaceholder: String {
if context.viewState.isRoomEncrypted {
return L10n.richTextEditorComposerEncryptedPlaceholder
} else {
return L10n.richTextEditorComposerPlaceholder
}
}

View File

@@ -16,11 +16,16 @@ struct MessageComposer: View {
@Binding var plainComposerText: NSAttributedString
@Binding var presendCallback: (() -> Void)?
@Binding var selectedRange: NSRange
let composerView: WysiwygComposerView
let mode: ComposerMode
let placeholder: String
let composerFormattingEnabled: Bool
let showResizeGrabber: Bool
@Binding var isExpanded: Bool
let isEncrypted: Bool
let sendAction: () -> Void
let editAction: () -> Void
let pasteAction: PasteHandler
@@ -37,7 +42,7 @@ struct MessageComposer: View {
}
composerTextField
.messageComposerStyle(header: header)
.messageComposerStyle(header: header, isEncrypted: isEncrypted)
// Explicitly disable all animations to fix weirdness with the header immediately
// appearing whilst the text field and keyboard are still animating up to it.
.animation(.noAnimation, value: mode)
@@ -64,7 +69,7 @@ struct MessageComposer: View {
onAppearAction()
}
} else {
MessageComposerTextField(placeholder: L10n.richTextEditorComposerPlaceholder,
MessageComposerTextField(placeholder: placeholder,
text: $plainComposerText,
presendCallback: $presendCallback,
selectedRange: $selectedRange,
@@ -195,8 +200,8 @@ private struct MessageComposerHeaderLabelStyle: LabelStyle {
// MARK: - Style
extension View {
func messageComposerStyle(header: some View = EmptyView()) -> some View {
modifier(MessageComposerStyleModifier(header: header))
func messageComposerStyle(header: some View = EmptyView(), isEncrypted: Bool) -> some View {
modifier(MessageComposerStyleModifier(header: header, isEncrypted: isEncrypted))
}
}
@@ -204,14 +209,20 @@ private struct MessageComposerStyleModifier<Header: View>: ViewModifier {
private let composerShape = RoundedRectangle(cornerRadius: 21, style: .circular)
let header: Header
let isEncrypted: Bool
func body(content: Content) -> some View {
VStack(alignment: .leading, spacing: -6) {
header
content
.tint(.compound.iconAccentTertiary)
.padding(.vertical, 10)
HStack(alignment: .top, spacing: 6) {
icon
.scaledOffset(y: 2)
content
.tint(.compound.iconAccentTertiary)
}
.padding(.vertical, 10)
}
.padding(.horizontal, 12.0)
.clipShape(composerShape)
@@ -224,6 +235,17 @@ private struct MessageComposerStyleModifier<Header: View>: ViewModifier {
}
}
}
@ViewBuilder
private var icon: some View {
if isEncrypted {
CompoundIcon(\.lockSolid, size: .xSmall, relativeTo: .compound.bodyMD)
.foregroundStyle(.compound.iconSuccessPrimary)
} else {
CompoundIcon(\.lockOff, size: .xSmall, relativeTo: .compound.bodyMD)
.foregroundStyle(.compound.iconTertiary)
}
}
}
// MARK: - Previews
@@ -274,7 +296,8 @@ struct MessageComposer_Previews: PreviewProvider, TestablePreview {
]
static func messageComposer(_ content: NSAttributedString = .init(string: ""),
mode: ComposerMode = .default) -> MessageComposer {
mode: ComposerMode = .default,
placeholder: String = L10n.richTextEditorComposerEncryptedPlaceholder) -> MessageComposer {
let viewModel = WysiwygComposerViewModel(minHeight: 22,
maxExpandedHeight: 250)
viewModel.setMarkdownContent(content.string)
@@ -290,9 +313,11 @@ struct MessageComposer_Previews: PreviewProvider, TestablePreview {
selectedRange: .constant(NSRange(location: 0, length: 0)),
composerView: composerView,
mode: mode,
placeholder: placeholder,
composerFormattingEnabled: false,
showResizeGrabber: false,
isExpanded: .constant(false),
isEncrypted: false,
sendAction: { },
editAction: { },
pasteAction: { _ in },
@@ -307,14 +332,16 @@ struct MessageComposer_Previews: PreviewProvider, TestablePreview {
messageComposer(.init(string: "Some message"),
mode: .edit(originalEventOrTransactionID: .eventID(UUID().uuidString), type: .default))
let longMessage = "Short loin ground round tongue hamburger, fatback salami shoulder. Beef turkey sausage kielbasa strip steak. Alcatra capicola pig tail pancetta chislic."
messageComposer(.init(string: longMessage),
mode: .edit(originalEventOrTransactionID: .eventID(UUID().uuidString), type: .default))
messageComposer(mode: .reply(eventID: UUID().uuidString,
replyDetails: .loaded(sender: .init(id: "Kirk"),
eventID: "123",
eventContent: .message(.text(.init(body: "Text: Where the wild things are")))),
isThread: false))
Color.clear.frame(height: 20)
messageComposer(.init(string: "Some new caption"),
mode: .edit(originalEventOrTransactionID: .eventID(UUID().uuidString), type: .addCaption))
messageComposer(.init(string: "Some updated caption"),
@@ -338,7 +365,8 @@ struct MessageComposer_Previews: PreviewProvider, TestablePreview {
VStack(spacing: 8) {
ForEach(replyTypes, id: \.self) { replyDetails in
messageComposer(mode: .reply(eventID: UUID().uuidString,
replyDetails: replyDetails, isThread: true))
replyDetails: replyDetails, isThread: true),
placeholder: L10n.actionReplyInThread)
}
}
}

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:888932f08b86692e4ed6d35aa438a1fa4839a0247ef4d4e8109f9f4d2902a2a7
size 75306
oid sha256:20c7f94aafc307ea2ce0e8061e5f72857bc4dd27721e72382dd6dd1fce8afc32
size 78099

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a582ff37f77d4a6106eb386f136598990ed0821fed095db3705680356fe5d30d
size 75209
oid sha256:5dc23add158cbd10a36e303dc29b548c53c83d4197e3e8e1fc521d4d4a9e9027
size 77972

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3005df9a148c026be35620606d64fd479601439bf2bdda4d3d56113d121464d7
size 93485
oid sha256:b1eeca84153cbb50b77a8bbbd354e5c282a950d81e8768a3c996effb73cd0694
size 99063

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:179231b4119308cd7c00233f00de90e943558d1aabbe94d5107455ccde161e24
size 98675
oid sha256:dea10b31ec119f1ceaa8634612a763ef65b7df778917f48ae78439812603fbc3
size 103997

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:192b1ef4efcd91ca133e9328ebaa8fdb5c1aa8f58a64db9bfdebbf4973e9b734
size 108043
oid sha256:69030a8ea3711b178c389e9e3426cda11ed63b161f5c5dad1c59c2bb25c4f02a
size 110836

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d546bdab2d2ff0d1f674bc5f5d7583f7a60c338a8ee6e94041ed4ed07a106a31
size 75724
oid sha256:6b1ef9e8825526aaae1ffd46b8be5e591059631829c586f427191ddf96c2d4fa
size 78747

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5664b9a568d35763da35eea9ecac2732971d6b76baef992d387eb689916f13e3
size 75627
oid sha256:5305b2358bcac4489ca120a6b72a1fbb593839d95d3bb30f18cf5dd64006eb09
size 78656

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b9c15c54c93c21400eb263cbc0575f86d1c47377d2f73a2fe59ec8d7886914e3
size 94359
oid sha256:18512ae1eb37ae4ad5fbbfd35f6e0b199507a85dae8756b1ddb99e2de4b8afdd
size 100424

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2b98edfa6801c0208c3c86e52e48c64d2ee54ec5c1085348a8ab8ca5365fa577
size 99472
oid sha256:fd65fa3cd9eda7223978030b2f2e06deaf9cc0b4bf34feb8239529a858dbd85c
size 105319

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:49621f6dc2018b2cc8f8617944e62e0650dd2b919f4078e89acb24976a963973
size 108461
oid sha256:7da48500843dbfa859a629c093312e73e6ea8b4487ffc1b570dff1956a76796c
size 111484

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d4a497fc8cb28e5187c80bf8caec98e69c9faec1ed153b1c2beaa52aa8cd8ae1
size 34435
oid sha256:9b76cded01d35d8db52113719fa019b12b25a094390cbb425b47bd6445096b8e
size 36950

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fe562e2446e07d30c5b2b93c19d567ea4f1be3ed503c8029c72aad22a74800aa
size 34263
oid sha256:254cc9c6d91e730014e42bc8ae11d6a615eda8dab3e38dca58692c6bf1e12d9a
size 36810

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:942b0ff59359bbfe7a1ae88f7acf44b856f763d91688bac8ad173a7eda405972
size 50565
oid sha256:da0266be9530241c021948dd2fda83b0b69a12f95fbf2cf1a8b635c79f58245d
size 55522

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b23b6fa54712013ff8dbf2b4e79163f3674f5228de362cc7c00a3b8a77b6a441
size 56148
oid sha256:06384e017b2b3503d2be917f8777e23a05d31eb38098fb18f8e91d378f403569
size 60732

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0d89a6f14dba919985df0b11dcb48e27f72ed35c06d80550b0016c2de7f0bd28
size 62601
oid sha256:1acd34c1ea1fba52446c0e6f5facf1b5590072e98d9365ab48ed1e7b11374e10
size 65116

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:67d481416b45627802785280c9dd03bc5f634902b64a4beacd567b42fd0a444c
size 34849
oid sha256:b2a71ed2485c6627cdbf9f6a0f03d907b6a24523f9e954b870cafc4393daace6
size 37086

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:820597003dbb92d692e7fc45314af9fff8b50ffc42cede115b65ce12ebf992a0
size 34687
oid sha256:8349635a7a6274de936d444fd4caae7ef7559874e6c42334b6ad5d3dfbc14565
size 36951

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9c9ed32588b6de5c4c2c87c14a54a4d436648518cf6b7807a16a39be20332778
size 51436
oid sha256:d9180cfb3e64e0fe6629ff944cd4f6bb3b818e683ffc613813649fc4f47a3a94
size 55848

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:45f1cd517d9a670f11159feab5b07cec1197760449551db46cf33f50b514969b
size 56980
oid sha256:696d852483597a50af681aeda472817564530b5985991f08871823ecaa767eb3
size 60979

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:129a3072d9da6bb83c2296ca7de6d4e5a32da74cd80b0ac62f0f7feefbe753f5
size 63015
oid sha256:ca1736925413ad1499e0598b38549b477206a235ca53c653754a0a6fe8074f8c
size 65252

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2a50f4860f6ce3fc2aff3a3f8a4d72899cda87c25fd4c9ec935cc623c9548c05
size 89566
oid sha256:5b0e05f48010a5ca49d7fba85f6ad27cafdc0fced7402c99cafdf27c0a0efdbc
size 90006

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4443b88f50798db3ddf789a3a1daf69b45158e799801e51e0a6604840af9b811
size 84527
oid sha256:801c568c186b2c75ddddeffb0839310a39c70ff2eaa705acb3722980b26f80c0
size 84556

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2fb4fdb396dd0828f9fa2704f5255663d11dc56986de6b69e5ce5391c33b5cad
size 90595
oid sha256:27c61a1260a9851e069cf9d8a13b8783a3e1651348363bbeaf18edc7c5320194
size 91003

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:babfab486bcb62122404c32f1268e3f6ce486c7ac1942de40e3fd754260c2e9a
size 89371
oid sha256:96fe85211bea53fca31ed2ed69faa4f66b16e7116f744041f06224752f5c4582
size 89400

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bfedafcdcf81ac2f74ae00c10d8c04445507a9f64c3b35685958d35099b773c4
size 48446
oid sha256:d1d2070c7c9a173a6008a6133d55583474310edc1a8b14d79959b26483b9f6df
size 48914

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:74e2863ec160d47570f9d8c512d5dc4c6afa50ce0f2fb6cd7520a4bfb287f4dc
size 43826
oid sha256:b7620187fecc4d8b704af670c49fc487fadfacd7d20217a85875cc8394a90edf
size 43853

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:566f7e7e5f227f2b13a76ffcb876007be5e5e6f06df89a23a6a424f84bf35e98
size 49303
oid sha256:a7ab85837a799fe29918da344b3ff02e3bba7b12414f999b0664744757fa2c64
size 49668

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d1ea4d6009691a8079ae6d788dda3d9ea3c28d45451ad31278dbe8dfc399e2f7
size 54743
oid sha256:bfaaca8efefee3620c7b5369a5fd3681988caa88fc7ae86da9567265cebd15cc
size 54777

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:389426d51309b08493728679fe367ca3469d0f7962423c10ea3b2b599685599c
size 125743
oid sha256:a68626a1af3b7e3561a30fe38cbb66fbc86f2466a193f3d3eef19964ef6f3f85
size 160536

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2f616439ead73d35b6df079617fef50a5734df909f4d9d941cf52073ca413228
size 209516
oid sha256:99ea04a7792f758dc3ce06882d2ced1e983ae8fb7e2820f810b42c6e991e3182
size 221543

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2f616439ead73d35b6df079617fef50a5734df909f4d9d941cf52073ca413228
size 209516
oid sha256:e5530c4f32a6b94acf8766f159c26defdd69e5ef3ca39014aa75059995de3674
size 230540

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:037ea34c80269e1a2761710c061aad688fbdf32d41b667c01b83ef027f9ea319
size 129460
oid sha256:94b7b1cee36ea65eda1dd7e378b94776e0c5af208e0204f507ad887a12ed6d91
size 165331

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0955313e30b556ee8de730161b7681f59c9d71162f4f8bcf1e6e69e10b778384
size 212813
oid sha256:111ad2e77490009589319c16a575edb44f70ee0f12a2dd78ada219715421f96e
size 227072

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0955313e30b556ee8de730161b7681f59c9d71162f4f8bcf1e6e69e10b778384
size 212813
oid sha256:26b5f1b741b5ec613a0f34504e4847d1bbef2a0427d4b609d92db3cf291f0497
size 235429

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a55833e52c9f9bee6ba1b5162f69f3f650ae7a1965ff89f03533e7b8b40cabd4
size 76082
oid sha256:10419fc88b86bebf86e9e4280698f3c5c13ad6a8e9f82f6c668813e3159dba9c
size 115381

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a4be71b18cbe50998793bc4bafaf830fd4cd31e6f6fd7b1a4910f12372a30e0a
size 147110
oid sha256:78ad6991271b63169ce20a6423952c04fad6fc3967759b3a8e27c2d625568aab
size 157432

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a4be71b18cbe50998793bc4bafaf830fd4cd31e6f6fd7b1a4910f12372a30e0a
size 147110
oid sha256:ca7454121c9b78feba392649e2ae543bb7936f5e423bb553ac1af8b36a2099a6
size 165791

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a934bf0353d41916807d166a1b49b8cb9732a2fd791605a0c3ffdbac387fab8a
size 80923
oid sha256:cd3186b58ab7448946957971da7eabf396f4c55126b9e2ff36d08c83072e5c3e
size 121065

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f4453d285339899371d1dacac45686965c1078aef89f2d559c17b82455b19ea9
size 150416
oid sha256:4f419b0240528a486b3bc8279b94dfc187c245998174d612ac9e2ca5319c8c4b
size 163406

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f4453d285339899371d1dacac45686965c1078aef89f2d559c17b82455b19ea9
size 150416
oid sha256:eea26b273d98ef893f939e7205b113d4176b690926f6fbcb66ea07f83f7fde0b
size 169148

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:02b4de01b6f3291309fdef1755bf2d1a4e989cecd777766394d512ef330fbfea
size 295904
oid sha256:c4e0d9e45e26a657c190a2296cd6e7ed8027e11179c854a90e9b598c70bb4c31
size 298620

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7be7c4f878b08ae3724587db110a3ea3ec1133f9731aca59924776ec59b54c66
size 304445
oid sha256:c012d2504d3d8ca2be92adfb6c4826697e055ce234563d01caa1899a1b397c70
size 307459

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5236d9950c7d6179f4351b486bedb519e2afb29f65603d1ee3fea9b862936ba7
size 181809
oid sha256:e5fba6d75a0a7bb18b4e37feb2c77b953794cd81e2f8d84d4c996d6e2858817b
size 184113

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3a9027ee84e95fa1b65e7287b311a109f829302563216d57b0f4a72fbb0fcedf
size 180206
oid sha256:f5594c6f76f5205aec0e0b5cafff32f5e436699b1f1d3df1999397f307465220
size 182258

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:02b4de01b6f3291309fdef1755bf2d1a4e989cecd777766394d512ef330fbfea
size 295904
oid sha256:c4e0d9e45e26a657c190a2296cd6e7ed8027e11179c854a90e9b598c70bb4c31
size 298620

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7be7c4f878b08ae3724587db110a3ea3ec1133f9731aca59924776ec59b54c66
size 304445
oid sha256:c012d2504d3d8ca2be92adfb6c4826697e055ce234563d01caa1899a1b397c70
size 307459

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5236d9950c7d6179f4351b486bedb519e2afb29f65603d1ee3fea9b862936ba7
size 181809
oid sha256:e5fba6d75a0a7bb18b4e37feb2c77b953794cd81e2f8d84d4c996d6e2858817b
size 184113

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3a9027ee84e95fa1b65e7287b311a109f829302563216d57b0f4a72fbb0fcedf
size 180206
oid sha256:f5594c6f76f5205aec0e0b5cafff32f5e436699b1f1d3df1999397f307465220
size 182258

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:06a4bfd8666b71f2bfb2edd761cd9e79b7dc9742757e3780fe99c7a40a7178bf
size 317180
oid sha256:7d99b7174b12dbee4b2295f4ec0b1d6bbf8c0c8d7348bf248d7f2ce95e7106e7
size 319473

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ad49ba0f068072ba113f3dcde7d81a6ba46da16bed09d3022ea211088a7f8e69
size 330727
oid sha256:1e391290850c24d32c3da9232f517aceacd53ab22c924b5f6df05cd6f1d9437b
size 334262

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:25ddec8f8da76c698223713555f21f6d01b786f0a373292dc4099fe17c414b5b
size 325303
oid sha256:61085e41b9c0882d5888d013b9a62b4d467ad3125bbc5a6e3e40149696bb02a2
size 327621

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4755408ff1a9b9c6b05b17d303564ae6cda15c5e5daac18fd9ad03d01acf5043
size 320796
oid sha256:0a3f0fd02ed1c9a9182e84271f7c027aadb52f01a9240de753db830be78362d4
size 324152

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:029bb82d5b816441648342e7cdedb853dbbdc32eb8b5c3d84803ac0ea506fc92
size 224246
oid sha256:2723cb768dbfcfa3b662c25f84e1cb70e7d6cd694c0f8e2a73fcf6fa17b1f18a
size 226445

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:594909b3f5e94f7aa55387e477f028c555bd2bbcc1e6f5fb98247a278fef1989
size 318035
oid sha256:d069c8623908ae6e5efe367466f05cb8daf672c424d5188d4745f1f7d5aef56d
size 321394

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3248cd5339241604fd9812841bb82d9f78b0e4f267673ced23bdcaeb33f24f7c
size 328469
oid sha256:449ae9c7e7c776fc48a81e2ef61ac5e373ba02b80372837a6ad2ce3729eff1fe
size 330508

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c5f85d7ed5577edf82386fe5afa183c2bc6127993f6337dfa4a8bbd10e0626e7
size 353653
oid sha256:3fc751079b9284ae9fabf18ec52491bc03f23533c83d1d43025eb5bbe67404cd
size 357144

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:479b7eedb90b238436d89ff1c42ad786796692df62c02775c74475742fa3b386
size 295544
oid sha256:1967654aa9c1cc24e6dd3c327442d82132e4dec86119da9d564aa87fef3c6ce6
size 296706

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d02ff8334acfb26b5da2948d4b16a6418bdbd221f25d1366d4ef61038bf66d86
size 372224
oid sha256:97eddfd3f9ca27e9b82ad2b119bc3433bac303e6d0d54e348f898be80f72a268
size 375757

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cda1f1fd762b3d6b182efbcb6fa760cf2bfd6bfe4c4407137ec5509ccb23de11
size 112646
oid sha256:2e034d29049b362cb267d295a137aec01dfa27dd7ecbf43b9db77d6c52e2891c
size 115040

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b61b00dadaf64143643dd95f076c172c303f9ae9aeeb046e92d88fc2e6c744b3
size 185798
oid sha256:88d67f6bb8c0c89bb11bd9077e7ef40d9d87c8850c26c9dcb94bfe37467ed453
size 189455

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:815c3c9478abc32c7c261aeacd1038f4979e0dc44887ba907da7432563dfa7e5
size 135369
oid sha256:42c861bf657720b42a16559e9676be680a0a2e42cf68e53961216752958e7dde
size 137656

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:de71e6878a4c12f3ab35903f1aa3826c7fa22b651a043f9fbfe089f2c887a51c
size 218965
oid sha256:9f0eb582c4670cfa69648653b2d6ccad1e3779f6c36661aaf5c19bfbdefcbf0c
size 222490

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:454f97e14ec2be9798dcb58fdb127297080ebedc236d8dd9aa0780bbac86f8f1
size 323638
oid sha256:845ffc47cd0b927be69b2ba299622d41f869dde016ec2ae94dfe79201f17d1cb
size 325914

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ebe827991c38248038d7cf677f10a12232653bc7ebbd544ae0ed37dcee49ffd4
size 342559
oid sha256:0e9ba53fb23393f2f6959387ef1375adb993b28ff5c8c7012701e24658aa9ec5
size 346041

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c6700421a685dd6f74c123fb479061405ea1c9d29cc65ee737d125f2ce2c1f6e
size 133653
oid sha256:e8a9aa5aab67d29e652f246530e0d4aafe5832d6c5f7e6462b3910174800bb20
size 136876

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d56da75647d608783600e1b547d063b535eab3dda279b37081181c185f2749fb
size 215480
oid sha256:5558d6324f5bc4c9e4476b0481f45efa7788f486e6c2f8393789c67a583e369a
size 219119

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:23479e652fb464efaa375806ff72e604d3c82f10140e45f7390e7bbed020d14c
size 182778
oid sha256:312c2d88b9e9ff17f579c9a3d8a04351e66420afdd7a4afbb54b8662c21f8aff
size 185136

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:68548250c166011e9bea4705ba5cfc5d207ae420a9ae6190273611c08efc5aa9
size 293995
oid sha256:d02fbff2928d8fcdc9af5268a098086f0a9d41acbc759f5986f42f99e6205f6d
size 297568

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:22510a0b9ddf09e54b4dfa667c5b1dbc010cbf66511a3f2df01a38910a1db6c0
size 147047
oid sha256:135b4ab6c1271600fce85ef649292af519f864b2bdb719134ec3078fe2700349
size 149448

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:93cf760997a7c6a559ff2f6a371b2a1cf7ffe7749dadd2f4d21d433670d8d6ae
size 236047
oid sha256:1e9f64a130395389e0dc492beb1838434834a0e9762bdcf48bbb7c47b746b48a
size 239562

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:285cd3295a8187767b64b0b6fc371f3cc0daa9e9c5afe67b07b350693b77c773
size 179546
oid sha256:6153ff3e6d932190f53d213cd6d63b307b1fcd46ed21fc84a10c4a51f40e2d2f
size 181836

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cb6bacec6f676980e6d137929beec8c02ef5893d398cc2e179f5522928c9836c
size 290718
oid sha256:7434e7f45402e02d6a8a021fff4529d3661a1107bbb7ead15ebc92079c2d95fe
size 294291

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3cfb6262b71be34c8ed13ae95cff85f56376804f6b059e35c0a06586708e8037
size 464169
oid sha256:fda9af36d26bc622f3c91f23c8d335208046df8b2c3e399588ce634dc9f8ea8d
size 466475

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dc9710066ebbce0294f6aa1e67d5d9feb01be9b214f211b8d52a7ff463ad49fe
size 338896
oid sha256:4f0496c8e9732c486ebeed481915868936c78b53ed0b68bf8ebdf24be9257b15
size 342476

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:df1c3b6b3998a7c7faaf905ce7f6774c436e8e4669d1c6653142d80692e337d3
size 748646
oid sha256:6ddea217aea2d3124b5033bac7e9a3c129b2ecf2528e80178237498708cdd4ce
size 751396

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9a596f98163137b3f2cc0a23ee8be71aaf67b91e9db3d04abfd9fe8f1819ca64
size 864249
oid sha256:45635863c781c67bcdf62bc54360d2d136895feff189f5c7fa135d1981f7f79a
size 868451

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:81d491a57b62a5ab9c4375c5ce72f8fce267936314471da3911612ba702f810b
size 466906
oid sha256:667572bf898e9a281b78e8d54690ad6602bc0ecfd0ec122bdd0fc83336f1d966
size 467618

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:abe323ed4325fa376cfb5d3384c430e2654f85d4589dfe7a9722939ea5e0b387
size 331236
oid sha256:c07ab274c5d41eb138f646a5fe3a69b59647a47c527aadeb59d7f8676ec2ca94
size 334611