Tweak the flow for disabling key storage. (#3464)

* Refactor RoundedLabelItem into the Compound VisualListItem component.

* Update the design of SecureBackupKeyBackupScreen.

* Add a hint to the key storage toggle when disabled.
This commit is contained in:
Doug
2024-10-29 17:39:55 +00:00
committed by GitHub
parent c11e49f962
commit 368226fd57
33 changed files with 107 additions and 102 deletions
+4 -4
View File
@@ -861,7 +861,6 @@
BC7CA1379D7C24F47B1B8B7E /* PaginationIndicatorRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E7F7A975514E850A834B29F /* PaginationIndicatorRoomTimelineView.swift */; };
BCC864190651B3A3CF51E4DF /* MediaFileHandleProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEC1D382565A4E9CAC2F14EA /* MediaFileHandleProxy.swift */; };
BD0BE20DBCE31253AE4490A1 /* RoomListFiltersEmptyStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC1DDB2293A51EA4C2739351 /* RoomListFiltersEmptyStateView.swift */; };
BD11E639CF566A9DA8FCA717 /* RoundedLabelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */; };
BD6685592716CA957D7BAAC4 /* RoomChangeRolesScreenSelectedItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9B45D584D232CB9E5C7734 /* RoomChangeRolesScreenSelectedItem.swift */; };
BD782053BE4C3D2F0BDE5699 /* ServiceLocator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F95CADD0A5DBD76B990FCB /* ServiceLocator.swift */; };
BDA68E8D95B2B24B28825B8B /* LoginScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C368CAB3063EF275357ECD4 /* LoginScreenViewModel.swift */; };
@@ -1073,6 +1072,7 @@
EEAE954289DE813A61656AE0 /* LayoutDirection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C14D83B2B7CD5501A0089EFC /* LayoutDirection.swift */; };
EEB9C1555C63B93CA9C372C2 /* EmojiPickerScreenHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B5E29E9A22F45534FBD5B58 /* EmojiPickerScreenHeaderView.swift */; };
EEC40663922856C65D1E0DF5 /* KeychainControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */; };
EED33AFD9334EFD7398707A6 /* VisualListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD529C89924EE32CE307F36F /* VisualListItem.swift */; };
EF0D0155DD104C7A41A2EB0E /* PlainMentionBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE78FA0011E07920AE83135 /* PlainMentionBuilder.swift */; };
EF47D802A404A53F15D5D4B6 /* JoinRoomScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD7C0A2750998C2D77AD00F /* JoinRoomScreenViewModel.swift */; };
EF5009AC03212227131C8AF2 /* RoomNotificationSettingsProxyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E55B5EA766E89FF1F87C3ACB /* RoomNotificationSettingsProxyProtocol.swift */; };
@@ -1958,6 +1958,7 @@
ACD7BD6BEE21264F6677904A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
AD0FF64B0E6470F66F42E182 /* EstimatedWaveformView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstimatedWaveformView.swift; sourceTree = "<group>"; };
AD378D580A41E42560C60E9C /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = "<group>"; };
AD529C89924EE32CE307F36F /* VisualListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualListItem.swift; sourceTree = "<group>"; };
AD558A898847C179E4B7A237 /* SecureBackupKeyBackupScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupKeyBackupScreen.swift; sourceTree = "<group>"; };
AD6B522BD637845AB9570B10 /* RoomNotificationSettingsProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomNotificationSettingsProxy.swift; sourceTree = "<group>"; };
AD6E082B0507FB28F966516A /* CallNotificationRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallNotificationRoomTimelineView.swift; sourceTree = "<group>"; };
@@ -2175,7 +2176,6 @@
DCF239C619971FDE48132550 /* SecureBackupLogoutConfirmationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupLogoutConfirmationScreenModels.swift; sourceTree = "<group>"; };
DD97F9661ABF08CE002054A2 /* AppLockServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockServiceTests.swift; sourceTree = "<group>"; };
DE5127D6EA05B2E45D0A7D59 /* JoinRoomScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreenViewModelTests.swift; sourceTree = "<group>"; };
DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedLabelItem.swift; sourceTree = "<group>"; };
DEC1D382565A4E9CAC2F14EA /* MediaFileHandleProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaFileHandleProxy.swift; sourceTree = "<group>"; };
DF05DA24F71B455E8EFEBC3B /* SessionVerificationViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationViewModelTests.swift; sourceTree = "<group>"; };
DF17EA323AD0205A6AB621AA /* Snapshotting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Snapshotting.swift; sourceTree = "<group>"; };
@@ -2974,9 +2974,9 @@
1627F2D56477BD331F6D732C /* RoomHeaderView.swift */,
7EB58E4E8D6D634C246AD5C2 /* RoomInviterLabel.swift */,
839E2C35DF3F9C7B54C3CE49 /* RoundedCornerShape.swift */,
DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */,
AEB5FF7A09B79B0C6B528F7C /* SFNumberedListView.swift */,
E10DA51DBC8C7E1460DBCCBD /* UserProfileListRow.swift */,
AD529C89924EE32CE307F36F /* VisualListItem.swift */,
);
path = Views;
sourceTree = "<group>";
@@ -6856,7 +6856,6 @@
B272E5D1DE8BDA87A6B7A696 /* RoomTimelineProviderMock.swift in Sources */,
77D7DAA41AAB36800C1F2E2D /* RoomTimelineProviderProtocol.swift in Sources */,
B2F8E01ABA1BA30265B4ECBE /* RoundedCornerShape.swift in Sources */,
BD11E639CF566A9DA8FCA717 /* RoundedLabelItem.swift in Sources */,
50C90117FE25390BFBD40173 /* RustTracing.swift in Sources */,
D43F0503EF2CBC55272538FE /* SDKGeneratedMocks.swift in Sources */,
88CBF1595E39CE697928DE48 /* SFNumberedListView.swift in Sources */,
@@ -7053,6 +7052,7 @@
1A83DD22F3E6F76B13B6E2F9 /* VideoRoomTimelineItemContent.swift in Sources */,
2CA61BB208CD82EBDB58CD13 /* VideoRoomTimelineView.swift in Sources */,
6FC10A00D268FCD48B631E37 /* ViewFrameReader.swift in Sources */,
EED33AFD9334EFD7398707A6 /* VisualListItem.swift in Sources */,
1318721F4E5F307586D98112 /* VoiceMessageButton.swift in Sources */,
4681820102DAC8BA586357D4 /* VoiceMessageCache.swift in Sources */,
4F2DF6138E87A4B8C2488CA3 /* VoiceMessageCacheProtocol.swift in Sources */,
@@ -24,11 +24,11 @@ enum ListPosition {
}
}
struct RoundedLabelItem<Icon: View>: View {
struct VisualListItem<Icon: View>: View {
@Environment(\.backgroundStyle) private var backgroundStyle
let title: String
let listPosition: ListPosition
let position: ListPosition
let iconContent: () -> Icon
private var backgroundColor: AnyShapeStyle {
@@ -39,17 +39,17 @@ struct RoundedLabelItem<Icon: View>: View {
Label { Text(title) } icon: {
iconContent()
}
.labelStyle(CheckmarkLabelStyle())
.padding(.horizontal, 20)
.labelStyle(VisualListItemLabelStyle())
.padding(.horizontal, 16)
.padding(.vertical, 12)
.frame(maxWidth: .infinity, alignment: .leading)
.background(backgroundColor, in: RoundedCornerShape(radius: 16, corners: listPosition.roundedCorners))
.background(backgroundColor, in: RoundedCornerShape(radius: 14, corners: position.roundedCorners))
}
}
private struct CheckmarkLabelStyle: LabelStyle {
private struct VisualListItemLabelStyle: LabelStyle {
func makeBody(configuration: Configuration) -> some View {
HStack(alignment: .top, spacing: 16) {
HStack(alignment: .top, spacing: 12) {
configuration.icon
configuration.title
}
@@ -60,7 +60,7 @@ private struct CheckmarkLabelStyle: LabelStyle {
// MARK: - Previews
struct AnalyticsPromptScreenCheckmarkItem_Previews: PreviewProvider, TestablePreview {
struct VisualListItem_Previews: PreviewProvider, TestablePreview {
static let strings = AnalyticsPromptScreenStrings(termsURL: ServiceLocator.shared.settings.analyticsConfiguration.termsURL)
@ViewBuilder
@@ -75,17 +75,17 @@ struct AnalyticsPromptScreenCheckmarkItem_Previews: PreviewProvider, TestablePre
static var previews: some View {
VStack(alignment: .leading, spacing: 4) {
RoundedLabelItem(title: strings.point1, listPosition: .top) {
VisualListItem(title: strings.point1, position: .top) {
testImage1
}
RoundedLabelItem(title: strings.point2, listPosition: .middle) {
VisualListItem(title: strings.point2, position: .middle) {
testImage2
}
RoundedLabelItem(title: "This is a short string.", listPosition: .middle) {
VisualListItem(title: "This is a short string.", position: .middle) {
testImage1
}
RoundedLabelItem(title: "This is a very long string that will be used to test the layout over multiple lines of text to ensure everything is correct.",
listPosition: .bottom) {
VisualListItem(title: "This is a very long string that will be used to test the layout over multiple lines of text to ensure everything is correct.",
position: .bottom) {
testImage2
}
}
@@ -70,7 +70,7 @@ struct EncryptionResetScreen: View {
@ViewBuilder
private func checkMarkItem(title: String, position: ListPosition, positive: Bool) -> some View {
RoundedLabelItem(title: title, listPosition: position) {
VisualListItem(title: title, position: position) {
CompoundIcon(positive ? \.check : \.info)
.foregroundColor(positive ? .compound.iconAccentPrimary : .compound.iconSecondary)
.alignmentGuide(.top) { _ in 2 }
@@ -65,7 +65,7 @@ struct AnalyticsPromptScreen: View {
@ViewBuilder
private func checkMarkItem(title: String, position: ListPosition) -> some View {
RoundedLabelItem(title: title, listPosition: position) {
VisualListItem(title: title, position: position) {
CompoundIcon(\.checkCircle, size: .small, relativeTo: .body)
.foregroundColor(.compound.iconAccentPrimary)
}
@@ -39,37 +39,37 @@ struct SecureBackupKeyBackupScreen: View {
}
private var disableBackupSection: some View {
VStack(spacing: 16) {
BigIcon(icon: \.keyOffSolid)
Text(L10n.screenKeyBackupDisableTitle)
.foregroundColor(.compound.textPrimary)
.font(.compound.headingMDBold)
.multilineTextAlignment(.center)
Text(L10n.screenKeyBackupDisableDescription)
.foregroundColor(.compound.textSecondary)
.font(.compound.bodyMD)
.multilineTextAlignment(.center)
VStack(alignment: .leading, spacing: 10) {
Label {
Text(L10n.screenKeyBackupDisableDescriptionPoint1)
.foregroundColor(.compound.textSecondary)
.font(.compound.bodyMD)
} icon: {
CompoundIcon(\.close)
.foregroundColor(.compound.iconCriticalPrimary)
}
VStack(spacing: 24) {
VStack(spacing: 16) {
BigIcon(icon: \.error, style: .alertSolid)
Label {
Text(L10n.screenKeyBackupDisableDescriptionPoint2(InfoPlistReader.main.bundleDisplayName))
VStack(spacing: 8) {
Text(L10n.screenKeyBackupDisableTitle)
.foregroundColor(.compound.textPrimary)
.font(.compound.headingMDBold)
.multilineTextAlignment(.center)
Text(L10n.screenKeyBackupDisableDescription)
.foregroundColor(.compound.textSecondary)
.font(.compound.bodyMD)
} icon: {
CompoundIcon(\.close)
.multilineTextAlignment(.center)
}
}
VStack(alignment: .leading, spacing: 4) {
VisualListItem(title: L10n.screenKeyBackupDisableDescriptionPoint1,
position: .top) {
CompoundIcon(\.close, size: .small, relativeTo: .body)
.foregroundColor(.compound.iconCriticalPrimary)
}
.backgroundStyle(.compound.bgActionSecondaryHovered)
VisualListItem(title: L10n.screenKeyBackupDisableDescriptionPoint2(InfoPlistReader.main.productionAppName),
position: .bottom) {
CompoundIcon(\.close, size: .small, relativeTo: .body)
.foregroundColor(.compound.iconCriticalPrimary)
}
.backgroundStyle(.compound.bgActionSecondaryHovered)
}
}
}
@@ -17,6 +17,10 @@ struct SecureBackupScreenViewState: BindableState {
var recoveryState = SecureBackupRecoveryState.unknown
var keyBackupState = SecureBackupKeyBackupState.unknown
var bindings: SecureBackupScreenViewStateBindings
var keyStorageToggleDescription: String? {
keyBackupState.keyStorageToggleState ? nil : L10n.screenChatBackupKeyStorageDisabledError
}
}
struct SecureBackupScreenViewStateBindings {
@@ -26,7 +26,7 @@ class SecureBackupScreenViewModel: SecureBackupScreenViewModelType, SecureBackup
self.userIndicatorController = userIndicatorController
super.init(initialViewState: .init(chatBackupDetailsURL: chatBackupDetailsURL,
bindings: SecureBackupScreenViewStateBindings(keyStorageEnabled: secureBackupController.keyBackupState.value.toggleState)))
bindings: SecureBackupScreenViewStateBindings(keyStorageEnabled: secureBackupController.keyBackupState.value.keyStorageToggleState)))
secureBackupController.recoveryState
.receive(on: DispatchQueue.main)
@@ -38,7 +38,7 @@ class SecureBackupScreenViewModel: SecureBackupScreenViewModelType, SecureBackup
.sink { [weak self] state in
guard let self else { return }
self.state.keyBackupState = state
self.state.bindings.keyStorageEnabled = state.toggleState
self.state.bindings.keyStorageEnabled = state.keyStorageToggleState
}
.store(in: &cancellables)
}
@@ -53,10 +53,10 @@ class SecureBackupScreenViewModel: SecureBackupScreenViewModelType, SecureBackup
let keyBackupState = secureBackupController.keyBackupState.value
switch (keyBackupState, enable) {
case (.unknown, true):
state.bindings.keyStorageEnabled = keyBackupState.toggleState // Reset the toggle in case enabling fails
state.bindings.keyStorageEnabled = keyBackupState.keyStorageToggleState // Reset the toggle in case enabling fails
enableBackup()
case (.enabled, false):
state.bindings.keyStorageEnabled = keyBackupState.toggleState // Reset the toggle in case the user cancels
state.bindings.keyStorageEnabled = keyBackupState.keyStorageToggleState // Reset the toggle in case the user cancels
actionsSubject.send(.keyBackup)
default:
break
@@ -83,8 +83,8 @@ class SecureBackupScreenViewModel: SecureBackupScreenViewModelType, SecureBackup
}
}
private extension SecureBackupKeyBackupState {
var toggleState: Bool {
extension SecureBackupKeyBackupState {
var keyStorageToggleState: Bool {
switch self {
case .unknown, .enabling: false
case .enabled, .disabling: true
@@ -68,7 +68,8 @@ struct SecureBackupScreen: View {
}
private var keyStorageToggle: some View {
ListRow(label: .plain(title: L10n.screenChatBackupKeyStorageToggleTitle),
ListRow(label: .plain(title: L10n.screenChatBackupKeyStorageToggleTitle,
description: context.viewState.keyStorageToggleDescription),
kind: .toggle($context.keyStorageEnabled))
.onChange(of: context.keyStorageEnabled) { _, newValue in
context.send(viewAction: .keyStorageToggled(newValue))
@@ -17,12 +17,6 @@ extension PreviewTests {
}
}
func test_analyticsPromptScreenCheckmarkItem() {
for preview in AnalyticsPromptScreenCheckmarkItem_Previews._allPreviews {
assertSnapshots(matching: preview)
}
}
func test_analyticsPromptScreen() {
for preview in AnalyticsPromptScreen_Previews._allPreviews {
assertSnapshots(matching: preview)
@@ -953,6 +947,12 @@ extension PreviewTests {
}
}
func test_visualListItem() {
for preview in VisualListItem_Previews._allPreviews {
assertSnapshots(matching: preview)
}
}
func test_voiceMessageButton() {
for preview in VoiceMessageButton_Previews._allPreviews {
assertSnapshots(matching: preview)
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8b702610b9a43191c4dccee0173300c5c5db9041e60ad9bc581ebfc2a47fcd8a
size 519748
oid sha256:dfb5ef0504933e89135643a41b30ee4d70aa5ecfab0bb20253f50dab03b0db6a
size 516263
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2151c4124c4f826a9b2b1039ec2cffea1f7f9930e37918ca65558239190c8032
size 545056
oid sha256:95e764b2d91c03d6f6a7c40635fb14a5f2e041ff77419e8e9ef5b42a54060b43
size 542507
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:76a550baf0bfc5fc2e7d2ccbfdb1e367cd025a3daca8526d4040a46523454869
size 316889
oid sha256:85867b67a34544e7f4e87b2f3aaf0f915f65977c478d8f2d3ba7dc42a80ab200
size 320240
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8e28e24910ef83b66f273751cb0427e7f6df1ac127bfe6422ca172e7be0819bc
size 323831
oid sha256:7c9c4b6a6b275e412de5ef313c4e435fc5786476404b421ca899a47d07cc9ebf
size 331190
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4959f2b957a1fc21cd35b690b5eea1fc9aab9cc84fe13c3a50b3fbecea276e3c
size 110926
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4f3d9c02c0c19490c9b1245d86dfdd97468f0cafa8c32bb9d01a62c1dccca6a9
size 118558
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7558f09b10e62a9a111e91fe259f86c3709bf354867b406b23a3a122c67d9d29
size 73551
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2bea6d31ae7c93fb10936d2af89bdefa799d2a8d5a314c2d7e351dd817c6bf68
size 87505
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b6669bd265a9b14b47f3e80786ce487275a81dd0a7c096bab707fc573d5ca5ba
size 156868
oid sha256:8530b94b6ad2bb808589d221dd963d398a853c218641813235430f51f5d05b3c
size 155840
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:13eb76a6174949e63d35e260744763a405b7fd4cdfb0405189b647115be04f4d
size 212875
oid sha256:652fe68e0477a949d5d7284de23705a87479741e55ba0ed89a40281d23c31e20
size 212237
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e2f9383e9ccde9ed8fda0461051e0c445537c299f3881b2d7feeae084bdb6be4
size 107493
oid sha256:67dc40a01ee89d875ae4723b8809384d5907399d536a26a520489227c3557c83
size 108502
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:359d2bfea87562d0bce3472e9994180397a2b33315b9d6768439bfbdcc3eb61a
size 164012
oid sha256:33e757ca5012297a0f1a049f0bad15171f2043ee9224dbc148389607a15be8dd
size 163996
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2642ca05da869cf59a8c275465b67e43db8d01f7d984543ee4442a1a72fee1c2
size 140623
oid sha256:9534f1649e9fdf3229867cce6594bfdf6fad971c5e3fbb5583da7980e736321a
size 144792
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:77d646f5b1e3f8377c674eb61b184670ba3e6e5eb26e16644a1271ec75d79cbb
size 194850
oid sha256:5703e4e80055b040382985fd7220c1a57ded04898745b49dfb3232f49ce240be
size 201719
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:57ba61f6ee8a7d6a382851bfe161d922a8179a58d4ddd191a08eb9891ab8a30b
size 98103
oid sha256:42f867e0fb0b0317b917b87c2bffbd857cd09857549da1246940f125a36b380e
size 102838
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea9ca53d25dd7f8fbd4453bca7dc02ffde0fd5bc43c0f183489080c5804fbc7c
size 153579
oid sha256:d08e5521dcb2ebf681fd6a546e0804ad01e74b66063125686d7850d2df28b856
size 160165
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:248c05bf396932033fdc1f2821659988b6cdde1558c4db1ff2e36c6eef9ae02d
size 109322
oid sha256:3eefb4e846f077a2ca7b8297c505f780e7a604e7f9116b71cd1a9883113ccd0f
size 117078
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:617075b51396eb2cbaddee74e2673f0b778b04f5f9263c8314dbdde774c6a233
size 126840
oid sha256:f687602f97c449269d2634bed2b9f81a85872b6f88364a96c52521729a222d3a
size 136021
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1203fa1008ba94be887f96b286efa557a96577cf30ea0a3f882b9f7576b4c646
size 66212
oid sha256:5306c7452d991aea79d15d23f0b0c5363fd250d0eaf2c2e3a39d0b48b0f7fb7e
size 73582
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9199e5915f3292565b67005b242619cf670f07024c7097ab0e7af7bd5bc23710
size 89974
oid sha256:71b3bee5ed6add6cc6e4463be8b9099b47acc6d9c0b40dc26449efe2531d429e
size 103402
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9cac17036704df924eee98ae0287d231dceedca6ceee8ba990d4acb4d377f678
size 110821
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cd981618a53c74d5f3ee0c4bab370b4e431c760e94f1a97af742e2a82bc25f43
size 118491
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a3734c22ad3f2a59633b28043fca8dee4038376e542b043ab05fc00fd93be364
size 71605
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c688ca29c8ed4a490f20e081323f4ac300c9addf2a05662cd52d98f312f1b872
size 85945