Merge pull request #4900 from element-hq/feature/bma/a11yTimeline

[a11y] Improve accessibility of message composer
This commit is contained in:
Benoit Marty 2025-06-20 16:39:24 +02:00 committed by GitHub
commit 31f2c2a9b5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
88 changed files with 226 additions and 249 deletions

View file

@ -24,7 +24,12 @@ open class AttachmentsPreviewStateProvider : PreviewParameterProvider<Attachment
override val values: Sequence<AttachmentsPreviewState>
get() = sequenceOf(
anAttachmentsPreviewState(),
anAttachmentsPreviewState(sendActionState = SendActionState.Sending.Processing(displayProgress = false)),
anAttachmentsPreviewState(
sendActionState = SendActionState.Sending.Processing(displayProgress = false),
textEditorState = aTextEditorStateMarkdown(
initialText = "This is a caption!"
)
),
anAttachmentsPreviewState(sendActionState = SendActionState.Sending.Processing(displayProgress = true)),
anAttachmentsPreviewState(sendActionState = SendActionState.Sending.ReadyToUpload(aMediaUploadInfo())),
anAttachmentsPreviewState(sendActionState = SendActionState.Sending.Uploading(0.5f, aMediaUploadInfo())),
@ -55,15 +60,15 @@ fun aMediaUploadInfo(
filePath: String = "file://path",
thumbnailFilePath: String? = null,
) = MediaUploadInfo.Image(
file = File(filePath),
imageInfo = ImageInfo(
height = 100,
width = 100,
mimetype = MimeTypes.Jpeg,
size = 1000,
thumbnailInfo = null,
thumbnailSource = null,
blurhash = null,
),
thumbnailFile = thumbnailFilePath?.let { File(it) },
)
file = File(filePath),
imageInfo = ImageInfo(
height = 100,
width = 100,
mimetype = MimeTypes.Jpeg,
size = 1000,
thumbnailInfo = null,
thumbnailSource = null,
blurhash = null,
),
thumbnailFile = thumbnailFilePath?.let { File(it) },
)

View file

@ -31,6 +31,7 @@ object ElementRichTextEditorStyle {
} else {
ElementTheme.colors.textSecondary
},
placeholderColor = ElementTheme.colors.textSecondary,
lineHeight = TextUnit.Unspecified,
includeFontPadding = true,
)

View file

@ -39,7 +39,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
@ -81,7 +80,6 @@ import io.element.android.libraries.textcomposer.model.aTextEditorStateRich
import io.element.android.libraries.textcomposer.model.showCaptionCompatibilityWarning
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.wysiwyg.compose.RichTextEditor
import io.element.android.wysiwyg.compose.RichTextEditorState
import io.element.android.wysiwyg.display.TextDisplay
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
@ -174,18 +172,29 @@ fun TextComposer(
is TextEditorState.Rich -> {
remember(state.richTextEditorState, subcomposing, composerMode, onResetComposerMode, onError) {
@Composable {
TextInput(
state = state.richTextEditorState,
subcomposing = subcomposing,
placeholder = placeholder,
TextInputBox(
composerMode = composerMode,
onResetComposerMode = onResetComposerMode,
resolveMentionDisplay = resolveMentionDisplay,
resolveRoomMentionDisplay = resolveAtRoomMentionDisplay,
onError = onError,
onTyping = onTyping,
onSelectRichContent = onSelectRichContent,
)
isTextEmpty = state.richTextEditorState.messageHtml.isEmpty(),
subcomposing = subcomposing,
) {
RichTextEditor(
state = state.richTextEditorState,
placeholder = placeholder,
// Disable most of the editor functionality if it's just being measured for a subcomposition.
// This prevents it gaining focus and mutating the state.
registerStateUpdates = !subcomposing,
modifier = Modifier
.padding(top = 6.dp, bottom = 6.dp)
.fillMaxWidth(),
style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.richTextEditorState.hasFocus),
resolveMentionDisplay = resolveMentionDisplay,
resolveRoomMentionDisplay = resolveAtRoomMentionDisplay,
onError = onError,
onRichContentSelected = onSelectRichContent,
onTyping = onTyping,
)
}
}
}
}
@ -195,12 +204,13 @@ fun TextComposer(
TextInputBox(
composerMode = composerMode,
onResetComposerMode = onResetComposerMode,
placeholder = placeholder,
showPlaceholder = state.state.text.value().isEmpty(),
isTextEmpty = state.state.text.value().isEmpty(),
subcomposing = subcomposing,
) {
MarkdownTextInput(
state = state.state,
placeholder = placeholder,
placeholderColor = ElementTheme.colors.textSecondary,
subcomposing = subcomposing,
onTyping = onTyping,
onReceiveSuggestion = onReceiveSuggestion,
@ -437,7 +447,9 @@ private fun TextFormattingLayout(
) {
val bottomPadding = with(LocalDensity.current) { WindowInsets.systemBars.getBottom(this).toDp() + 8.dp }
Column(
modifier = modifier.padding(vertical = 4.dp).padding(bottom = bottomPadding),
modifier = modifier
.padding(vertical = 4.dp)
.padding(bottom = bottomPadding),
verticalArrangement = Arrangement.spacedBy(4.dp),
) {
if (isRoomEncrypted == false) {
@ -480,8 +492,7 @@ private fun TextFormattingLayout(
private fun TextInputBox(
composerMode: MessageComposerMode,
onResetComposerMode: () -> Unit,
placeholder: String,
showPlaceholder: Boolean,
isTextEmpty: Boolean,
subcomposing: Boolean,
textInput: @Composable () -> Unit,
) {
@ -503,7 +514,6 @@ private fun TextInputBox(
onResetComposerMode = onResetComposerMode,
)
}
val defaultTypography = ElementTheme.typography.fontBodyLgRegular
Box(
modifier = Modifier
.padding(top = 4.dp, bottom = 4.dp, start = 12.dp, end = 12.dp)
@ -511,21 +521,8 @@ private fun TextInputBox(
.then(if (!subcomposing) Modifier.testTag(TestTags.textEditor) else Modifier),
contentAlignment = Alignment.CenterStart,
) {
// Placeholder
if (showPlaceholder) {
Text(
text = placeholder,
style = defaultTypography.copy(
color = ElementTheme.colors.textSecondary,
),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
textInput()
if (showPlaceholder && composerMode.showCaptionCompatibilityWarning()) {
if (isTextEmpty && composerMode.showCaptionCompatibilityWarning()) {
var showBottomSheet by remember { mutableStateOf(false) }
Icon(
modifier = Modifier
@ -546,44 +543,6 @@ private fun TextInputBox(
}
}
@Composable
private fun TextInput(
state: RichTextEditorState,
subcomposing: Boolean,
placeholder: String,
composerMode: MessageComposerMode,
onResetComposerMode: () -> Unit,
resolveRoomMentionDisplay: () -> TextDisplay,
resolveMentionDisplay: (text: String, url: String) -> TextDisplay,
onError: (Throwable) -> Unit,
onTyping: (Boolean) -> Unit,
onSelectRichContent: ((Uri) -> Unit)?,
) {
TextInputBox(
composerMode = composerMode,
onResetComposerMode = onResetComposerMode,
placeholder = placeholder,
showPlaceholder = state.messageHtml.isEmpty(),
subcomposing = subcomposing,
) {
RichTextEditor(
state = state,
// Disable most of the editor functionality if it's just being measured for a subcomposition.
// This prevents it gaining focus and mutating the state.
registerStateUpdates = !subcomposing,
modifier = Modifier
.padding(top = 6.dp, bottom = 6.dp)
.fillMaxWidth(),
style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus),
resolveMentionDisplay = resolveMentionDisplay,
resolveRoomMentionDisplay = resolveRoomMentionDisplay,
onError = onError,
onRichContentSelected = onSelectRichContent,
onTyping = onTyping,
)
}
}
private fun aTextEditorStateMarkdownList(isRoomEncrypted: Boolean? = null) = persistentListOf(
aTextEditorStateMarkdown(initialText = "", initialFocus = true, isRoomEncrypted = isRoomEncrypted),
aTextEditorStateMarkdown(initialText = "A message", initialFocus = true, isRoomEncrypted = isRoomEncrypted),

View file

@ -8,6 +8,7 @@
package io.element.android.libraries.textcomposer.components.markdown
import android.content.ClipData
import android.content.res.ColorStateList
import android.graphics.Color
import android.net.Uri
import android.text.Editable
@ -18,6 +19,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.text.getSpans
@ -26,6 +28,7 @@ import androidx.core.view.OnReceiveContentListener
import androidx.core.view.ViewCompat
import androidx.core.view.setPadding
import androidx.core.widget.addTextChangedListener
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.testtags.TestTags
@ -43,6 +46,8 @@ import io.element.android.wysiwyg.compose.internal.applyStyleInCompose
@Composable
fun MarkdownTextInput(
state: MarkdownTextEditorState,
placeholder: String,
placeholderColor: androidx.compose.ui.graphics.Color,
subcomposing: Boolean,
onTyping: (Boolean) -> Unit,
onReceiveSuggestion: (Suggestion?) -> Unit,
@ -87,6 +92,8 @@ fun MarkdownTextInput(
setBackgroundColor(Color.TRANSPARENT)
val text = state.text.value()
setText(text)
setHint(placeholder)
setHintTextColor(ColorStateList.valueOf(placeholderColor.toArgb()))
inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE or
@ -189,6 +196,8 @@ internal fun MarkdownTextInputPreview() {
val style = ElementRichTextEditorStyle.composerStyle(hasFocus = true)
MarkdownTextInput(
state = aMarkdownTextEditorState(initialText = "Hello, World!"),
placeholder = "Placeholder",
placeholderColor = ElementTheme.colors.textSecondary,
subcomposing = false,
onTyping = {},
onReceiveSuggestion = {},

View file

@ -14,6 +14,7 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.core.text.getSpans
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.matrix.api.permalink.PermalinkData
import io.element.android.libraries.matrix.test.A_SESSION_ID
import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser
@ -175,6 +176,8 @@ class MarkdownTextInputTest {
val style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus)
MarkdownTextInput(
state = state,
placeholder = "Placeholder",
placeholderColor = ElementTheme.colors.textSecondary,
subcomposing = subcomposing,
onTyping = onTyping,
onReceiveSuggestion = onSuggestionReceived,

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:75b41d34ae5ecebdeaed2f4cd236c402757535a19befaf39918bbfc70bb467c7
size 395098
oid sha256:cb50ba951a464a7bae750e779f25e2deeda0355a3220fdaf19f60c7c7ed73649
size 395064

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:75b41d34ae5ecebdeaed2f4cd236c402757535a19befaf39918bbfc70bb467c7
size 395098
oid sha256:503e64a8acb9630e3a6cece0028283407bd54fda2f8ca7bd41c09d12491b48d1
size 394757

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cb44dad546b898087ef5d98a69a235a04a84330aab05cdd400b5773885feb592
size 51252
oid sha256:0ce509e6357edda6b8206eea46a7818386423c96abaddae8ae8e886244a93784
size 51168

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:75b41d34ae5ecebdeaed2f4cd236c402757535a19befaf39918bbfc70bb467c7
size 395098
oid sha256:cb50ba951a464a7bae750e779f25e2deeda0355a3220fdaf19f60c7c7ed73649
size 395064

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6a571a03f04d9243c1f05b4867f1d117f9e155307fe1520f5f99ea0ca93552d2
size 51223
oid sha256:089a84e094a191836ae654f3214b1b3a590a1b13e0d1972c8ef2ac82813b47eb
size 51139

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9fcc0bc6b9062dcc25b03470cecfaeeb464a9f9e0335bc1cab2c122400b8efd0
size 89353
oid sha256:21a0d4fabf74730d3aff1ec23502c18d84cb53899d8cacfefede48ae8fde19e1
size 89266

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:75b41d34ae5ecebdeaed2f4cd236c402757535a19befaf39918bbfc70bb467c7
size 395098
oid sha256:cb50ba951a464a7bae750e779f25e2deeda0355a3220fdaf19f60c7c7ed73649
size 395064

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f1e9382ed4ffc09e206928c33c667cb150dffc830f6215e06c9dd5ea520de4a8
size 54986
oid sha256:19066a9752af1dbd27a3403dbc0a85d3b7dfa6b794cfcc314934a91c3e680283
size 54925

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:955c4cce20c5e9f3457923ff76f22488445a891f145f0161cd0ec94c3da2bc55
size 63485
oid sha256:9af45d39c400733792e3053e38612205a8c61ef044101d6beca4710b29e12e7b
size 63435

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d1cdf81418927c64c9cb3bc97828f251da3116f09841ec0bfa2164e321058d67
size 55435
oid sha256:70e6b6c940f935d585e210ffa10fa2926f074e4d1ee255e8607345379d2a52f0
size 55326

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d568e0e6f80c6161ca33f51106268f5ef95e33bd21923c3dd734f8f67dd51609
size 67392
oid sha256:4511572afb1134a5af14cd5cc0bfc248602761b1b32e35608de7dcba97830ae1
size 67284

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:eb3362efdf5441cf73ac08196b95bdd5b4426e11188f6cb86c32169be049ed46
size 19547
oid sha256:1b2acbefb2319d650215b5933d8ef2a4f407b83e5b7f26379aebbc617fa7bdc8
size 19418

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea025d360bedff971ae77ee3c9e47140dac75d2f8b64ea2d244304c35c8cea5c
size 18078
oid sha256:bdaae3b3badf316b130b67fbf0a2876e6620da4e4f22277625bba3590ed2d7dc
size 17911

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:70ab6c6c738a96fd2db7901482cf4110dfcc69a6289e1db734a753751690747a
size 51622
oid sha256:f65fa2e0b1172f43b9475b8f46c3efc1086b5cf659038190bd8495b98bc21c82
size 51551

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:237ee8f45cfd01821287669abc4fe7125c0d2828ff60224706eef855910821f0
size 51048
oid sha256:dc219f3f79e2f7e061b541398971c36732346b2770fbeea95a4ecca266eb6ac0
size 50925

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7a23ecbbee117033cefa5ddfbdf68862bc6f44bf03b9cbb2d468ffe4236f9109
size 52673
oid sha256:4f9279dc01e9fdec69ee0819e2b4b7e0f00dec7e1b62c353052530b6bb66d4f0
size 52621

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3c019dc162f360869595392df03359b6333f96e98150ad3f3f65d464ba5317f7
size 50971
oid sha256:0c3d263dfa02c775db1f370ac6ada2d3b31f3ce252f605e05f7121367b609bc0
size 50915

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:93cbe1f644c5f13d7e77f917859333b761640355e6bd8087fc4a9308fb4afc01
size 53776
oid sha256:72c662eb1b7c5d85c65d1f7cc25bf484964f0ce31f414406fe8fbf90f2e9173f
size 53784

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:58b867446d31a57350e72768449d8072d70f94203b2ec110950b302c8f1792ba
size 51764
oid sha256:d6bef68b39ff88a4020f30c0ef8313eccbe2d360723894414cdabd9b89ee9c84
size 51768

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2262ca89505ab3d8c896ef818830c2220aef2d0903e51ca3bab36ff63b1a6cfd
size 47488
oid sha256:a28794895dd4d6a6389aa2c23e756861e6f07ff13b60c67f273fdf027dd8eb09
size 47515

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cf2354049558d02a1072285d58598353a65974f91702fb7f4b516d7977b03c5b
size 46035
oid sha256:3d4214277841ebc15eda9dae5367cec2d1127eadecc7b2fa97ad9d845888cd2d
size 46042

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8d5feff7d5b06463196a09bf065a62c9e578c15fe9bafdc6e4508fcf93bfcdba
size 52415
oid sha256:5fca1c7a63f89d4ae3c63b473a7352f83abda12bde4ef7698fb4d80218ba0cc8
size 52411

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:440568a0cc345291ff16d49890bd9665af96651702f417ec016f89f6c0475dc4
size 50833
oid sha256:5bf7e9b141aef2236b935503a409eae7dc06f824d09a83fb97370450920f6d54
size 50841

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9e1589df371db7e489c4d8696898c44a919df001f4a30d83d2f32b92dbece2de
size 63546
oid sha256:2f1643e255457fcf5511d807235137a5afcf457740a02ad9632e26b06b224f89
size 63488

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3bf77d27c4fb0f491a40c3ca532e424bbb791660d168f951d8210cc6cb2898ba
size 61205
oid sha256:a01bfddaadf8d165d638980d05ebf02076c9ddeb0160e7dff40171fc433d3c05
size 61161

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7a23ecbbee117033cefa5ddfbdf68862bc6f44bf03b9cbb2d468ffe4236f9109
size 52673
oid sha256:4f9279dc01e9fdec69ee0819e2b4b7e0f00dec7e1b62c353052530b6bb66d4f0
size 52621

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3c019dc162f360869595392df03359b6333f96e98150ad3f3f65d464ba5317f7
size 50971
oid sha256:0c3d263dfa02c775db1f370ac6ada2d3b31f3ce252f605e05f7121367b609bc0
size 50915

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:17f126215961643b6b7c3b41fcc5ea970923229b76bb7c918db191cb5c0ef8b9
size 64672
oid sha256:40ce5b17c4b499d9e671b7022ee6445abaddf4e14eed547f8c2b0e4d018d75c5
size 64598

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f72fdf44bd35b6d62b5e75ec1bf2206429e0861da684d370259bea684eb2a76e
size 62158
oid sha256:cf923847e52fc8db3a7a27c5b85e27c4db8bcce9005b8009684e9f3b8b8b8c4b
size 62040

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d5226d7599af16015858523607a829d9cbbc0ffa21174f9c528e725673e2e31c
size 53982
oid sha256:30e40a4f602f99ca9ba95842b1aa8955450072d8bb317aea2eb61c704be0d8e3
size 53900

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:31b2d698e78fa11dc6af9dbc20b07533afd16c26b8f9969756057f07ea4785d0
size 51371
oid sha256:ac727cdf60b1a31c386d223df6f9142990468fdb6e387668eb740335c2caf937
size 51263

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d12f482740fbab1a9fb12bd5cdc37dc2bd03fac6d1304208b353d86bc4f558c6
size 73436
oid sha256:bfcb5206ea0fc6b89d6ac460d0d78bd8b70cc3e960d4ab0397bd6470e7dd23b8
size 73608

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:380a1544c59d1f8cf5f73f84341686b042bab24d7d092f43f30fd36cbb85b438
size 59956
oid sha256:cdf8092eb79caa45a8f911589af848756218fc7ca8e3c32c11b7b650a4b9564a
size 60143

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7127c9b52895079a8837bacc7371b31b1b1fd99415157f3246ee56a4272bf39e
size 72830
oid sha256:4dd4dbbaef196264c23e4188b34c617d2e72bacaa9f206a18fe2a73ba17adf63
size 73006

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7856d79bdf5166b6b1676d6cd418a33e0b21713b8d40d02b0187363951d373c3
size 80957
oid sha256:7c8920e6be0d01f0038d315a6421fe051b9f205477bb313e8ae8afada023fea1
size 81122

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b7407ef412758b7e19e0acb3fd539d15578b4bf94c776e7e6eec7d15e1ad0a40
size 62484
oid sha256:e3e2cfa763cf8f73872d108e3c749ced3dc730b9ba2902b1050d2fdddb036c56
size 62658

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:adf521b7a9e451146e13fcfd41ad3d072cfa4cdb01023cf252e39c147d9507b9
size 61354
oid sha256:e8b3b3fbdc951585ace8942e9307581cb7793ffaa4c8fe56a52b6063bd5db271
size 61540

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dfacf0126a768870f293f6f327c4d5a1379bd51e1d62da6b8953e6f76952c11d
size 67852
oid sha256:68bdae9e2b82ba19d7d7de98fc682ffe7eb96777ba86b7fa99f2acc0eb33f7a5
size 68023

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bd3639f1d57e2a9e313a6626625c600557cc90e90326310441366e0177f17ada
size 90429
oid sha256:d799e7c48c310dd2a9e42bf8765016da88ee69f51555992d2f80f467e8f07be0
size 90598

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b0538f1d4753e95082434db510f8d9b90c8c05be9975729000a6ec122b1b83d1
size 60841
oid sha256:ed11b4abb6a6a1a790248026fd9b322d1d00f3988957a9a549573d859dd6fa92
size 61017

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:30532cf8f90261dff21a23f425a2c15334713d4659be97052fe6c796651ba8e2
size 61988
oid sha256:851fe33ec8cac57d5ade446cec96dc5ec5790c8ce28d8bb47b111b46b9e30abd
size 62175

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:add696fa3700b07bda65546a714887a96406cdc0c883b39e8b9b3eb419d60ef5
size 68667
oid sha256:1838d95b241ebe2b83e732569efe344f1bde77b2cff068d0bb40412306c1f2c3
size 68840

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d60de55c65d7225f077c084c0d345f17a4a1b9d8d8598824e7721b3ae3c53bb4
size 60385
oid sha256:4ab214a116f303ef96e58d29edb757ccd4a36100d701c230a5f60d5850ebf0ce
size 60562

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0b18891980733fe58d000fcfc7b34f5fa0c355a7b7dc016157f02f633a0d2593
size 71248
oid sha256:b38a8b5fd2c82843b4da6d0c4c11400f569d8e38a8c4dcde03056c5e81a53c0f
size 71405

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:771606c34e4910bb123651706304db185fd2affe48c50e780147b9ecc86e6676
size 58149
oid sha256:996e5014e75e88bded0ef2742733b60f55b003486e3b2a418298e39dfc595add
size 58295

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:faa783569b0b56bc6e0853860d6a3aca19bc42d6d8cab8733f365a0c4d7ec076
size 70683
oid sha256:eab616b950daa6169f06930d411e1ed75ef1cc2f425d692abb8fb479c658d9bc
size 70819

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e689ed91b269984c11e5d3ff9dd8fafb3e9786585eaedb2b9bd3c0c367a8255e
size 78512
oid sha256:61b85adda6a18eebcccd149318e6c0da23c791cf4df8405f41e31891bfa9febc
size 78647

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:061c17ac2134b7ae49b80eb408c49a26b8c8f9bc3d40a0094fa466f6484c4525
size 60567
oid sha256:950da1e8c251d711c7ec460234981ac52f6e6bf7528fc904518b93fb0ce35b09
size 60708

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:901c974b774202476d3091ed624df42549f9add3bf7a8b07bcc33fc657412b5b
size 59591
oid sha256:2d4756b79b40777acad34655ab49ff9811f20b5196c6f2cbe31207e876290906
size 59737

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b5fdb0fdf6af3368f21dedbdb9e2f1492e20340de1427cd537a2c38aa21a73e4
size 65871
oid sha256:9c7e798594d983cc0e544e3eb70ea1654a78a866a7bc64ef620ac6a823b8a691
size 66011

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:55f9442c5fba907d6602b4f99700c28e5bb2b0229b599bc0497b9e7fd01f4adc
size 87380
oid sha256:f65f939395ba3c0736d59d9cdfcd55f1a9f7f9c0e1fcec8ff5da441277313a0e
size 87547

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:90a6561fa8d3576d93daf1ececda3bd89fd54ede171186059ec4eabd33d09a04
size 59020
oid sha256:4a4fee3963b352bfc49d8ef7e18c0179f304064758daafc8324cdc650458b522
size 59171

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cd32e719165a0351ad00ff7a39adb121b7ecbaa58232450d9cf41033cc93b389
size 60109
oid sha256:3b075203bb02a9a68b70e24d4aa3b7975c50bbbc2087026f28910427f431ec62
size 60251

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:52d06e1cc43e7e4fab868faceaec8ceab4513e99422954b859c6f38a93475487
size 66489
oid sha256:3bc27af141adfea18c39b86bcdf046392e765e7411453b6143958d5ede017411
size 66622

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:97ba97045331e55b16153ac3d8d37b3ddee0f8395d0b12d270d687e5ccdb662b
size 58641
oid sha256:03291891705787b0211dfd7375d755dc1abc985eb88d48bd978555032bea7a4e
size 58782

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a3dc5b4b88b11b4398777f9c19f55c760a6da33755206dc3559e8cfd5cf6bcfc
size 76395
oid sha256:bb24ef3a0c22045fc9e9ec390dd1785779924f5bd2a10f9bbc88d1a70b106191
size 76305

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:513851c2cfe1dd1579962b1913ad389e1cffb0570ff3572f981a780acc3da532
size 59926
oid sha256:1974abd76e0a3f8cdf1beefe26209d2bffb5212520f9a4e2655b80925337d1e7
size 59835

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:598fd33fab87e4f7095803f52af75843445863b2092130b0d423abbc8bb77c22
size 74571
oid sha256:2aaf080dad05b68af3ed2ea9a4d6cd2f2e9bb991da02683a2e195cb01002cb18
size 74482

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:314a1640f2835e5fb6adc8f2ae199f4f10ef028b6dede17681760860455b3590
size 85742
oid sha256:e1185e1fe56eb661dac60465841979a542055436aa5064663641164cef3a6dfd
size 85660

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a1273ac2ab60a7427f676bef8eb232b53be46d47e46963c58b1a134bb482cfb6
size 63085
oid sha256:ec74265bb93b5699a79918986ac601c3c2b2eb04b8aac0c72e50e57432ff9c27
size 62992

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a78d1da2ef8b469b90c06bf715b7c04e4477bc809a9fb2c74f916a8184a8d867
size 62131
oid sha256:54d61d2749c5bf4194658359c580616412da386454cf7d06cd7546b6555f52ad
size 62033

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bae403a239eb103b8c24708ef8fdef3ba92f2c38a80fc16bb1611fb23fc8b2c9
size 70019
oid sha256:a23bf0e7a2a2874121ba56dd144316df816432f1989fa8b9d05278e067175b75
size 69928

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a3b31d74b92b2db69c548a78606b606751644124703f5163482b4fe0e0471b6e
size 104792
oid sha256:2958634d33600d8e1b2b49cd264e0dd3bc54ba4a4fa5d34b2fef5d195a0d30f1
size 104699

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e1a3088c752694f7260f2fd45f1b14d2449c7121609109ce93a1232ba9581a8
size 61145
oid sha256:0834f567e0de98e55bc7607f5361637c00131c15f249594fd265ca4dafb4966c
size 61049

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:39047878c1505a00ca8549ddea2f4373682bf6321eca82d92822d73d689e12c1
size 63211
oid sha256:bbf214dfd61e9da88625243ebbca73c68718d15dbb96a11ff6765e8135ceac72
size 63119

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:00f12f3c347087b24cdc23fc4c82b93d2a2550c4af1026dcddbe7b22a3dcd334
size 70522
oid sha256:a34b3acb890a44a29b58d27e91851e6329d2ef4cadbef5beebcbd21f0444e93e
size 70432

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e9ed3949968e5c8653fddd929e5ebd4bf07dcd9391fab0fcb30d70146635fe1
size 60638
oid sha256:fbcdc99699e06603d7e2e285d8eec6103b68dc829f45d29f5c781e932a375552
size 60550

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c956c860f9148891b04eba8b30e8aef29b5e430caddc5340cd51af779596e598
size 73718
oid sha256:fa08671396751f9562ea6ee83bc353276bfe72524809ec44f666804c7c164413
size 73614

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7b367679460940c258542d54316006f9391ca23a30145baca4c2191cbca80363
size 57953
oid sha256:b82f3f8fe10b89962c5d3dedd593eee2f11b2c133e863b2bd1d540f83d07dd4f
size 57893

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7503402391f7adaa717eeff9d83f359f37cafed3e8502271aa37350a4039de3c
size 72010
oid sha256:de1b9014a911c3a7154cad9c52f1d2e60d73efad6e626e10623c59652cff763c
size 71905

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0417f5f570680d727df49e22408f296b8cbbf4be9086f6cb9b0f0e89208ef0f3
size 83091
oid sha256:63a8eb5a1cc04455f270fce24811a389e7d274691e5b20a7df8595549ccbef87
size 82985

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dbe2e2977ae2fd86d154c34cf59ef82b796c4ff75d69455dcae8fdb4041b2f25
size 61122
oid sha256:d8648126878bcaf3bb0e05a26c052710627e00ece4e2567977b8b52497a940cd
size 61057

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c221234495c789453447b12ebfca4b03e3b4cb9c381bb21a6454f54bfe8a81f5
size 60255
oid sha256:8ff99ca0e81db14b574c734ea5ba5d94c8a059b63b07502aa090113a776f6b22
size 60195

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bd04747ca75e56c63324893810f4194c84c796e9aeda0db193cb9339b331f890
size 68015
oid sha256:b14c0f2ecd79fbed4a6c3a6b3459fe204cae344f42210987fb52eb9de836df6f
size 67953

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7b2b966f1a3b55058d3173df9c80a7492be710f2310fab0d0ae3950e820526a7
size 101725
oid sha256:841cbfe819f61338f25484e63916e50d07aa258782b50c6108a71fa10a792fea
size 101688

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d0f4c13986a2f7932e2647ba26d20658a264e382805ed5aaddea5043aeeb70ec
size 59145
oid sha256:8e009d6cc28b8d98ae9c72e70a81af22d62b4428fae5dd7b10589d7aa46f1bf4
size 59075

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c9c80af6d15b052c07453281260e806ad20b72068903123dc596391edd72dd0f
size 61237
oid sha256:74398889e5df4d87fd34196bccd07b0a9d8dd6c545613fb1a7a0c1aee26f37a4
size 61167

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:78167ef5ac43202855cc4f683dd0f29930ba818e7f008a3f6561d90965c8ee9c
size 68351
oid sha256:a89fecb881a6ae6ce48e23abe2e3f3ed35e29f7a0b231c0c467b6dff022ad77b
size 68284

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2fdde0b6f5c8b4f0b752a983ad746702405fe092d981ace6cb306d5c36b17821
size 58751
oid sha256:16e4ac5820b57fe720e3c3b1d8383661b9d90ea230be19955f525ac7df346741
size 58689

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f97b8a117e03fddd44855bb8bfb696486b601af81edbcc038817946abbb13db1
size 57037
oid sha256:899158f6f0ece99609f76ed9d3ee23489043b0bfdf4daa0264bef52814b8af15
size 56923

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e8f665716e81675ad17f3a65b409f768879baca5156efa38204b8da74c46786
size 54592
oid sha256:a8b9c61ee214c3d222eda082120ae681ef5b1e4359c65d34d6d08106403aeef6
size 54539

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c72b2267469738863d7570309fc868368e9a897a98f192eb7bf7d561547fb029
size 46925
oid sha256:d5e4def8107b07a630a8991b20f541768bf8090e0cd964bb3c5b524955f12318
size 46869

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9b4cdcee84b5b48ed4179fb187e34bdcde02c4f8ed5da1b439f343cce8c2a15d
size 44952
oid sha256:11633c6e4562ab6a3144d80ff630574bc800a880a2804edf986c1fc8aeeff6b7
size 44873