From 46a2d670d5c27d20449c31dad1ae102bb163aa54 Mon Sep 17 00:00:00 2001 From: veryCrunchy Date: Wed, 29 Jul 2026 14:58:43 +0200 Subject: [PATCH 1/2] feat(mail): add adaptive native workspace --- .../unreleased/54-native-mail-workspace.md | 7 + .../app/DynamicNativeMemoryCache.kt | 131 ++ .../app/MarketingCaptureScenarios.kt | 316 +++++ .../nextcloudnative/app/NextcloudNativeApp.kt | 354 +++-- .../nativeui/runtime/GenericNativeRenderer.kt | 233 +++- .../nativeui/runtime/NativeMailWorkspace.kt | 1225 +++++++++++++++++ .../runtime/NativeSemanticPresentations.kt | 88 +- .../app/DynamicNativeMemoryCacheTest.kt | 95 ++ .../runtime/NativeMailWorkspaceTest.kt | 771 +++++++++++ .../NativeSemanticPresentationsTest.kt | 62 + .../public/screenshots/capture-manifest.json | 78 +- .../screenshots/mail-workspace-desktop.png | Bin 0 -> 63355 bytes .../mail-workspace-empty-mobile.png | Bin 0 -> 50905 bytes .../mail-workspace-error-desktop.png | Bin 0 -> 48118 bytes .../mail-workspace-loading-mobile.png | Bin 0 -> 47430 bytes .../screenshots/mail-workspace-mobile.png | Bin 0 -> 117964 bytes 16 files changed, 3219 insertions(+), 141 deletions(-) create mode 100644 changes/unreleased/54-native-mail-workspace.md create mode 100644 ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspace.kt create mode 100644 ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspaceTest.kt create mode 100644 website/public/screenshots/mail-workspace-desktop.png create mode 100644 website/public/screenshots/mail-workspace-empty-mobile.png create mode 100644 website/public/screenshots/mail-workspace-error-desktop.png create mode 100644 website/public/screenshots/mail-workspace-loading-mobile.png create mode 100644 website/public/screenshots/mail-workspace-mobile.png diff --git a/changes/unreleased/54-native-mail-workspace.md b/changes/unreleased/54-native-mail-workspace.md new file mode 100644 index 00000000..ef5d07e2 --- /dev/null +++ b/changes/unreleased/54-native-mail-workspace.md @@ -0,0 +1,7 @@ +category: feature +issue: 54 +pull: none +platforms: android, desktop +user-facing: yes + +Mail now opens as an adaptive native workspace with accounts, mailbox hierarchy, a virtualized inbox, persistent desktop message detail, mobile navigation, and a safe contract-backed Compose entry. diff --git a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/DynamicNativeMemoryCache.kt b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/DynamicNativeMemoryCache.kt index bdf07dda..4992f0a7 100644 --- a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/DynamicNativeMemoryCache.kt +++ b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/DynamicNativeMemoryCache.kt @@ -75,6 +75,7 @@ internal class DynamicNativeMemoryCache( } fun screen(key: DynamicScreenCacheKey, freshOnly: Boolean = false): DynamicScreenSnapshot? { + if (!key.cacheable) return null val entry = screens.touch(key) ?: return null if (freshOnly && entry.storedAt.elapsedNow() > freshFor) return null return entry.snapshot @@ -89,6 +90,7 @@ internal class DynamicNativeMemoryCache( } fun storeScreen(key: DynamicScreenCacheKey, snapshot: DynamicScreenSnapshot) { + if (!key.cacheable) return screens.remove(key) screens[key] = ScreenEntry(snapshot.bounded(), timeSource.markNow()) while (screens.size > maximumScreens) screens.remove(screens.keys.first()) @@ -127,9 +129,82 @@ internal data class DynamicScreenCacheKey( val appId: String, val viewId: String, val selectedRecordId: String?, + val selectedRecordResourceId: String?, + /** Only non-secret relationship identifiers needed to distinguish a nested collection. */ + val selectedRecordScope: Map, val parameterValues: Map, + /** Some sparse semantic records do not safely identify their account scope. */ + val cacheable: Boolean = true, ) +/** + * Compose loader identity for a selected dynamic record. This deliberately includes the resource + * and relation scope because server IDs such as Inbox may overlap between Mail accounts. + */ +internal data class DynamicScreenSelectionIdentity( + val resourceId: String?, + val recordId: String?, + val recordScope: Map, +) + +/** + * Immutable identity for a pagination request. A late page may only update the screen, cache, or + * error state while this still matches the active dynamic selection. + */ +internal data class DynamicPaginationRequestIdentity( + val account: String, + val appId: String, + val viewId: String, + val resourceId: String, + val selection: DynamicScreenSelectionIdentity, + val pathParameters: Map, + val cacheKey: DynamicScreenCacheKey, +) + +internal fun dynamicScreenSelectionIdentity( + resourceId: String?, + recordId: String?, + recordScope: Map, +): DynamicScreenSelectionIdentity = DynamicScreenSelectionIdentity( + resourceId = resourceId, + recordId = recordId, + recordScope = recordScope.toSortedMap(), +) + +internal fun dynamicPaginationRequestIdentity( + session: NextcloudSession, + appId: String, + viewId: String, + resourceId: String, + selection: DynamicScreenSelectionIdentity, + pathParameters: Map, + cacheable: Boolean, +): DynamicPaginationRequestIdentity { + val cacheKey = dynamicScreenCacheKey( + session = session, + appId = appId, + viewId = viewId, + selectedRecordId = selection.recordId, + parameterValues = pathParameters, + selectedRecordResourceId = selection.resourceId, + selectedRecordScope = selection.recordScope, + cacheable = cacheable, + ) + return DynamicPaginationRequestIdentity( + account = cacheKey.account, + appId = appId, + viewId = viewId, + resourceId = resourceId, + selection = selection, + pathParameters = pathParameters.toSortedMap(), + cacheKey = cacheKey, + ) +} + +internal fun DynamicPaginationRequestIdentity.isCurrentDynamicPaginationRequest( + active: DynamicPaginationRequestIdentity?, +): Boolean = this == active + internal data class DynamicScreenSnapshot( val records: List, val relatedRecords: Map>, @@ -147,12 +222,68 @@ internal fun dynamicScreenCacheKey( viewId: String, selectedRecordId: String?, parameterValues: Map, + selectedRecordResourceId: String? = null, + selectedRecordScope: Map = emptyMap(), + cacheable: Boolean = true, ): DynamicScreenCacheKey = DynamicScreenCacheKey( account = session.dynamicAccountKey(), appId = appId, viewId = viewId, selectedRecordId = selectedRecordId, + selectedRecordResourceId = selectedRecordResourceId, + selectedRecordScope = selectedRecordScope.toSortedMap(), parameterValues = parameterValues.toSortedMap(), + cacheable = cacheable, +) + +/** + * A screen cache key needs the active parent relation as well as its display record ID. Mailbox + * IDs may overlap between accounts, so omitting accountId can surface a prior mailbox snapshot. + * Keep only relation identifiers; server content, email addresses, and credentials never enter a + * cache key. + */ +internal fun NativeRecord.dynamicScreenCacheScope(): Map = buildMap { + put("recordId", id) + fun addScopeFields(fields: Map) { + fields.forEach { (key, value) -> + val semantic = key.lowercase().filter(Char::isLetterOrDigit) + if (semantic in DYNAMIC_SCREEN_SCOPE_RELATIONS) { + value?.takeIf(String::isNotBlank)?.let { scopedValue -> put(semantic, scopedValue) } + } + } + } + addScopeFields(this@dynamicScreenCacheScope.values) + addScopeFields(this@dynamicScreenCacheScope.bindingContext) +} + +/** + * A pagination merge must not collapse equal server IDs from different Mail accounts or folders. + * The same non-secret relation scope used for screen caching keeps a generic collection stable. + */ +internal fun NativeRecord.dynamicPaginationRecordIdentity(resourceId: String): String = buildString { + append(resourceId) + append('\u0000') + append(id) + dynamicScreenCacheScope().toSortedMap().forEach { (key, value) -> + append('\u0000') + append(key) + append('=') + append(value) + } +} + +private val DYNAMIC_SCREEN_SCOPE_RELATIONS = setOf( + "accountid", + "mailaccountid", + "mailboxid", + "folderid", + "mailfolderid", + "parentid", + "parentmailboxid", + "parentfolderid", + "databaseid", + "messageid", + "threadid", ) private fun NextcloudSession.dynamicAccountKey(): String = diff --git a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/MarketingCaptureScenarios.kt b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/MarketingCaptureScenarios.kt index 198a4dc3..f2cc7737 100644 --- a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/MarketingCaptureScenarios.kt +++ b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/MarketingCaptureScenarios.kt @@ -23,18 +23,30 @@ import androidx.compose.ui.unit.dp import dev.obiente.nextcloudnative.app.design.NextcloudPresentation import dev.obiente.nextcloudnative.app.design.NextcloudSpacing import dev.obiente.nextcloudnative.nativeui.model.AppIdentity +import dev.obiente.nextcloudnative.nativeui.model.ActionIntent +import dev.obiente.nextcloudnative.nativeui.model.ActionRisk +import dev.obiente.nextcloudnative.nativeui.model.ActionSpec +import dev.obiente.nextcloudnative.nativeui.model.ApiBinding import dev.obiente.nextcloudnative.nativeui.model.Confidence +import dev.obiente.nextcloudnative.nativeui.model.DynamicAction +import dev.obiente.nextcloudnative.nativeui.model.DynamicAppDescriptor +import dev.obiente.nextcloudnative.nativeui.model.DynamicForm +import dev.obiente.nextcloudnative.nativeui.model.DynamicHttpBinding +import dev.obiente.nextcloudnative.nativeui.model.EndpointPolicy import dev.obiente.nextcloudnative.nativeui.model.FieldKind import dev.obiente.nextcloudnative.nativeui.model.FieldSpec import dev.obiente.nextcloudnative.nativeui.model.NativeAppSchema import dev.obiente.nextcloudnative.nativeui.model.NativeComponent +import dev.obiente.nextcloudnative.nativeui.model.HttpMethod import dev.obiente.nextcloudnative.nativeui.model.ResourceSpec import dev.obiente.nextcloudnative.nativeui.model.ViewSpec import dev.obiente.nextcloudnative.nativeui.runtime.GenericNativeAppScreen import dev.obiente.nextcloudnative.nativeui.runtime.NativeActionExecutionResult import dev.obiente.nextcloudnative.nativeui.runtime.NativeActionExecutor +import dev.obiente.nextcloudnative.nativeui.runtime.NativeDatasetContext import dev.obiente.nextcloudnative.nativeui.runtime.NativeRecord import dev.obiente.nextcloudnative.nativeui.runtime.NativeScreenState +import dev.obiente.nextcloudnative.nativeui.runtime.preferredNativeMailComposeAction enum class MarketingCapturePurpose(val manifestValue: String) { Showcase("showcase"), @@ -88,6 +100,31 @@ enum class MarketingCaptureScenario( "Dynamic apps", "Data table", "Ready", MarketingCapturePurpose.Showcase, "mobile", "phone-portrait", width = 1_080, height = 1_800, density = 2.625f, ), + MailWorkspaceDesktop( + "mail-workspace-desktop", "mail-workspace-desktop.png", NextcloudPresentation.Desktop, + "Mail", "Adaptive mailbox workspace", "Inbox message selected", MarketingCapturePurpose.Showcase, + "desktop", "wide", issue = 54, width = 1_440, height = 900, density = 1f, + ), + MailWorkspaceMobile( + "mail-workspace-mobile", "mail-workspace-mobile.png", NextcloudPresentation.Adaptive, + "Mail", "Adaptive mailbox workspace", "Inbox message list", MarketingCapturePurpose.Showcase, + "mobile", "phone-portrait", issue = 54, width = 1_080, height = 1_800, density = 2.625f, + ), + MailWorkspaceLoadingMobile( + "mail-workspace-loading-mobile", "mail-workspace-loading-mobile.png", NextcloudPresentation.Adaptive, + "Mail", "Adaptive mailbox workspace", "Loading inbox", MarketingCapturePurpose.StateCoverage, + "mobile", "phone-portrait", issue = 54, width = 1_080, height = 1_800, density = 2.625f, + ), + MailWorkspaceEmptyMobile( + "mail-workspace-empty-mobile", "mail-workspace-empty-mobile.png", NextcloudPresentation.Adaptive, + "Mail", "Adaptive mailbox workspace", "Empty inbox", MarketingCapturePurpose.StateCoverage, + "mobile", "phone-portrait", issue = 54, width = 1_080, height = 1_800, density = 2.625f, + ), + MailWorkspaceErrorDesktop( + "mail-workspace-error-desktop", "mail-workspace-error-desktop.png", NextcloudPresentation.Desktop, + "Mail", "Adaptive mailbox workspace", "Message body error", MarketingCapturePurpose.StateCoverage, + "desktop", "wide", issue = 54, width = 1_440, height = 900, density = 1f, + ), PhotoTimelineRevalidationErrorMobile( "photo-timeline-revalidation-error-mobile", "photo-timeline-revalidation-error-mobile.png", @@ -702,6 +739,73 @@ internal fun MarketingAdaptiveAppScenario(scenario: MarketingCaptureScenario) { } } +@Composable +internal fun MarketingMailWorkspaceScenario(scenario: MarketingCaptureScenario) { + require( + scenario in setOf( + MarketingCaptureScenario.MailWorkspaceDesktop, + MarketingCaptureScenario.MailWorkspaceMobile, + MarketingCaptureScenario.MailWorkspaceLoadingMobile, + MarketingCaptureScenario.MailWorkspaceEmptyMobile, + MarketingCaptureScenario.MailWorkspaceErrorDesktop, + ), + ) { + "${scenario.id} is not a Mail workspace capture." + } + val desktop = scenario.presentation == NextcloudPresentation.Desktop + val composeAction = marketingMailDescriptor.preferredNativeMailComposeAction(marketingMailSchema) + val currentView = if (desktop) marketingMailBodyView else marketingMailMessageView + val currentState = when (scenario) { + MarketingCaptureScenario.MailWorkspaceLoadingMobile -> NativeScreenState.Loading + MarketingCaptureScenario.MailWorkspaceEmptyMobile -> NativeScreenState.Ready(emptyList()) + MarketingCaptureScenario.MailWorkspaceErrorDesktop -> NativeScreenState.Error( + message = "The server did not return the selected message body.", + retry = {}, + retryLabel = "Try again", + ) + else -> NativeScreenState.Ready( + if (desktop) listOf(marketingMailBodyRecord) else marketingMailMessages, + ) + } + Column(modifier = Modifier.fillMaxSize()) { + ScreenHeader( + title = "Mail", + subtitle = "Inbox", + onBack = {}, + trailingContent = { + val compose = composeAction + if (compose != null) { + androidx.compose.material3.Button(onClick = {}) { + Text(compose.label) + } + } + }, + ) + GenericNativeAppScreen( + schema = marketingMailSchema, + view = currentView, + state = currentState, + actionExecutor = NativeActionExecutor { + NativeActionExecutionResult.Failure("This synthetic fixture is read-only.") + }, + selectedRecordId = if (desktop) marketingMailSelectedMessage.id else null, + selectedRecordResourceId = if (desktop) "messages" else null, + showSelectedRecordDetail = desktop, + onSelectRecord = {}, + datasetContext = NativeDatasetContext( + parentResourceId = if (desktop) "messages" else "mailboxes", + parentRecord = if (desktop) marketingMailSelectedMessage else marketingMailInbox, + relatedRecords = mapOf( + "accounts" to listOf(marketingMailAccount), + "mailboxes" to marketingMailboxes, + "messages" to marketingMailMessages, + ), + ), + modifier = Modifier.weight(1f), + ) + } +} + @Composable internal fun MarketingHomeDashboardScenario( scenario: MarketingCaptureScenario, @@ -872,6 +976,218 @@ internal val marketingAdaptiveRecords = listOf( ), ) +private val marketingMailComposeAction = DynamicAction( + id = "compose-message", + label = "Compose", + resourceId = "messages", + intent = ActionIntent.create, + risk = ActionRisk.mutating, + requiresConfirmation = false, + binding = DynamicHttpBinding(method = HttpMethod.POST, path = "/fixture/messages"), + confidence = Confidence.verified, +) + +private val marketingMailSchema = NativeAppSchema( + schemaVersion = "0.1", + app = AppIdentity("fixture-mail", "Mail", "fixture"), + confidence = Confidence.verified, + resources = listOf( + ResourceSpec( + id = "accounts", + name = "Accounts", + confidence = Confidence.verified, + fields = listOf( + FieldSpec("accountName", "Account", FieldKind.string, required = true, readOnly = true), + FieldSpec("emailAddress", "Email", FieldKind.string, required = true, readOnly = true), + ), + ), + ResourceSpec( + id = "mailboxes", + name = "Mailboxes", + confidence = Confidence.verified, + fields = listOf( + FieldSpec("name", "Mailbox", FieldKind.string, required = true, readOnly = true), + FieldSpec("specialUse", "Role", FieldKind.string, required = false, readOnly = true), + FieldSpec("unreadCount", "Unread", FieldKind.integer, required = false, readOnly = true), + FieldSpec("path", "Path", FieldKind.string, required = false, readOnly = true), + ), + ), + ResourceSpec( + id = "messages", + name = "Messages", + confidence = Confidence.verified, + fields = listOf( + FieldSpec("subject", "Subject", FieldKind.string, required = false, readOnly = true), + FieldSpec("from", "From", FieldKind.string, required = false, readOnly = true), + FieldSpec("preview", "Preview", FieldKind.string, required = false, readOnly = true), + FieldSpec("date", "Date", FieldKind.dateTime, required = false, readOnly = true), + FieldSpec("seen", "Seen", FieldKind.boolean, required = false, readOnly = true), + FieldSpec("flagged", "Flagged", FieldKind.boolean, required = false, readOnly = true), + ), + ), + ResourceSpec( + id = "messageBody", + name = "Message body", + confidence = Confidence.verified, + fields = listOf( + FieldSpec("body", "Body", FieldKind.longText, required = true, readOnly = true), + FieldSpec("hasHtmlBody", "HTML", FieldKind.boolean, required = false, readOnly = true), + ), + ), + ), + views = listOf( + ViewSpec( + id = "messages.mailbox", + title = "Inbox", + resourceId = "messages", + component = NativeComponent.mailbox, + sourceActionId = "fixture.messages.list", + confidence = Confidence.verified, + ), + ViewSpec( + id = "message.body", + title = "Message", + resourceId = "messageBody", + component = NativeComponent.detail, + sourceActionId = "fixture.message.body", + confidence = Confidence.verified, + ), + ), + actions = listOf( + ActionSpec( + id = marketingMailComposeAction.id, + label = marketingMailComposeAction.label, + resourceId = marketingMailComposeAction.resourceId, + binding = ApiBinding( + method = marketingMailComposeAction.binding.method, + path = marketingMailComposeAction.binding.path, + operationId = marketingMailComposeAction.id, + ), + intent = marketingMailComposeAction.intent, + risk = marketingMailComposeAction.risk, + requiresConfirmation = marketingMailComposeAction.requiresConfirmation, + confidence = marketingMailComposeAction.confidence, + ), + ), +) + +private val marketingMailDescriptor = DynamicAppDescriptor( + descriptorVersion = "0.1", + app = AppIdentity("fixture-mail", "Mail", "fixture"), + endpointPolicy = EndpointPolicy(serverOrigin = "https://fixture.invalid"), + resources = emptyList(), + actions = listOf(marketingMailComposeAction), + forms = listOf( + DynamicForm( + id = "compose-message-form", + title = "Compose", + resourceId = "messages", + actionId = marketingMailComposeAction.id, + confidence = Confidence.verified, + ), + ), +) + +private val marketingMailMessageView = requireNotNull( + marketingMailSchema.views.firstOrNull { view -> view.id == "messages.mailbox" }, +) +private val marketingMailBodyView = requireNotNull( + marketingMailSchema.views.firstOrNull { view -> view.id == "message.body" }, +) +private val marketingMailAccount = NativeRecord( + id = "personal", + values = mapOf( + "accountName" to "Obiente", + "emailAddress" to "obiente@example.test", + ), +) +private val marketingMailInbox = NativeRecord( + id = "inbox", + values = mapOf( + "name" to "Inbox", + "specialUse" to "inbox", + "unreadCount" to "2", + "path" to "Personal/Inbox", + "accountId" to marketingMailAccount.id, + ), +) +private val marketingMailboxes = listOf( + marketingMailInbox, + NativeRecord( + id = "drafts", + values = mapOf( + "name" to "Drafts", "specialUse" to "drafts", "path" to "Personal/Drafts", + "accountId" to marketingMailAccount.id, + ), + ), + NativeRecord( + id = "sent", + values = mapOf( + "name" to "Sent", "specialUse" to "sent", "path" to "Personal/Sent", + "accountId" to marketingMailAccount.id, + ), + ), + NativeRecord( + id = "archive", + values = mapOf( + "name" to "Archive", "specialUse" to "archive", "path" to "Personal/Archive", + "accountId" to marketingMailAccount.id, + ), + ), +) +private val marketingMailMessages = listOf( + NativeRecord( + id = "mail-1", + values = mapOf( + "subject" to "Release candidate is ready", + "from" to "Ada ", + "preview" to "The Android and desktop artifacts passed the final checks.", + "date" to "2026-07-29T08:42:00Z", + "seen" to "false", + "flagged" to "true", + "accountId" to marketingMailAccount.id, + "mailboxId" to marketingMailInbox.id, + ), + ), + NativeRecord( + id = "mail-2", + values = mapOf( + "subject" to "Design review notes", + "from" to "Mira ", + "preview" to "I added the adaptive navigation feedback to the shared notes.", + "date" to "2026-07-28T17:30:00Z", + "seen" to "false", + "accountId" to marketingMailAccount.id, + "mailboxId" to marketingMailInbox.id, + ), + ), + NativeRecord( + id = "mail-3", + values = mapOf( + "subject" to "Community call", + "from" to "Nextcloud community ", + "preview" to "Here is the agenda for Thursday's community call.", + "date" to "2026-07-27T11:05:00Z", + "seen" to "true", + "accountId" to marketingMailAccount.id, + "mailboxId" to marketingMailInbox.id, + ), + ), +) +private val marketingMailSelectedMessage = marketingMailMessages.first() +private val marketingMailBodyRecord = NativeRecord( + id = marketingMailSelectedMessage.id, + values = mapOf( + "body" to """ +

Hello Obiente,

+

The release candidate is ready for review.

+

Android and desktop artifacts passed the final checks. The visual audit is attached to the build.

+

Thanks,
Ada

+ """.trimIndent(), + "hasHtmlBody" to "true", + ), +) + internal val marketingDashboardSnapshot = NativeDashboardSnapshot( widgets = listOf( marketingDashboardWidget("activity", "Recent activity", 10), diff --git a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/NextcloudNativeApp.kt b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/NextcloudNativeApp.kt index 3641dc61..d63f5b3b 100644 --- a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/NextcloudNativeApp.kt +++ b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/app/NextcloudNativeApp.kt @@ -128,6 +128,13 @@ import dev.obiente.nextcloudnative.nativeui.runtime.NativeActionExecutionResult import dev.obiente.nextcloudnative.nativeui.runtime.NativeActionExecutor import dev.obiente.nextcloudnative.nativeui.runtime.NativeActionRequest import dev.obiente.nextcloudnative.nativeui.runtime.NativeDatasetContext +import dev.obiente.nextcloudnative.nativeui.runtime.isNativeMailWorkspaceContext +import dev.obiente.nextcloudnative.nativeui.runtime.isNativeMailContainerRecord +import dev.obiente.nextcloudnative.nativeui.runtime.hasNativeMailWorkspaceSemantics +import dev.obiente.nextcloudnative.nativeui.runtime.nativeMailInboxLandingRecord +import dev.obiente.nextcloudnative.nativeui.runtime.nativeMailSoleAccountLandingRecord +import dev.obiente.nextcloudnative.nativeui.runtime.nativeMailScreenCacheScopeIsSafe +import dev.obiente.nextcloudnative.nativeui.runtime.preferredNativeMailComposeAction import dev.obiente.nextcloudnative.nativeui.runtime.NativeImageLoader import dev.obiente.nextcloudnative.nativeui.runtime.NativeAudioRecordPlayer import dev.obiente.nextcloudnative.nativeui.runtime.nativeAudioTrack @@ -436,6 +443,12 @@ fun NextcloudNativeMarketingCapture( MarketingCaptureScenario.AdaptiveApp, MarketingCaptureScenario.AdaptiveAppMobile, -> MarketingAdaptiveAppScenario(scenario) + MarketingCaptureScenario.MailWorkspaceDesktop, + MarketingCaptureScenario.MailWorkspaceMobile, + MarketingCaptureScenario.MailWorkspaceLoadingMobile, + MarketingCaptureScenario.MailWorkspaceEmptyMobile, + MarketingCaptureScenario.MailWorkspaceErrorDesktop, + -> MarketingMailWorkspaceScenario(scenario) MarketingCaptureScenario.PhotoTimelineRevalidationErrorMobile, MarketingCaptureScenario.PhotoTimelineReturnToNewestErrorMobile, MarketingCaptureScenario.PhotoTimelineRawRetryMobile, @@ -1504,6 +1517,14 @@ private fun DynamicDiscoveredAppScreen( var paginationState by remember(descriptor) { mutableStateOf(null) } var loadingMore by remember(descriptor) { mutableStateOf(false) } var loadMoreError by remember(descriptor) { mutableStateOf(null) } + val hasRestoredMailLocation = restoredNavigation.selectedViewId != null || + restoredNavigation.selectedRecord != null || + restoredNavigation.history.isNotEmpty() + var automaticMailLandingStage by remember(descriptor) { + mutableStateOf( + if (hasRestoredMailLocation || !descriptor.hasNativeMailWorkspaceSemantics()) 2 else 0, + ) + } val dynamicRecoveryScope = rememberCoroutineScope() val dynamicPaginationScope = rememberCoroutineScope() val dynamicAssetCache = remember(session.serverUrl, session.loginName, descriptor.app.id) { @@ -1607,14 +1628,34 @@ private fun DynamicDiscoveredAppScreen( ) } - LaunchedEffect(descriptor, selectedView?.id, selectedRecord?.id, selectedPathParameterValues, loadAttempt) { + val selectedRecordCacheScope = selectedRecord?.dynamicScreenCacheScope().orEmpty() + val selectedScreenIdentity = dynamicScreenSelectionIdentity( + resourceId = selectedRecordResourceId, + recordId = selectedRecord?.id, + recordScope = selectedRecordCacheScope, + ) + val screenCacheAllowed = !descriptor.hasNativeMailWorkspaceSemantics() || + nativeMailScreenCacheScopeIsSafe(schema, selectedRecordResourceId, selectedRecord) + + LaunchedEffect( + descriptor, + selectedView?.id, + selectedScreenIdentity, + selectedPathParameterValues, + screenCacheAllowed, + loadAttempt, + ) { val view = selectedView ?: return@LaunchedEffect + if (!screenCacheAllowed) recordsByResourceId = emptyMap() val cacheKey = dynamicScreenCacheKey( session = session, appId = descriptor.app.id, viewId = view.id, selectedRecordId = selectedRecord?.id, parameterValues = selectedPathParameterValues, + selectedRecordResourceId = selectedRecordResourceId, + selectedRecordScope = selectedRecordCacheScope, + cacheable = screenCacheAllowed, ) paginationState = null loadingMore = false @@ -1954,26 +1995,37 @@ private fun DynamicDiscoveredAppScreen( val secondaryViewIds = secondaryNavigationDestinations.mapTo(hashSetOf()) { (_, view) -> view.id } navigationDestinations.filterNot { (_, view) -> view.id in secondaryViewIds } } - val actionViews = remember(navigationPlan, schema, selectedRecord, selectedView.resourceId) { - val planned = if (selectedRecord == null) { - navigationPlan.rootFormActions.filter { action -> - action.resourceId == selectedView.resourceId - } - } else { - val currentResourceId = selectedRecordResourceId.orEmpty() - navigationPlan.contextualFormActions.filter { action -> - val spec = schema.action(action.actionId) - val targetsCurrentRecord = action.resourceId.sameDynamicResourceAs(currentResourceId) - val targetsCurrentView = action.resourceId.sameDynamicResourceAs(selectedView.resourceId) - val createsCurrentViewResource = spec?.intent == ActionIntent.create && targetsCurrentView - val editsSelectedRecord = spec?.intent in setOf(ActionIntent.update, ActionIntent.delete) && - targetsCurrentRecord && - (targetsCurrentView || selectedView.component == NativeComponent.detail) - // Create actions belong to the active collection tab. Update and - // delete actions belong to the selected record and stay visible - // on its detail surface, not on unrelated child collections. - createsCurrentViewResource || editsSelectedRecord - } + val actionViews = remember(descriptor, navigationPlan, schema, selectedRecord, selectedView.resourceId) { + val planned = buildList { + addAll(if (selectedRecord == null) { + navigationPlan.rootFormActions.filter { action -> + action.resourceId == selectedView.resourceId + } + } else { + val currentResourceId = selectedRecordResourceId.orEmpty() + navigationPlan.contextualFormActions.filter { action -> + val spec = schema.action(action.actionId) + val targetsCurrentRecord = action.resourceId.sameDynamicResourceAs(currentResourceId) + val targetsCurrentView = action.resourceId.sameDynamicResourceAs(selectedView.resourceId) + val editsMailContainer = descriptor.hasNativeMailWorkspaceSemantics() && + selectedRecord?.let { record -> + isNativeMailContainerRecord(schema, currentResourceId, record) + } == true + val createsCurrentViewResource = spec?.intent == ActionIntent.create && targetsCurrentView + val editsSelectedRecord = spec?.intent in setOf(ActionIntent.update, ActionIntent.delete) && + targetsCurrentRecord && + (targetsCurrentView || selectedView.component == NativeComponent.detail || editsMailContainer) + // Create actions belong to the active collection tab. Update and + // delete actions belong to the selected record and stay visible + // on its detail surface, not on unrelated child collections. + createsCurrentViewResource || editsSelectedRecord + } + }) + if (selectedRecord != null) { + descriptor.preferredNativeMailComposeAction(schema)?.let(::add) + } + }.distinctBy { action -> + "${action.formId}:${action.actionId}:${action.pathParameterValues}" } planned.mapNotNull { action -> schema.views.firstOrNull { it.id == action.formId }?.let { view -> action to view } @@ -2015,9 +2067,48 @@ private fun DynamicDiscoveredAppScreen( loadMoreError = null val pagingView = selectedView val existingRecords = (viewState as? NativeScreenState.Ready)?.records.orEmpty() - val values = selectedRecord?.toDynamicRuntimeValues().orEmpty() + - selectedPathParameterValues + + val pagingSelection = selectedScreenIdentity + val pagingPathParameters = selectedPathParameterValues.toMap() + val pagingCacheable = screenCacheAllowed + val pagingRequestIdentity = dynamicPaginationRequestIdentity( + session = session, + appId = descriptor.app.id, + viewId = pagingView.id, + resourceId = pagingView.resourceId, + selection = pagingSelection, + pathParameters = pagingPathParameters, + cacheable = pagingCacheable, + ) + val pagingRuntimeValues = selectedRecord?.toDynamicRuntimeValues().orEmpty().toMap() + val values = pagingRuntimeValues + + pagingPathParameters + (pagination.spec.parameterName to pagination.nextRequestValue) + fun isPagingRequestCurrent(): Boolean { + val activeView = schema.views.firstOrNull { view -> view.id == selectedViewId } + ?: return false + val activeRecord = selectedRecord + val activeSelection = dynamicScreenSelectionIdentity( + resourceId = selectedRecordResourceId, + recordId = activeRecord?.id, + recordScope = activeRecord?.dynamicScreenCacheScope().orEmpty(), + ) + val activeCacheable = !descriptor.hasNativeMailWorkspaceSemantics() || + nativeMailScreenCacheScopeIsSafe( + schema, + selectedRecordResourceId, + activeRecord, + ) + val activeIdentity = dynamicPaginationRequestIdentity( + session = session, + appId = descriptor.app.id, + viewId = activeView.id, + resourceId = activeView.resourceId, + selection = activeSelection, + pathParameters = selectedPathParameterValues, + cacheable = activeCacheable, + ) + return pagingRequestIdentity.isCurrentDynamicPaginationRequest(activeIdentity) + } dynamicPaginationScope.launch { runCatching { loadDynamicRecords( @@ -2029,37 +2120,38 @@ private fun DynamicDiscoveredAppScreen( runtimeContext = values, ) }.onSuccess { pageRecords -> - if (selectedViewId != pagingView.id) return@onSuccess - val existingIds = existingRecords.mapTo(hashSetOf(), NativeRecord::id) - val novelRecords = pageRecords.distinctBy(NativeRecord::id) - .filterNot { record -> record.id in existingIds } + if (!isPagingRequestCurrent()) return@onSuccess + val existingIdentities = existingRecords.mapTo(hashSetOf()) { record -> + record.dynamicPaginationRecordIdentity(pagingView.resourceId) + } + val novelRecords = pageRecords + .distinctBy { record -> record.dynamicPaginationRecordIdentity(pagingView.resourceId) } + .filterNot { record -> + record.dynamicPaginationRecordIdentity(pagingView.resourceId) in existingIdentities + } val mergedRecords = existingRecords + novelRecords - recordsByResourceId = recordsByResourceId + (pagingView.resourceId to mergedRecords) + val updatedRecords = recordsByResourceId + (pagingView.resourceId to mergedRecords) viewState = NativeScreenState.Ready(mergedRecords) - paginationState = pagination.spec.toDynamicPaginationState( + val nextPagination = pagination.spec.toDynamicPaginationState( viewId = pagingView.id, lastPage = pageRecords, loadedRecordCount = mergedRecords.size, novelRecordCount = novelRecords.size, nextPageNumber = pagination.nextPageNumber + 1, ) + recordsByResourceId = updatedRecords + paginationState = nextPagination sharedDynamicNativeMemoryCache.storeScreen( - dynamicScreenCacheKey( - session = session, - appId = descriptor.app.id, - viewId = pagingView.id, - selectedRecordId = selectedRecord?.id, - parameterValues = selectedPathParameterValues, - ), + pagingRequestIdentity.cacheKey, DynamicScreenSnapshot( records = mergedRecords, - relatedRecords = recordsByResourceId, - pagination = paginationState?.toCheckpoint(), + relatedRecords = updatedRecords, + pagination = nextPagination?.toCheckpoint(), ), ) loadingMore = false }.onFailure { failure -> - if (selectedViewId != pagingView.id) return@onFailure + if (!isPagingRequestCurrent()) return@onFailure loadMoreError = failure.message ?: "Could not load the next page." loadingMore = false } @@ -2078,6 +2170,95 @@ private fun DynamicDiscoveredAppScreen( ) } + fun selectDynamicRecord(record: NativeRecord) { + rememberCurrentLocation() + val selectedParentResourceId = record.effectiveNativeResourceId(selectedView.resourceId) + val inheritedParameters = inheritDynamicParentParameters( + selectedPathParameterValues = selectedPathParameterValues, + runtimeValues = runtimeValues, + ) + val nextContext = DynamicResourceRecordContext( + resourceId = selectedParentResourceId, + recordId = record.id, + fieldValues = record.values, + parameterValues = inheritedParameters, + actionSafeIdentity = record.actionSafeIdentity, + currentLayoutId = selectedView.id, + ) + val nextPlan = descriptor.planDynamicNavigation(nextContext) + val compositeTarget = schema.views.firstOrNull { candidate -> + candidate.compositeDataGrid?.parentResourceId == selectedParentResourceId + } + val compositeActionIds = compositeTarget?.compositeDataGrid?.let { grid -> + setOf(grid.columnSourceActionId, grid.rowSourceActionId) + }.orEmpty() + val detailResolution = schema.bestDynamicDetailView(selectedParentResourceId) + ?.takeIf { target -> target.id != selectedView.id } + ?.let { target -> + descriptor.resolveDynamicRecordReadParameters(target.sourceActionId, nextContext) + ?.let { parameters -> target to parameters } + } + val detailTarget = detailResolution?.first + val directChild = descriptor.singleSafeContextualChild( + context = nextContext, + hasDedicatedSurface = compositeTarget != null || detailTarget != null, + ) + val preferredCollectionChild = descriptor.preferredSemanticContextualChild(nextContext) + val primaryContentTarget = primaryDynamicContentDestination( + parentResourceId = selectedParentResourceId, + destinations = nextPlan.contextualChildDestinations, + ) + val nextViewId = compositeTarget?.id + ?: primaryContentTarget?.layoutId + ?: preferredCollectionChild?.layoutId + ?: detailTarget?.id + ?: directChild?.layoutId + ?: selectedViewId + val explicitTargetParameters = primaryContentTarget?.pathParameterValues + ?: preferredCollectionChild?.pathParameterValues + ?: directChild?.pathParameterValues + ?: detailResolution?.second + val fallbackTargetParameters = inheritedParameters + + nextPlan.contextualChildDestinations + .filter { destination -> destination.actionId in compositeActionIds } + .flatMap { destination -> destination.pathParameterValues.entries } + .associate(Map.Entry::toPair) + selectedRecord = record + selectedRecordResourceId = selectedParentResourceId + selectedPathParameterValues = resolveDynamicRecordSelectionParameters( + currentViewId = selectedViewId.orEmpty(), + nextViewId = nextViewId.orEmpty(), + currentParameters = selectedPathParameterValues, + explicitTargetParameters = explicitTargetParameters, + fallbackTargetParameters = fallbackTargetParameters, + ) + selectedViewId = nextViewId + } + + LaunchedEffect( + descriptor, + selectedView.id, + viewState, + automaticMailLandingStage, + ) { + val records = (viewState as? NativeScreenState.Ready)?.records ?: return@LaunchedEffect + if (records.isEmpty()) return@LaunchedEffect + val resource = schema.resource(selectedView.resourceId) ?: return@LaunchedEffect + when (automaticMailLandingStage) { + 0 -> { + val account = nativeMailSoleAccountLandingRecord(resource, records) + automaticMailLandingStage = if (account == null) 2 else 1 + account?.let(::selectDynamicRecord) + } + + 1 -> { + val inbox = nativeMailInboxLandingRecord(resource, records) + automaticMailLandingStage = 2 + inbox?.let(::selectDynamicRecord) + } + } + } + fun navigateWithinDynamicApp() { navigationHistory.lastOrNull()?.let { previous -> navigationHistory = navigationHistory.dropLast(1) @@ -2301,85 +2482,36 @@ private fun DynamicDiscoveredAppScreen( } } } + val rendererDatasetContext = NativeDatasetContext( + parentResourceId = selectedRecordResourceId, + parentRecord = selectedRecord, + relatedRecords = recordsByResourceId, + ) + val mailWorkspaceSupportsSelection = schema.resource(selectedView.resourceId)?.let { resource -> + val records = (viewState as? NativeScreenState.Ready)?.records.orEmpty() + isNativeMailWorkspaceContext( + schema = schema, + resource = resource, + records = records, + context = rendererDatasetContext, + ) + } == true GenericNativeAppScreen( schema = schema, view = selectedView, state = viewState, actionExecutor = executor, selectedRecordId = selectedRecord?.id, + selectedRecordResourceId = selectedRecordResourceId, showSelectedRecordDetail = showFallbackRecordDetail, - datasetContext = NativeDatasetContext( - parentResourceId = selectedRecordResourceId, - parentRecord = selectedRecord, - relatedRecords = recordsByResourceId, - ), - onSelectRecord = selectedView.takeIf { - it.component != NativeComponent.detail && it.component != NativeComponent.form - }?.let { - { record -> - rememberCurrentLocation() - val selectedParentResourceId = record.effectiveNativeResourceId(selectedView.resourceId) - val inheritedParameters = inheritDynamicParentParameters( - selectedPathParameterValues = selectedPathParameterValues, - runtimeValues = runtimeValues, - ) - val nextContext = DynamicResourceRecordContext( - resourceId = selectedParentResourceId, - recordId = record.id, - fieldValues = record.values, - parameterValues = inheritedParameters, - actionSafeIdentity = record.actionSafeIdentity, - currentLayoutId = selectedView.id, - ) - val nextPlan = descriptor.planDynamicNavigation(nextContext) - val compositeTarget = schema.views.firstOrNull { candidate -> - candidate.compositeDataGrid?.parentResourceId == selectedParentResourceId - } - val compositeActionIds = compositeTarget?.compositeDataGrid?.let { grid -> - setOf(grid.columnSourceActionId, grid.rowSourceActionId) - }.orEmpty() - val detailResolution = schema.bestDynamicDetailView(selectedParentResourceId) - ?.takeIf { target -> target.id != selectedView.id } - ?.let { target -> - descriptor.resolveDynamicRecordReadParameters(target.sourceActionId, nextContext) - ?.let { parameters -> target to parameters } - } - val detailTarget = detailResolution?.first - val directChild = descriptor.singleSafeContextualChild( - context = nextContext, - hasDedicatedSurface = compositeTarget != null || detailTarget != null, - ) - val preferredCollectionChild = descriptor.preferredSemanticContextualChild(nextContext) - val primaryContentTarget = primaryDynamicContentDestination( - parentResourceId = selectedParentResourceId, - destinations = nextPlan.contextualChildDestinations, - ) - val nextViewId = compositeTarget?.id - ?: primaryContentTarget?.layoutId - ?: preferredCollectionChild?.layoutId - ?: detailTarget?.id - ?: directChild?.layoutId - ?: selectedViewId - val explicitTargetParameters = primaryContentTarget?.pathParameterValues - ?: preferredCollectionChild?.pathParameterValues - ?: directChild?.pathParameterValues - ?: detailResolution?.second - val fallbackTargetParameters = inheritedParameters + - nextPlan.contextualChildDestinations - .filter { destination -> destination.actionId in compositeActionIds } - .flatMap { destination -> destination.pathParameterValues.entries } - .associate(Map.Entry::toPair) - selectedRecord = record - selectedRecordResourceId = selectedParentResourceId - selectedPathParameterValues = resolveDynamicRecordSelectionParameters( - currentViewId = selectedViewId.orEmpty(), - nextViewId = nextViewId.orEmpty(), - currentParameters = selectedPathParameterValues, - explicitTargetParameters = explicitTargetParameters, - fallbackTargetParameters = fallbackTargetParameters, - ) - selectedViewId = nextViewId - } + datasetContext = rendererDatasetContext, + onSelectRecord = if ( + selectedView.component != NativeComponent.form && + (selectedView.component != NativeComponent.detail || mailWorkspaceSupportsSelection) + ) { + ::selectDynamicRecord + } else { + null }, onActionSucceeded = { if (schema.action(selectedView.sourceActionId)?.intent == ActionIntent.delete) { diff --git a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/GenericNativeRenderer.kt b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/GenericNativeRenderer.kt index a8f3c7d1..34071a98 100644 --- a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/GenericNativeRenderer.kt +++ b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/GenericNativeRenderer.kt @@ -126,6 +126,7 @@ fun GenericNativeAppScreen( actionExecutor: NativeActionExecutor, modifier: Modifier = Modifier, selectedRecordId: String? = null, + selectedRecordResourceId: String? = null, showSelectedRecordDetail: Boolean = false, onSelectRecord: ((NativeRecord) -> Unit)? = null, onOpenLink: ((String) -> Unit)? = null, @@ -167,6 +168,72 @@ fun GenericNativeAppScreen( nestedBoard != null -> GenericNativeSurface.Board else -> view.genericSurface(presentedResource, presentedRecords) } + val mailWorkspaceSection = remember(schema, presentedResource, datasetContext) { + presentedResource?.let { currentResource -> + nativeMailWorkspaceSection(schema, currentResource, datasetContext) + } ?: NativeMailWorkspaceSection.Unknown + } + val mailWorkspaceEligible = remember(schema, mailWorkspaceSection) { + schema.hasNativeMailWorkspaceSemantics() && + mailWorkspaceSection != NativeMailWorkspaceSection.Unknown + } + val mailWorkspacePlan = remember( + schema, + presentedResource, + presentedRecords, + datasetContext, + selectedRecordId, + selectedRecordResourceId, + mailWorkspaceEligible, + ) { + presentedResource + ?.takeIf { mailWorkspaceEligible } + ?.let { currentResource -> + nativeMailWorkspacePlan( + schema = schema, + currentResource = currentResource, + currentRecords = presentedRecords, + context = datasetContext, + selectedRecordId = selectedRecordId, + selectedRecordResourceId = selectedRecordResourceId, + ) + } + } + val mailWorkspaceDetailTarget = remember( + schema, + presentedResource, + presentedRecords, + datasetContext, + mailWorkspacePlan?.selectedMessage, + ) { + presentedResource + ?.takeIf { mailWorkspaceEligible } + ?.let { currentResource -> + nativeMailWorkspaceDetailTarget( + schema = schema, + currentResource = currentResource, + currentRecords = presentedRecords, + context = datasetContext, + selectedMessage = mailWorkspacePlan?.selectedMessage, + ) + } + } + val mailWorkspaceContentState = remember(state, mailWorkspaceSection) { + when (state) { + NativeScreenState.Loading -> NativeMailWorkspaceContentState.Loading(mailWorkspaceSection) + is NativeScreenState.Error -> NativeMailWorkspaceContentState.Error( + section = mailWorkspaceSection, + message = state.message, + retry = state.retry, + retryLabel = state.retryLabel, + ) + is NativeScreenState.Ready -> if (state.records.isEmpty()) { + NativeMailWorkspaceContentState.Empty(mailWorkspaceSection) + } else { + NativeMailWorkspaceContentState.Ready + } + } + } Surface( modifier = modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background, @@ -176,6 +243,18 @@ fun GenericNativeAppScreen( Box(modifier = Modifier.weight(1f).fillMaxWidth()) { when { presentedResource == null -> GenericRendererError("This view references an unknown resource.") + mailWorkspacePlan != null && state is NativeScreenState.Loading -> + NativeMailWorkspace( + plan = mailWorkspacePlan, + onSelectRecord = onSelectRecord, + contentState = mailWorkspaceContentState, + ) + mailWorkspacePlan != null && state is NativeScreenState.Error -> + NativeMailWorkspace( + plan = mailWorkspacePlan, + onSelectRecord = onSelectRecord, + contentState = mailWorkspaceContentState, + ) state is NativeScreenState.Loading -> GenericRendererLoading(view.title) state is NativeScreenState.Error -> GenericRendererError( state.message, @@ -190,14 +269,43 @@ fun GenericNativeAppScreen( presentedRecords.firstOrNull() ?: datasetContext.parentRecord, datasetContext, actionExecutor, - filePicker, - onActionSucceeded, + filePicker, + onActionSucceeded, + ) + state is NativeScreenState.Ready && + state.records.isEmpty() && + mailWorkspacePlan != null -> + NativeMailWorkspace( + plan = mailWorkspacePlan, + onSelectRecord = onSelectRecord, + contentState = mailWorkspaceContentState, ) state is NativeScreenState.Ready && presentedRecords.isEmpty() && view.compositeDataGrid == null && nestedBoard == null -> GenericRendererEmpty(presentedResource.name) + state is NativeScreenState.Ready && mailWorkspacePlan != null -> + NativeMailWorkspace( + plan = mailWorkspacePlan, + onSelectRecord = onSelectRecord, + contentState = mailWorkspaceContentState, + detailContent = mailWorkspaceDetailTarget + ?.let { target -> + { + GenericMailMessageDetail( + schema = schema, + resource = target.resource, + record = target.record, + message = target.presentation, + datasetContext = datasetContext, + actionExecutor = actionExecutor, + onActionSucceeded = onActionSucceeded, + onInlineActionSucceeded = onInlineActionSucceeded, + ) + } + }, + ) state is NativeScreenState.Ready -> when (presentedSurface) { GenericNativeSurface.List -> GenericRecordCollection( resource = presentedResource, @@ -1349,7 +1457,7 @@ private fun GenericMailboxCollection( verticalAlignment = Alignment.CenterVertically, ) { Text( - presentation.sender ?: presentation.title, + nativeMailSenderLabel(presentation.sender) ?: presentation.title, modifier = Modifier.weight(1f), style = MaterialTheme.typography.bodyLarge.copy( fontWeight = if (presentation.unread) FontWeight.Bold else FontWeight.Medium, @@ -1357,7 +1465,7 @@ private fun GenericMailboxCollection( maxLines = 1, overflow = TextOverflow.Ellipsis, ) - presentation.timestamp?.let { timestamp -> + nativeMailTimestampLabel(presentation.timestamp)?.let { timestamp -> Text( timestamp, style = MaterialTheme.typography.labelSmall, @@ -1376,7 +1484,7 @@ private fun GenericMailboxCollection( } } } - if (presentation.sender != null) { + if (nativeMailSenderLabel(presentation.sender) != null) { Text( presentation.title, style = MaterialTheme.typography.bodyMedium.copy( @@ -3146,7 +3254,7 @@ private fun GenericGroupwareDetail( @OptIn(ExperimentalRichTextApi::class) @Composable -private fun GenericMailMessageDetail( +internal fun GenericMailMessageDetail( schema: NativeAppSchema, resource: ResourceSpec, record: NativeRecord, @@ -3157,6 +3265,7 @@ private fun GenericMailMessageDetail( onInlineActionSucceeded: (() -> Unit)?, ) { val structured = remember(resource, record) { nativeStructuredDetail(resource, record) } + val threadMessages = remember(resource, record) { nativeMailThreadPresentations(resource, record) } val attachments = structured.sections.filter { section -> section.fieldId.lowercase().filter(Char::isLetterOrDigit) in setOf("attachments", "inlineattachments") } @@ -3224,7 +3333,10 @@ private fun GenericMailMessageDetail( ) } Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { - Text(message.sender ?: "Unknown sender", style = MaterialTheme.typography.titleMedium) + Text( + nativeMailSenderLabel(message.sender) ?: "Unknown sender", + style = MaterialTheme.typography.titleMedium, + ) message.recipients?.let { recipients -> Text( "To $recipients", @@ -3235,7 +3347,7 @@ private fun GenericMailMessageDetail( ) } } - message.timestamp?.let { timestamp -> + nativeMailTimestampLabel(message.timestamp)?.let { timestamp -> Text( timestamp, style = MaterialTheme.typography.labelMedium, @@ -3275,24 +3387,35 @@ private fun GenericMailMessageDetail( ) } } - Card( - modifier = Modifier.fillMaxWidth(), - colors = CardDefaults.cardColors(containerColor = NextcloudTheme.colors.appTile), - shape = RoundedCornerShape(NextcloudRadii.Card), - ) { - SelectionContainer { - if (!htmlBody.isNullOrBlank()) { - RichText( - state = richTextState, - modifier = Modifier.fillMaxWidth().padding(NextcloudSpacing.Large), - style = MaterialTheme.typography.bodyLarge, - ) - } else { - Text( - plainBody?.takeIf(String::isNotBlank) ?: "This message has no readable body.", - modifier = Modifier.fillMaxWidth().padding(NextcloudSpacing.Large), - style = MaterialTheme.typography.bodyLarge, - ) + if (threadMessages.size > 1) { + Text( + "${threadMessages.size} messages", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + ) + threadMessages.forEach { threadMessage -> + GenericMailThreadMessage(threadMessage) + } + } else { + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = NextcloudTheme.colors.appTile), + shape = RoundedCornerShape(NextcloudRadii.Card), + ) { + SelectionContainer { + if (!htmlBody.isNullOrBlank()) { + RichText( + state = richTextState, + modifier = Modifier.fillMaxWidth().padding(NextcloudSpacing.Large), + style = MaterialTheme.typography.bodyLarge, + ) + } else { + Text( + plainBody?.takeIf(String::isNotBlank) ?: "This message has no readable body.", + modifier = Modifier.fillMaxWidth().padding(NextcloudSpacing.Large), + style = MaterialTheme.typography.bodyLarge, + ) + } } } } @@ -3357,6 +3480,64 @@ private fun GenericMailMessageDetail( } } +@OptIn(ExperimentalRichTextApi::class) +@Composable +private fun GenericMailThreadMessage(message: NativeMailMessageDetailPresentation) { + val htmlBody = remember(message.body, message.htmlBody) { + message.body?.takeIf { value -> message.htmlBody || value.contains('<') && value.contains('>') } + ?.let(::sanitizeNativeMailHtml) + } + val richTextState = rememberRichTextState() + LaunchedEffect(htmlBody) { + if (!htmlBody.isNullOrBlank()) richTextState.setHtml(htmlBody) + } + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = NextcloudTheme.colors.appTile), + shape = RoundedCornerShape(NextcloudRadii.Card), + ) { + Column( + modifier = Modifier.fillMaxWidth().padding(NextcloudSpacing.Large), + verticalArrangement = Arrangement.spacedBy(NextcloudSpacing.Medium), + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(NextcloudSpacing.Medium), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + nativeMailSenderLabel(message.sender) ?: "Unknown sender", + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.titleSmall, + fontWeight = FontWeight.SemiBold, + ) + nativeMailTimestampLabel(message.timestamp)?.let { timestamp -> + Text( + timestamp, + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + SelectionContainer { + if (!htmlBody.isNullOrBlank()) { + RichText( + state = richTextState, + modifier = Modifier.fillMaxWidth(), + style = MaterialTheme.typography.bodyLarge, + ) + } else { + Text( + message.body?.takeIf(String::isNotBlank) ?: "This message has no readable body.", + modifier = Modifier.fillMaxWidth(), + style = MaterialTheme.typography.bodyLarge, + ) + } + } + } + } +} + private data class NativeMailAttachment(val name: String, val mime: String?, val size: String?) private fun NativeStructuredValue.mailAttachments(): List = when (this) { diff --git a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspace.kt b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspace.kt new file mode 100644 index 00000000..a1bec42c --- /dev/null +++ b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspace.kt @@ -0,0 +1,1225 @@ +package dev.obiente.nextcloudnative.nativeui.runtime + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.VerticalDivider +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.selected +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.stateDescription +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import dev.obiente.nextcloudnative.app.design.NextcloudIcons +import dev.obiente.nextcloudnative.app.design.NextcloudSpacing +import dev.obiente.nextcloudnative.app.design.NextcloudTheme +import dev.obiente.nextcloudnative.nativeui.model.ActionIntent +import dev.obiente.nextcloudnative.nativeui.model.DynamicAppDescriptor +import dev.obiente.nextcloudnative.nativeui.model.DynamicNavigationFormAction +import dev.obiente.nextcloudnative.nativeui.model.HttpMethod +import dev.obiente.nextcloudnative.nativeui.model.NativeAppSchema +import dev.obiente.nextcloudnative.nativeui.model.ResourceSpec + +internal data class NativeMailWorkspaceItem( + val resource: ResourceSpec, + val record: NativeRecord, + val presentation: NativeMailboxPresentation, + val hierarchyDepth: Int = 0, +) + +internal data class NativeMailWorkspacePlan( + val accounts: List, + val folders: List, + val messages: List, + val currentItems: List, + val selectedContainer: NativeMailWorkspaceItem?, + val selectedMessage: NativeMailWorkspaceItem?, + private val cachedMessagesForSelectedMailbox: List, +) { + val hasMailData: Boolean + get() = accounts.isNotEmpty() || folders.isNotEmpty() || messages.isNotEmpty() + + val preferredInbox: NativeMailWorkspaceItem? + get() = folders.maxByOrNull { item -> item.inboxScore() } + ?.takeIf { item -> item.inboxScore() > 0 } + + val visibleMessages: List + get() { + val currentMessages = currentItems.filter { item -> + item.presentation.kind == NativeMailboxItemKind.Message + } + return when { + currentMessages.isNotEmpty() -> currentMessages + selectedMessage != null -> messages.visibleMailSiblings(selectedMessage) + selectedContainer?.presentation?.kind == NativeMailboxItemKind.Folder -> + cachedMessagesForSelectedMailbox + else -> emptyList() + } + } +} + +internal enum class NativeMailWorkspaceSection { + Accounts, + Mailboxes, + Messages, + MessageDetail, + Unknown, +} + +internal sealed interface NativeMailWorkspaceContentState { + data object Ready : NativeMailWorkspaceContentState + + data class Loading( + val section: NativeMailWorkspaceSection, + ) : NativeMailWorkspaceContentState + + data class Empty( + val section: NativeMailWorkspaceSection, + ) : NativeMailWorkspaceContentState + + data class Error( + val section: NativeMailWorkspaceSection, + val message: String, + val retry: (() -> Unit)?, + val retryLabel: String, + ) : NativeMailWorkspaceContentState +} + +internal fun nativeMailWorkspacePlan( + schema: NativeAppSchema, + currentResource: ResourceSpec, + currentRecords: List, + context: NativeDatasetContext, + selectedRecordId: String?, + selectedRecordResourceId: String? = null, +): NativeMailWorkspacePlan { + val currentIsMessageFacet = context.parentResourceId + ?.takeUnless { parentResourceId -> parentResourceId == currentResource.id } + ?.let(schema::resource) + ?.let { parentResource -> + val parent = context.parentRecord + parent != null && + nativeMailboxPresentation(parentResource, parent).kind == NativeMailboxItemKind.Message && + currentRecords.any { record -> + nativeMailMessageRenderTarget( + schema = schema, + resource = currentResource, + record = record, + context = context, + ) != null + } + } + ?: false + val datasets = buildList { + add(currentResource to currentRecords) + context.relatedRecords.forEach { (resourceId, records) -> + if (resourceId != currentResource.id) { + schema.resource(resourceId)?.let { resource -> add(resource to records) } + } + } + } + val seen = mutableSetOf() + val rawItems = datasets.flatMap { (resource, records) -> + records.mapNotNull { record -> + if (currentIsMessageFacet && resource.id == currentResource.id) return@mapNotNull null + val presentation = nativeMailboxPresentation(resource, record) + if (presentation.kind == NativeMailboxItemKind.Unknown) return@mapNotNull null + val key = nativeMailWorkspaceRecordKey(resource, record, presentation) + if (!seen.add(key)) return@mapNotNull null + NativeMailWorkspaceItem( + resource = resource, + record = record.withNativeResource(resource.id, currentResource.id), + presentation = presentation, + hierarchyDepth = if (presentation.kind == NativeMailboxItemKind.Folder) { + record.mailboxHierarchyDepth() + } else { + 0 + }, + ) + } + } + val minimumFolderDepth = rawItems + .filter { item -> item.presentation.kind == NativeMailboxItemKind.Folder } + .minOfOrNull { item -> item.hierarchyDepth } + ?: 0 + val items = rawItems.map { item -> + if (item.presentation.kind == NativeMailboxItemKind.Folder) { + item.copy(hierarchyDepth = (item.hierarchyDepth - minimumFolderDepth).coerceAtLeast(0)) + } else { + item + } + } + val currentKeys = currentRecords.mapNotNullTo(hashSetOf()) { record -> + nativeMailboxPresentation(currentResource, record) + .takeIf { presentation -> presentation.kind != NativeMailboxItemKind.Unknown } + ?.let { presentation -> nativeMailWorkspaceRecordKey(currentResource, record, presentation) } + } + val currentItems = items.filter { item -> + item.nativeMailWorkspaceRecordKey() in currentKeys + } + val messages = items + .filter { item -> item.presentation.kind == NativeMailboxItemKind.Message } + .sortedWith( + compareByDescending { item -> item.presentation.unread } + .thenByDescending { item -> item.presentation.timestamp.orEmpty() } + .thenBy { item -> item.presentation.title.lowercase() }, + ) + val selectedMessage = context.parentRecord?.let { parent -> + val parentIsMessage = context.parentResourceId + ?.let(schema::resource) + ?.let { resource -> nativeMailboxPresentation(resource, parent).kind } + ?.let { kind -> kind == NativeMailboxItemKind.Message } + ?: false + if (!parentIsMessage) { + null + } else { + items.singleMailWorkspaceSelection( + resourceId = context.parentResourceId, + record = parent, + kind = NativeMailboxItemKind.Message, + ) + } + } ?: items.singleMailWorkspaceSelection( + resourceId = selectedRecordResourceId, + recordId = selectedRecordId, + kind = NativeMailboxItemKind.Message, + ) + val selectedContainer = context.parentRecord?.let { parent -> + context.parentResourceId?.let { parentResourceId -> + items.singleMailWorkspaceSelection( + resourceId = parentResourceId, + record = parent, + kinds = setOf(NativeMailboxItemKind.Account, NativeMailboxItemKind.Folder), + ) + } + } ?: items.singleMailWorkspaceSelection( + resourceId = selectedRecordResourceId, + recordId = selectedRecordId, + kinds = setOf(NativeMailboxItemKind.Account, NativeMailboxItemKind.Folder), + ) + val cachedMessagesForSelectedMailbox = selectedContainer + ?.takeIf { container -> container.presentation.kind == NativeMailboxItemKind.Folder } + ?.let { mailbox -> messages.filter { message -> message.belongsToMailbox(mailbox) } } + .orEmpty() + return NativeMailWorkspacePlan( + accounts = items + .filter { item -> item.presentation.kind == NativeMailboxItemKind.Account } + .sortedBy { item -> item.presentation.title.lowercase() }, + folders = items + .filter { item -> item.presentation.kind == NativeMailboxItemKind.Folder } + .sortedWith( + compareByDescending { item -> item.inboxScore() } + .thenBy { item -> item.mailboxHierarchySortKey() } + .thenBy { item -> item.hierarchyDepth }, + ), + messages = messages, + currentItems = currentItems, + selectedContainer = selectedContainer, + selectedMessage = selectedMessage, + cachedMessagesForSelectedMailbox = cachedMessagesForSelectedMailbox, + ) +} + +/** + * Resolves a selected message body from the active response before falling back to the selected + * message record. A body endpoint commonly returns a separate record that must be merged with + * the selected envelope to render the desktop detail pane. + */ +internal fun nativeMailWorkspaceDetailTarget( + schema: NativeAppSchema, + currentResource: ResourceSpec, + currentRecords: List, + context: NativeDatasetContext, + selectedMessage: NativeMailWorkspaceItem?, +): NativeMailMessageRenderTarget? { + if (selectedMessage == null) return null + return currentRecords.firstNotNullOfOrNull { record -> + nativeMailMessageRenderTarget( + schema = schema, + resource = currentResource, + record = record, + context = context, + ) + } ?: nativeMailMessageRenderTarget( + schema = schema, + resource = selectedMessage.resource, + record = selectedMessage.record, + context = context, + ) +} + +internal fun isNativeMailWorkspaceContext( + schema: NativeAppSchema, + resource: ResourceSpec, + records: List, + context: NativeDatasetContext, +): Boolean = nativeMailWorkspacePlan(schema, resource, records, context, null).hasMailData + +internal fun nativeMailSoleAccountLandingRecord( + resource: ResourceSpec, + records: List, +): NativeRecord? { + if (records.isEmpty()) return null + val accounts = records.filter { record -> + nativeMailboxPresentation(resource, record).kind == NativeMailboxItemKind.Account + } + return accounts.singleOrNull()?.takeIf { accounts.size == records.size } +} + +internal fun nativeMailInboxLandingRecord( + resource: ResourceSpec, + records: List, +): NativeRecord? { + if (records.isEmpty()) return null + val folders = records.mapNotNull { record -> + val presentation = nativeMailboxPresentation(resource, record) + if (presentation.kind != NativeMailboxItemKind.Folder) return@mapNotNull null + NativeMailWorkspaceItem( + resource = resource, + record = record, + presentation = presentation, + hierarchyDepth = record.mailboxHierarchyDepth(), + ) + } + if (folders.size != records.size) return null + val highestScore = folders.maxOfOrNull { item -> item.inboxScore() } ?: return null + if (highestScore <= 0) return null + return folders + .filter { item -> item.inboxScore() == highestScore } + .map { item -> item.record } + .singleOrNull() +} + +internal fun isNativeMailContainerRecord( + schema: NativeAppSchema, + resourceId: String, + record: NativeRecord, +): Boolean = schema.resource(resourceId) + ?.let { resource -> nativeMailboxPresentation(resource, record).kind } + ?.let { kind -> kind == NativeMailboxItemKind.Account || kind == NativeMailboxItemKind.Folder } + ?: false + +/** + * A sparse Mail selection must name its account before it can reuse a screen snapshot. Mailbox + * IDs are commonly reused (for example, Inbox) and guessing their account would show the wrong + * cached messages after an account switch. + */ +internal fun nativeMailScreenCacheScopeIsSafe( + schema: NativeAppSchema, + resourceId: String?, + record: NativeRecord?, +): Boolean { + if (resourceId == null || record == null) return true + val resource = schema.resource(resourceId) ?: return true + return when (val kind = nativeMailboxPresentation(resource, record).kind) { + NativeMailboxItemKind.Unknown -> true + NativeMailboxItemKind.Account, + NativeMailboxItemKind.Folder -> record.mailWorkspaceAccountIds(kind).isNotEmpty() + NativeMailboxItemKind.Message -> + record.mailWorkspaceAccountIds(kind).isNotEmpty() && + record.mailWorkspaceMailboxIds(kind).isNotEmpty() + } +} + +internal fun DynamicAppDescriptor.hasNativeMailWorkspaceSemantics(): Boolean { + val words = resources.map { resource -> + listOf(resource.id, resource.label).flatMap { value -> value.mailSemanticWords() }.toSet() + } + return words.hasCompleteMailWorkspaceSemantics() +} + +internal fun NativeAppSchema.hasNativeMailWorkspaceSemantics(): Boolean { + val words = resources.map { resource -> + listOf(resource.id, resource.name).flatMap { value -> value.mailSemanticWords() }.toSet() + } + return words.hasCompleteMailWorkspaceSemantics() +} + +private fun List>.hasCompleteMailWorkspaceSemantics(): Boolean { + val hasAccounts = any { resourceWords -> + resourceWords.any { word -> word in setOf("account", "accounts", "mailaccount", "mailaccounts") } + } + val hasFolders = any { resourceWords -> + resourceWords.any { word -> + word in setOf("mailbox", "mailboxes", "folder", "folders", "mailfolder", "mailfolders") + } + } + val hasMessages = any { resourceWords -> + resourceWords.any { word -> + word in setOf("message", "messages", "email", "emails", "thread", "threads") + } + } + return hasAccounts && hasFolders && hasMessages +} + +internal fun nativeMailWorkspaceSection( + schema: NativeAppSchema, + resource: ResourceSpec, + context: NativeDatasetContext, +): NativeMailWorkspaceSection { + val parentIsMessage = context.parentRecord?.let { parentRecord -> + context.parentResourceId + ?.let(schema::resource) + ?.let { parentResource -> + nativeMailboxPresentation(parentResource, parentRecord).kind == NativeMailboxItemKind.Message + } + } == true + if (parentIsMessage) return NativeMailWorkspaceSection.MessageDetail + val words = listOf(resource.id, resource.name) + .flatMap { value -> value.mailSemanticWords() } + .toSet() + return when { + words.any { word -> word in setOf("account", "accounts", "mailaccount", "mailaccounts") } -> + NativeMailWorkspaceSection.Accounts + words.any { word -> + word in setOf("mailbox", "mailboxes", "folder", "folders", "mailfolder", "mailfolders") + } -> NativeMailWorkspaceSection.Mailboxes + words.any { word -> + word in setOf("message", "messages", "email", "emails", "thread", "threads") + } -> NativeMailWorkspaceSection.Messages + else -> NativeMailWorkspaceSection.Unknown + } +} + +/** + * Finds a parameter-free compose form using only contract semantics. + * + * The result remains null when the contract exposes several equally plausible routes. This keeps + * the workspace app-neutral and prevents a guessed write from becoming a prominent action. + */ +internal fun DynamicAppDescriptor.preferredNativeMailComposeAction( + schema: NativeAppSchema, +): DynamicNavigationFormAction? { + val actionsById = actions.associateBy { action -> action.id } + val candidates = forms.mapNotNull { form -> + val action = actionsById[form.actionId] ?: return@mapNotNull null + val schemaAction = schema.action(action.id) ?: return@mapNotNull null + if ( + action.binding.method == HttpMethod.GET || + action.binding.pathParameters.isNotEmpty() || + schemaAction.intent != ActionIntent.create + ) { + return@mapNotNull null + } + val resource = schema.resource(form.resourceId) + val resourceWords = listOf(form.resourceId, resource?.name.orEmpty()) + .flatMap { value -> value.mailSemanticWords() } + val actionWords = listOf(form.title, action.label, action.id) + .flatMap { value -> value.mailSemanticWords() } + val mailResource = resourceWords.any { word -> + word in setOf("mail", "message", "messages", "email", "emails", "draft", "drafts", "outbox") + } + val composeIntent = actionWords.any { word -> + word in setOf("compose", "send", "write", "newmessage", "createmessage", "sendmessage") + } + if (!mailResource || !composeIntent) return@mapNotNull null + val score = (if ("compose" in actionWords) 40 else 0) + + (if ("send" in actionWords || "sendmessage" in actionWords) 30 else 0) + + (if (resourceWords.any { it in setOf("message", "messages") }) 20 else 0) + score to DynamicNavigationFormAction( + formId = form.id, + label = form.title, + resourceId = form.resourceId, + actionId = action.id, + ) + } + val highest = candidates.maxOfOrNull { (score, _) -> score } ?: return null + return candidates + .filter { (score, _) -> score == highest } + .map { (_, action) -> action } + .singleOrNull() +} + +@Composable +internal fun NativeMailWorkspace( + plan: NativeMailWorkspacePlan, + onSelectRecord: ((NativeRecord) -> Unit)?, + modifier: Modifier = Modifier, + detailContent: (@Composable () -> Unit)? = null, + contentState: NativeMailWorkspaceContentState = NativeMailWorkspaceContentState.Ready, +) { + BoxWithConstraints(modifier = modifier.fillMaxSize()) { + when { + maxWidth >= 980.dp -> Row(modifier = Modifier.fillMaxSize()) { + NativeMailRail( + plan = plan, + onSelectRecord = onSelectRecord, + modifier = Modifier.width(252.dp).fillMaxHeight(), + ) + MailPaneDivider() + NativeMailMessageList( + items = plan.visibleMessages, + selectedMessage = plan.selectedMessage, + onSelectRecord = onSelectRecord, + contentState = contentState, + emptyContent = { + NativeMailSelectionPlaceholder(plan) + }, + modifier = Modifier.weight(0.44f).fillMaxHeight(), + ) + MailPaneDivider() + Box(modifier = Modifier.weight(0.56f).fillMaxHeight()) { + if (detailContent != null) { + detailContent() + } else if ( + plan.selectedMessage != null && + contentState != NativeMailWorkspaceContentState.Ready + ) { + NativeMailWorkspaceStatus(contentState) + } else { + NativeMailDetailPlaceholder() + } + } + } + + maxWidth >= 680.dp -> Row(modifier = Modifier.fillMaxSize()) { + NativeMailRail( + plan = plan, + onSelectRecord = onSelectRecord, + modifier = Modifier.width(232.dp).fillMaxHeight(), + ) + MailPaneDivider() + Box(modifier = Modifier.weight(1f).fillMaxHeight()) { + if (detailContent != null) { + detailContent() + } else if ( + plan.selectedMessage != null && + contentState != NativeMailWorkspaceContentState.Ready + ) { + NativeMailWorkspaceStatus(contentState) + } else { + NativeMailMessageList( + items = plan.visibleMessages, + selectedMessage = plan.selectedMessage, + onSelectRecord = onSelectRecord, + contentState = contentState, + emptyContent = { + NativeMailSelectionPlaceholder(plan) + }, + ) + } + } + } + + detailContent != null -> detailContent() + + contentState != NativeMailWorkspaceContentState.Ready -> + NativeMailWorkspaceStatus(contentState) + + else -> { + val compactItems = when { + plan.currentItems.isNotEmpty() -> plan.currentItems + plan.visibleMessages.isNotEmpty() -> plan.visibleMessages + plan.folders.isNotEmpty() -> plan.folders + else -> plan.accounts + } + NativeMailMessageList( + items = compactItems, + selectedMessage = plan.selectedMessage, + onSelectRecord = onSelectRecord, + contentState = contentState, + ) + } + } + } +} + +@Composable +private fun NativeMailRail( + plan: NativeMailWorkspacePlan, + onSelectRecord: ((NativeRecord) -> Unit)?, + modifier: Modifier = Modifier, +) { + val selectedKey = plan.selectedContainer?.nativeMailWorkspaceRecordKey() + LazyColumn( + modifier = modifier, + contentPadding = PaddingValues(NextcloudSpacing.Medium), + verticalArrangement = Arrangement.spacedBy(NextcloudSpacing.XSmall), + ) { + if (plan.accounts.isNotEmpty()) { + item { + Text( + "Accounts", + modifier = Modifier.padding( + start = NextcloudSpacing.Small, + top = NextcloudSpacing.Small, + bottom = NextcloudSpacing.XSmall, + ), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + items(plan.accounts, key = { item -> "account:${item.nativeMailWorkspaceRecordKey()}" }) { item -> + NativeMailRailRow( + item = item, + selected = selectedKey == item.nativeMailWorkspaceRecordKey(), + onSelectRecord = onSelectRecord, + ) + } + } + if (plan.folders.isNotEmpty()) { + item { + Text( + "Mailboxes", + modifier = Modifier.padding( + start = NextcloudSpacing.Small, + top = NextcloudSpacing.Large, + bottom = NextcloudSpacing.XSmall, + ), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + items(plan.folders, key = { item -> "folder:${item.nativeMailWorkspaceRecordKey()}" }) { item -> + NativeMailRailRow( + item = item, + selected = selectedKey == item.nativeMailWorkspaceRecordKey(), + onSelectRecord = onSelectRecord, + ) + } + } + } +} + +@Composable +private fun NativeMailRailRow( + item: NativeMailWorkspaceItem, + selected: Boolean, + onSelectRecord: ((NativeRecord) -> Unit)?, +) { + val interaction = onSelectRecord + ?.let { callback -> Modifier.clickable { callback(item.record) } } + ?: Modifier + Surface( + modifier = interaction + .fillMaxWidth() + .semantics(mergeDescendants = true) { + this.selected = selected + val unreadCount = item.presentation.unreadCount?.takeIf { count -> count > 0 } + if (unreadCount != null) { + stateDescription = "$unreadCount unread" + } else if (selected) { + stateDescription = "Selected" + } + }, + color = if (selected) { + MaterialTheme.colorScheme.secondaryContainer + } else { + MaterialTheme.colorScheme.surface + }, + shape = MaterialTheme.shapes.medium, + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding( + start = (item.hierarchyDepth * 12).dp + NextcloudSpacing.Small, + top = NextcloudSpacing.Small, + end = NextcloudSpacing.Small, + bottom = NextcloudSpacing.Small, + ), + horizontalArrangement = Arrangement.spacedBy(NextcloudSpacing.Small), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + imageVector = if (item.presentation.kind == NativeMailboxItemKind.Account) { + NextcloudIcons.app("mail") + } else { + NextcloudIcons.Folder + }, + contentDescription = null, + modifier = Modifier.size(20.dp), + tint = NextcloudTheme.colors.appIcon, + ) + Column(modifier = Modifier.weight(1f)) { + Text( + item.presentation.title, + style = MaterialTheme.typography.bodyMedium, + fontWeight = if (item.presentation.unread) FontWeight.SemiBold else FontWeight.Normal, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + item.presentation.sender?.let { subtitle -> + Text( + subtitle, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } + item.presentation.unreadCount?.takeIf { count -> count > 0 }?.let { count -> + Text( + count.toString(), + style = MaterialTheme.typography.labelSmall, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.primary, + ) + } + } + } +} + +@Composable +private fun NativeMailMessageList( + items: List, + selectedMessage: NativeMailWorkspaceItem?, + onSelectRecord: ((NativeRecord) -> Unit)?, + modifier: Modifier = Modifier, + contentState: NativeMailWorkspaceContentState = NativeMailWorkspaceContentState.Ready, + emptyContent: (@Composable () -> Unit)? = null, +) { + if (items.isEmpty()) { + if (contentState == NativeMailWorkspaceContentState.Ready && emptyContent != null) { + Box(modifier = modifier.fillMaxSize()) { + emptyContent() + } + } else { + NativeMailWorkspaceStatus( + state = contentState.takeUnless { state -> state == NativeMailWorkspaceContentState.Ready } + ?: NativeMailWorkspaceContentState.Empty(NativeMailWorkspaceSection.Messages), + modifier = modifier, + ) + } + return + } + LazyColumn( + modifier = modifier.fillMaxSize(), + contentPadding = PaddingValues( + start = NextcloudSpacing.Medium, + top = NextcloudSpacing.Small, + end = NextcloudSpacing.Medium, + bottom = NextcloudSpacing.XXLarge, + ), + ) { + items(items, key = { item -> item.nativeMailWorkspaceRecordKey() }) { item -> + val selected = item.presentation.kind == NativeMailboxItemKind.Message && + item.nativeMailWorkspaceRecordKey() == selectedMessage?.nativeMailWorkspaceRecordKey() + val senderLabel = nativeMailSenderLabel(item.presentation.sender) + val timestampLabel = nativeMailTimestampLabel(item.presentation.timestamp) + val interaction = onSelectRecord + ?.let { callback -> Modifier.clickable { callback(item.record) } } + ?: Modifier + Surface( + modifier = interaction + .fillMaxWidth() + .semantics(mergeDescendants = true) { + this.selected = selected + stateDescription = if (item.presentation.unread) "Unread" else "Read" + }, + color = if (selected) { + MaterialTheme.colorScheme.secondaryContainer + } else { + MaterialTheme.colorScheme.surface + }, + shape = MaterialTheme.shapes.medium, + ) { + Row( + modifier = Modifier.fillMaxWidth().padding(NextcloudSpacing.Medium), + horizontalArrangement = Arrangement.spacedBy(NextcloudSpacing.Medium), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + imageVector = when (item.presentation.kind) { + NativeMailboxItemKind.Folder -> NextcloudIcons.Folder + else -> NextcloudIcons.app("mail") + }, + contentDescription = null, + modifier = Modifier.size(22.dp), + tint = NextcloudTheme.colors.appIcon, + ) + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(2.dp), + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(NextcloudSpacing.Small), + ) { + Text( + senderLabel ?: item.presentation.title, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.bodyLarge, + fontWeight = if (item.presentation.unread) FontWeight.Bold else FontWeight.Medium, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + timestampLabel?.let { timestamp -> + Text( + timestamp, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 1, + ) + } + } + if (senderLabel != null) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(NextcloudSpacing.Small), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + item.presentation.title, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.bodyMedium, + fontWeight = if (item.presentation.unread) { + FontWeight.SemiBold + } else { + FontWeight.Normal + }, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + item.presentation.threadSize?.let { count -> + Text( + "$count messages", + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 1, + ) + } + } + } + item.presentation.preview?.let { preview -> + Text( + preview, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + ) + } + } + if (item.presentation.flagged) { + Icon( + NextcloudIcons.Favorite, + contentDescription = "Flagged", + modifier = Modifier.size(18.dp), + tint = MaterialTheme.colorScheme.primary, + ) + } + } + } + HorizontalDivider(color = MaterialTheme.colorScheme.outlineVariant) + } + } +} + +@Composable +private fun NativeMailSelectionPlaceholder(plan: NativeMailWorkspacePlan) { + val title: String + val message: String + when { + plan.accounts.isNotEmpty() && plan.selectedContainer == null -> { + title = "Choose a mail account" + message = "Select an account to view its mailboxes." + } + + plan.selectedContainer?.presentation?.kind == NativeMailboxItemKind.Account -> { + title = "Choose a mailbox" + message = "Select a mailbox to view its messages." + } + + else -> { + title = "No messages in this mailbox" + message = "New messages delivered here will appear in this list." + } + } + Box( + modifier = Modifier.fillMaxSize().padding(NextcloudSpacing.XLarge), + contentAlignment = Alignment.Center, + ) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(NextcloudSpacing.Medium), + ) { + Icon( + NextcloudIcons.app("mail"), + contentDescription = null, + modifier = Modifier.size(36.dp), + tint = NextcloudTheme.colors.appIcon, + ) + Text(title, style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.SemiBold) + Text( + message, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } +} + +@Composable +private fun NativeMailWorkspaceStatus( + state: NativeMailWorkspaceContentState, + modifier: Modifier = Modifier, +) { + val title: String + val message: String + val loading: Boolean + val retry: (() -> Unit)? + val retryLabel: String + when (state) { + NativeMailWorkspaceContentState.Ready -> return + is NativeMailWorkspaceContentState.Loading -> { + loading = true + retry = null + retryLabel = "Try again" + title = when (state.section) { + NativeMailWorkspaceSection.Accounts -> "Loading mail accounts" + NativeMailWorkspaceSection.Mailboxes -> "Loading mailboxes" + NativeMailWorkspaceSection.Messages -> "Loading messages" + NativeMailWorkspaceSection.MessageDetail -> "Opening message" + NativeMailWorkspaceSection.Unknown -> "Loading mail" + } + message = when (state.section) { + NativeMailWorkspaceSection.MessageDetail -> "Fetching the message body and attachments..." + else -> "Fetching the latest mail from your server..." + } + } + is NativeMailWorkspaceContentState.Empty -> { + loading = false + retry = null + retryLabel = "Try again" + title = when (state.section) { + NativeMailWorkspaceSection.Accounts -> "No mail accounts found" + NativeMailWorkspaceSection.Mailboxes -> "No mailboxes found" + NativeMailWorkspaceSection.Messages -> "No messages in this mailbox" + NativeMailWorkspaceSection.MessageDetail -> "No readable message body" + NativeMailWorkspaceSection.Unknown -> "Nothing to show yet" + } + message = when (state.section) { + NativeMailWorkspaceSection.Accounts -> + "Connect a mail account on the server, then refresh this view." + NativeMailWorkspaceSection.Mailboxes -> + "This account did not return any mailboxes." + NativeMailWorkspaceSection.Messages -> + "New messages delivered here will appear in this list." + NativeMailWorkspaceSection.MessageDetail -> + "The envelope is available, but the server returned no readable content." + NativeMailWorkspaceSection.Unknown -> + "Mail content will appear here when the server returns it." + } + } + is NativeMailWorkspaceContentState.Error -> { + loading = false + retry = state.retry + retryLabel = state.retryLabel + title = when (state.section) { + NativeMailWorkspaceSection.Accounts -> "Could not load mail accounts" + NativeMailWorkspaceSection.Mailboxes -> "Could not load mailboxes" + NativeMailWorkspaceSection.Messages -> "Could not refresh this mailbox" + NativeMailWorkspaceSection.MessageDetail -> "Could not open this message" + NativeMailWorkspaceSection.Unknown -> "Could not load mail" + } + message = state.message + } + } + Box(modifier = modifier.fillMaxSize().padding(NextcloudSpacing.XLarge), contentAlignment = Alignment.Center) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(NextcloudSpacing.Medium), + ) { + if (loading) { + CircularProgressIndicator(modifier = Modifier.size(32.dp), strokeWidth = 3.dp) + } else { + Icon( + imageVector = if (state is NativeMailWorkspaceContentState.Error) { + NextcloudIcons.Error + } else { + NextcloudIcons.app("mail") + }, + contentDescription = null, + modifier = Modifier.size(36.dp), + tint = if (state is NativeMailWorkspaceContentState.Error) { + MaterialTheme.colorScheme.error + } else { + NextcloudTheme.colors.appIcon + }, + ) + } + Text(title, style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.SemiBold) + Text( + message, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + retry?.let { action -> + Button(onClick = action) { + Text(retryLabel) + } + } + } + } +} + +@Composable +private fun NativeMailDetailPlaceholder() { + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(NextcloudSpacing.Medium), + ) { + Icon( + NextcloudIcons.app("mail"), + contentDescription = null, + modifier = Modifier.size(42.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Text( + "Select a message to read it", + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } +} + +@Composable +private fun MailPaneDivider() { + VerticalDivider(color = MaterialTheme.colorScheme.outlineVariant) +} + +private fun NativeRecord.withNativeResource( + resourceId: String, + currentResourceId: String, +): NativeRecord = if (resourceId == currentResourceId) { + this +} else { + copy(values = values + (NATIVE_SYNTHETIC_RESOURCE_FIELD to resourceId)) +} + +/** + * Cached mail rows may share a server ID across accounts or collection resources. Keep their + * renderer-local identity composite so an unrelated cache row cannot replace, select, or render + * beside the active mailbox response. + */ +internal fun nativeMailWorkspaceRecordKey( + resource: ResourceSpec, + record: NativeRecord, + presentation: NativeMailboxPresentation, +): String = listOf( + resource.id, + record.id, + presentation.kind.name, + record.mailWorkspaceAccountIds(presentation.kind).sorted().joinToString(","), + record.mailWorkspaceMailboxIds(presentation.kind).sorted().joinToString(","), +).joinToString("\u0000") + +internal fun NativeMailWorkspaceItem.nativeMailWorkspaceRecordKey(): String = + nativeMailWorkspaceRecordKey(resource, record, presentation) + +private fun List.singleMailWorkspaceSelection( + resourceId: String?, + record: NativeRecord, + kind: NativeMailboxItemKind, +): NativeMailWorkspaceItem? = singleMailWorkspaceSelection( + resourceId = resourceId, + recordId = record.id, + recordAccountIds = record.mailWorkspaceAccountIds(kind), + kind = kind, +) + +private fun List.singleMailWorkspaceSelection( + resourceId: String?, + record: NativeRecord, + kinds: Set, +): NativeMailWorkspaceItem? { + val candidates = filter { item -> + item.resource.id == resourceId && + item.record.id == record.id && + item.presentation.kind in kinds + } + val matchingKinds = candidates.map { item -> item.presentation.kind }.toSet() + if (matchingKinds.size != 1) return null + val kind = matchingKinds.single() + return candidates.singleMailWorkspaceSelection( + resourceId = resourceId, + recordId = record.id, + recordAccountIds = record.mailWorkspaceAccountIds(kind), + kind = kind, + ) +} + +private fun List.singleMailWorkspaceSelection( + resourceId: String?, + recordId: String?, + kind: NativeMailboxItemKind, +): NativeMailWorkspaceItem? = singleMailWorkspaceSelection( + resourceId = resourceId, + recordId = recordId, + recordAccountIds = emptySet(), + kind = kind, +) + +private fun List.singleMailWorkspaceSelection( + resourceId: String?, + recordId: String?, + kinds: Set, +): NativeMailWorkspaceItem? { + if (resourceId == null || recordId == null) return null + val candidates = filter { item -> + item.resource.id == resourceId && + item.record.id == recordId && + item.presentation.kind in kinds + } + return candidates.singleOrNull() +} + +private fun List.singleMailWorkspaceSelection( + resourceId: String?, + recordId: String?, + recordAccountIds: Set, + kind: NativeMailboxItemKind, +): NativeMailWorkspaceItem? { + if (resourceId == null || recordId == null) return null + val candidates = filter { item -> + item.resource.id == resourceId && + item.record.id == recordId && + item.presentation.kind == kind + } + if (candidates.size <= 1) return candidates.singleOrNull() + if (recordAccountIds.isEmpty()) return null + return candidates.filter { item -> + item.record.mailWorkspaceAccountIds(item.presentation.kind).intersect(recordAccountIds).isNotEmpty() + }.singleOrNull() +} + +/** + * A cached message is eligible only when it names the active mailbox and, whenever that mailbox + * belongs to an account, also names the same account. Missing relationship values stay hidden: + * guessing would leak an orphaned row into the wrong mailbox when IDs overlap. + */ +private fun NativeMailWorkspaceItem.belongsToMailbox(mailbox: NativeMailWorkspaceItem): Boolean { + val mailboxIds = mailbox.record.mailWorkspaceMailboxIds(mailbox.presentation.kind) + if (mailboxIds.isEmpty()) return false + val messageMailboxIds = record.mailWorkspaceMailboxIds(presentation.kind) + if (messageMailboxIds.intersect(mailboxIds).isEmpty()) return false + val mailboxAccountIds = mailbox.record.mailWorkspaceAccountIds(mailbox.presentation.kind) + if (mailboxAccountIds.isEmpty()) return true + val messageAccountIds = record.mailWorkspaceAccountIds(presentation.kind) + return messageAccountIds.isNotEmpty() && messageAccountIds.intersect(mailboxAccountIds).isNotEmpty() +} + +/** + * A message body response normally has no rows of its own. Keep the selected message in its + * desktop list alongside only cached siblings that prove the same account and mailbox identity. + * Without both relation IDs, do not guess a mailbox and retain just the selected message. + */ +private fun List.visibleMailSiblings( + selected: NativeMailWorkspaceItem, +): List { + val selectedAccountIds = selected.record.mailWorkspaceAccountIds(selected.presentation.kind) + val selectedMailboxIds = selected.record.mailWorkspaceMailboxIds(selected.presentation.kind) + if (selectedAccountIds.isEmpty() || selectedMailboxIds.isEmpty()) return listOf(selected) + val siblings = filter { candidate -> + candidate.presentation.kind == NativeMailboxItemKind.Message && + candidate.record.mailWorkspaceAccountIds(candidate.presentation.kind) + .intersect(selectedAccountIds) + .isNotEmpty() && + candidate.record.mailWorkspaceMailboxIds(candidate.presentation.kind) + .intersect(selectedMailboxIds) + .isNotEmpty() + } + return siblings +} + +private fun NativeRecord.mailWorkspaceAccountIds(kind: NativeMailboxItemKind): Set = buildSet { + mailWorkspaceRelationValue("accountid", "mailaccountid")?.let(::add) + if (kind == NativeMailboxItemKind.Account) { + add(id) + mailWorkspaceRelationValue("databaseid", "id")?.let(::add) + } +} + +private fun NativeRecord.mailWorkspaceMailboxIds(kind: NativeMailboxItemKind): Set = buildSet { + mailWorkspaceRelationValue("mailboxid", "folderid", "mailfolderid")?.let(::add) + if (kind == NativeMailboxItemKind.Folder) { + add(id) + mailWorkspaceRelationValue("databaseid", "id")?.let(::add) + } +} + +private fun NativeRecord.mailWorkspaceRelationValue(vararg names: String): String? { + val normalizedNames = names.mapTo(hashSetOf()) { name -> name.mailSemanticKey() } + return sequenceOf(values, displayValues, bindingContext) + .flatMap { fields -> fields.entries.asSequence() } + .firstOrNull { (key, value) -> + key.mailSemanticKey() in normalizedNames && !value.isNullOrBlank() + } + ?.value +} + +private fun NativeRecord.mailboxHierarchyDepth(): Int { + val semanticValues = values.entries.associate { (key, value) -> key.mailSemanticKey() to value } + val path = listOf("path", "mailboxpath", "fullpath", "displaypath") + .firstNotNullOfOrNull { key -> semanticValues[key]?.takeIf { value -> !value.isNullOrBlank() } } + ?: return if ( + listOf("parentid", "parentmailboxid", "parentfolderid") + .any { key -> !semanticValues[key].isNullOrBlank() } + ) { + 1 + } else { + 0 + } + return path.split('/', '\\').count(String::isNotBlank).minus(1).coerceIn(0, 4) +} + +private fun NativeMailWorkspaceItem.mailboxHierarchySortKey(): String { + val semanticValues = record.values.entries.associate { (key, value) -> key.mailSemanticKey() to value } + return listOf("path", "mailboxpath", "fullpath", "displaypath") + .firstNotNullOfOrNull { key -> semanticValues[key]?.takeIf { value -> !value.isNullOrBlank() } } + ?.lowercase() + ?: presentation.title.lowercase() +} + +private fun NativeMailWorkspaceItem.inboxScore(): Int { + val semanticValues = record.values.entries.associate { (key, value) -> key.mailSemanticKey() to value } + val role = listOf("specialuse", "specialrole", "role", "type") + .firstNotNullOfOrNull { key -> semanticValues[key] } + ?.mailSemanticKey() + val title = presentation.title.mailSemanticKey() + return when { + role == "inbox" -> 100 + title == "inbox" -> 80 + title.endsWith("inbox") -> 60 + else -> 0 + } +} + +private fun String.mailSemanticKey(): String = lowercase().filter(Char::isLetterOrDigit) + +private fun String.mailSemanticWords(): List { + val separated = replace(Regex("([a-z0-9])([A-Z])"), "$1 $2") + .lowercase() + .split(Regex("[^a-z0-9]+")) + .filter(String::isNotBlank) + return separated + separated.joinToString("") +} diff --git a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentations.kt b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentations.kt index 81cb8bc4..a5787b65 100644 --- a/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentations.kt +++ b/ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentations.kt @@ -27,6 +27,7 @@ internal data class NativeMailboxPresentation( val timestamp: String?, val unread: Boolean, val unreadCount: Int?, + val threadSize: Int?, val flagged: Boolean, val attachmentCount: Int, ) @@ -47,6 +48,42 @@ internal data class NativeMailMessageRenderTarget( val presentation: NativeMailMessageDetailPresentation, ) +/** + * Keeps Mail sender labels focused on the person instead of repeating an address that is already + * available in message details. Unknown envelope formats remain unchanged rather than guessed. + */ +internal fun nativeMailSenderLabel(sender: String?): String? { + val trimmed = sender?.trim()?.takeIf(String::isNotBlank) ?: return null + val displayName = MAIL_SENDER_WITH_ADDRESS.matchEntire(trimmed) + ?.groupValues + ?.getOrNull(1) + ?.trim() + ?.trim('"') + ?.takeIf(String::isNotBlank) + return displayName ?: trimmed +} + +/** + * Formats the common ISO envelope timestamp compactly for message rows without depending on the + * device locale. Other server-provided formats are preserved verbatim. + */ +internal fun nativeMailTimestampLabel(timestamp: String?): String? { + val trimmed = timestamp?.trim()?.takeIf(String::isNotBlank) ?: return null + val match = MAIL_ISO_TIMESTAMP.matchEntire(trimmed) ?: return trimmed + val monthIndex = match.groupValues[2].toIntOrNull() ?: return trimmed + val month = MAIL_MONTH_NAMES.getOrNull(monthIndex - 1) ?: return trimmed + val day = match.groupValues[3].toIntOrNull() ?: return trimmed + return "$month $day, ${match.groupValues[4]}:${match.groupValues[5]}" +} + +private val MAIL_SENDER_WITH_ADDRESS = Regex("^\\s*(.*?)\\s*<[^<>]+>\\s*$") +private val MAIL_ISO_TIMESTAMP = Regex( + "^(\\d{4})-(\\d{2})-(\\d{2})[Tt ](\\d{2}):(\\d{2})(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})?$", +) +private val MAIL_MONTH_NAMES = listOf( + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", +) + internal enum class NativeMediaItemKind { Artist, Album, @@ -201,6 +238,8 @@ internal fun nativeMailboxPresentation( ?.takeIf(String::isNotBlank) val timestamp = values.formattedTimestamp() val flagged = values.boolean("flagged", "starred", "favorite", "favourite") == true || "flagged" in flags + val threadSize = values.int("messagecount", "messagescount", "threadsize", "threadcount") + ?: values.arraySize("messages") val attachmentCount = values.int("attachmentcount", "attachmentscount") ?: values.arraySize("attachments") ?: if (values.boolean("hasattachments", "hasattachment") == true) 1 else 0 @@ -212,6 +251,7 @@ internal fun nativeMailboxPresentation( timestamp = timestamp, unread = unread, unreadCount = unreadCount, + threadSize = threadSize?.takeIf { count -> kind == NativeMailboxItemKind.Message && count > 1 }, flagged = flagged, attachmentCount = attachmentCount, ) @@ -226,9 +266,9 @@ internal fun nativeMailMessageDetailPresentation( val words = semanticTokens(resource.id, resource.name) val messageShape = values.hasAny("subject") && values.hasAny("from", "sender", "author", "fromemail") && - values.hasAny("body", "content", "text", "htmlbody") + values.hasAny("body", "bodyhtml", "bodyplain", "content", "htmlbody", "messagebody", "text") if (!messageShape && words.none { it in MESSAGE_WORDS }) return null - val body = values.string("body", "content", "text", "htmlbody") + val body = values.string("body", "bodyhtml", "bodyplain", "content", "htmlbody", "messagebody", "text") if (body.isNullOrBlank() && !messageShape) return null return NativeMailMessageDetailPresentation( subject = values.string("subject", "title") ?: "(No subject)", @@ -236,13 +276,55 @@ internal fun nativeMailMessageDetailPresentation( recipients = values.string("to", "recipients", "recipient"), timestamp = values.formattedTimestamp(), body = body, - htmlBody = values.boolean("hashtmlbody", "html", "ishtml") == true, + htmlBody = values.boolean("hashtmlbody", "html", "ishtml") == true || + values.hasAny("bodyhtml", "htmlbody"), attachmentCount = values.arraySize("attachments") ?: values.int("attachmentcount", "attachmentscount") ?: 0, ) } +/** Converts a bounded nested thread response into independently renderable message bodies. */ +internal fun nativeMailThreadPresentations( + resource: ResourceSpec, + record: NativeRecord, +): List { + val threadItems = record.structuredValues.entries.firstNotNullOfOrNull { (key, value) -> + if (key.semanticKey() !in setOf("messages", "threadmessages", "conversationmessages")) { + return@firstNotNullOfOrNull null + } + value as? NativeStructuredValue.ListValue + } ?: return emptyList() + return threadItems.items.mapIndexedNotNull { index, item -> + val message = item as? NativeStructuredValue.ObjectValue ?: return@mapIndexedNotNull null + val values = mutableMapOf() + val structuredValues = mutableMapOf() + message.entries.forEach { entry -> + when (val value = entry.value) { + is NativeStructuredValue.Scalar -> values[entry.key] = value.value + is NativeStructuredValue.ListValue, + is NativeStructuredValue.ObjectValue, + -> structuredValues[entry.key] = value + } + } + val id = listOf("id", "messageid", "uid") + .firstNotNullOfOrNull { alias -> + values.entries.firstOrNull { (key, _) -> key.semanticKey() == alias }?.value + } + ?.takeIf(String::isNotBlank) + ?: "thread-message-$index" + nativeMailMessageDetailPresentation( + resource = resource, + record = NativeRecord( + id = id, + values = values, + structuredValues = structuredValues, + actionSafeIdentity = false, + ), + ) + } +} + /** * Rejoins a message envelope with a separately fetched body/detail facet. * diff --git a/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/app/DynamicNativeMemoryCacheTest.kt b/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/app/DynamicNativeMemoryCacheTest.kt index 39e0b615..18cdca37 100644 --- a/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/app/DynamicNativeMemoryCacheTest.kt +++ b/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/app/DynamicNativeMemoryCacheTest.kt @@ -3,6 +3,7 @@ package dev.obiente.nextcloudnative.app import dev.obiente.nextcloudnative.nativeui.runtime.NativeRecord import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertFalse import kotlin.test.assertNotEquals import kotlin.test.assertNull import kotlin.time.Duration.Companion.minutes @@ -32,6 +33,100 @@ class DynamicNativeMemoryCacheTest { assertNull(first.account.takeIf { it.contains("never-cache-this") }) } + @Test + fun `screen cache distinguishes mailbox snapshots with overlapping mailbox ids`() { + val personal = NativeRecord( + id = "inbox", + values = mapOf("accountId" to "personal", "mailboxId" to "inbox"), + ) + val work = personal.copy(values = personal.values + ("accountId" to "work")) + + val personalKey = dynamicScreenCacheKey( + session = session, + appId = "mail", + viewId = "messages.list", + selectedRecordId = personal.id, + parameterValues = emptyMap(), + selectedRecordResourceId = "mailboxes", + selectedRecordScope = personal.dynamicScreenCacheScope(), + ) + val workKey = dynamicScreenCacheKey( + session = session, + appId = "mail", + viewId = "messages.list", + selectedRecordId = work.id, + parameterValues = emptyMap(), + selectedRecordResourceId = "mailboxes", + selectedRecordScope = work.dynamicScreenCacheScope(), + ) + + assertNotEquals(personalKey, workKey) + assertNotEquals( + dynamicScreenSelectionIdentity( + resourceId = "mailboxes", + recordId = personal.id, + recordScope = personal.dynamicScreenCacheScope(), + ), + dynamicScreenSelectionIdentity( + resourceId = "mailboxes", + recordId = work.id, + recordScope = work.dynamicScreenCacheScope(), + ), + ) + } + + @Test + fun `pagination completion is rejected after a Mail account selection changes`() { + val personal = NativeRecord( + id = "inbox", + values = mapOf("accountId" to "personal", "mailboxId" to "inbox"), + ) + val work = personal.copy(values = personal.values + ("accountId" to "work")) + fun identity(record: NativeRecord) = dynamicPaginationRequestIdentity( + session = session, + appId = "mail", + viewId = "messages.list", + resourceId = "messages", + selection = dynamicScreenSelectionIdentity( + resourceId = "mailboxes", + recordId = record.id, + recordScope = record.dynamicScreenCacheScope(), + ), + pathParameters = mapOf("mailboxId" to record.id), + cacheable = true, + ) + + val outstandingPersonalPage = identity(personal) + val activeWorkSelection = identity(work) + + assertFalse(outstandingPersonalPage.isCurrentDynamicPaginationRequest(activeWorkSelection)) + assertNotEquals( + personal.dynamicPaginationRecordIdentity("messages"), + work.dynamicPaginationRecordIdentity("messages"), + ) + } + + @Test + fun `uncacheable sparse selection never stores or returns a screen`() { + val cache = DynamicNativeMemoryCache() + val key = dynamicScreenCacheKey( + session = session, + appId = "mail", + viewId = "messages.list", + selectedRecordId = "inbox", + parameterValues = emptyMap(), + selectedRecordResourceId = "mailboxes", + cacheable = false, + ) + + cache.storeScreen( + key, + DynamicScreenSnapshot(listOf(NativeRecord("stale", emptyMap())), emptyMap()), + ) + + assertNull(cache.screen(key)) + } + @Test fun `screen cache is bounded and isolated by account`() { val cache = DynamicNativeMemoryCache(maximumScreens = 1) diff --git a/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspaceTest.kt b/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspaceTest.kt new file mode 100644 index 00000000..eb572690 --- /dev/null +++ b/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspaceTest.kt @@ -0,0 +1,771 @@ +package dev.obiente.nextcloudnative.nativeui.runtime + +import dev.obiente.nextcloudnative.nativeui.model.ActionIntent +import dev.obiente.nextcloudnative.nativeui.model.ActionRisk +import dev.obiente.nextcloudnative.nativeui.model.ActionSpec +import dev.obiente.nextcloudnative.nativeui.model.ApiBinding +import dev.obiente.nextcloudnative.nativeui.model.AppIdentity +import dev.obiente.nextcloudnative.nativeui.model.Confidence +import dev.obiente.nextcloudnative.nativeui.model.DynamicAction +import dev.obiente.nextcloudnative.nativeui.model.DynamicAppDescriptor +import dev.obiente.nextcloudnative.nativeui.model.DynamicForm +import dev.obiente.nextcloudnative.nativeui.model.DynamicHttpBinding +import dev.obiente.nextcloudnative.nativeui.model.DynamicResource +import dev.obiente.nextcloudnative.nativeui.model.EndpointPolicy +import dev.obiente.nextcloudnative.nativeui.model.HttpMethod +import dev.obiente.nextcloudnative.nativeui.model.HttpParameter +import dev.obiente.nextcloudnative.nativeui.model.NativeAppSchema +import dev.obiente.nextcloudnative.nativeui.model.ParameterSource +import dev.obiente.nextcloudnative.nativeui.model.ResourceSpec +import kotlinx.serialization.json.JsonPrimitive +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNotEquals +import kotlin.test.assertNull +import kotlin.test.assertTrue + +class NativeMailWorkspaceTest { + @Test + fun `semantic mail datasets become account mailbox and message panes`() { + val account = resource("accounts", "Accounts") + val mailboxes = resource("mailboxes", "Mailboxes") + val messages = resource("messages", "Messages") + val schema = schema(account, mailboxes, messages) + val accountRecord = NativeRecord( + id = "personal", + values = mapOf("accountName" to "Personal", "emailAddress" to "me@example.test"), + ) + val inboxRecord = NativeRecord( + id = "inbox", + values = mapOf( + "name" to "Inbox", + "specialUse" to "inbox", + "unreadCount" to "3", + "path" to "Personal/Inbox", + ), + ) + val messageRecord = NativeRecord( + id = "42", + values = mapOf( + "subject" to "Release checklist", + "from" to "Ada ", + "preview" to "The build is ready.", + "seen" to "false", + ), + ) + + val plan = nativeMailWorkspacePlan( + schema = schema, + currentResource = messages, + currentRecords = listOf(messageRecord), + context = NativeDatasetContext( + parentResourceId = "mailboxes", + parentRecord = inboxRecord, + relatedRecords = mapOf( + "accounts" to listOf(accountRecord), + "mailboxes" to listOf(inboxRecord), + ), + ), + selectedRecordId = "42", + // Dynamic navigation records the source resource with the selected record. Keeping + // that scope in this fixture avoids treating an ID-only restored selection as safe. + selectedRecordResourceId = messages.id, + ) + + assertTrue(plan.hasMailData) + assertEquals(listOf("Personal"), plan.accounts.map { it.presentation.title }) + assertEquals("Inbox", plan.preferredInbox?.presentation?.title) + assertEquals(0, plan.folders.single().hierarchyDepth) + assertEquals("Release checklist", plan.messages.single().presentation.title) + assertEquals("42", plan.selectedMessage?.record?.id) + assertEquals("inbox", plan.selectedContainer?.record?.id) + assertEquals(listOf("42"), plan.visibleMessages.map { item -> item.record.id }) + assertEquals("accounts", plan.accounts.single().record.effectiveNativeResourceId("messages")) + assertEquals("mailboxes", plan.folders.single().record.effectiveNativeResourceId("messages")) + assertEquals("messages", plan.messages.single().record.effectiveNativeResourceId("messages")) + } + + @Test + fun `multi account landing does not expose cached messages before an account is selected`() { + val accounts = resource("accounts", "Accounts") + val messages = resource("messages", "Messages") + val plan = nativeMailWorkspacePlan( + schema = schema(accounts, messages), + currentResource = accounts, + currentRecords = listOf( + NativeRecord("personal", mapOf("accountName" to "Personal")), + NativeRecord("work", mapOf("accountName" to "Work")), + ), + context = NativeDatasetContext( + relatedRecords = mapOf( + "messages" to listOf( + NativeRecord( + id = "42", + values = mapOf( + "subject" to "Cached subject", + "from" to "Ada ", + ), + ), + ), + ), + ), + selectedRecordId = null, + ) + + assertEquals(2, plan.accounts.size) + assertEquals(1, plan.messages.size) + assertTrue(plan.visibleMessages.isEmpty()) + } + + @Test + fun `selected mailbox filters cached rows by mailbox and account when mailbox ids overlap`() { + val mailboxes = resource("mailboxes", "Mailboxes") + val messages = resource("messages", "Messages") + val personalInbox = NativeRecord( + id = "inbox", + values = mapOf("name" to "Inbox", "accountId" to "personal"), + ) + val workInbox = personalInbox.copy(values = personalInbox.values + ("accountId" to "work")) + val plan = nativeMailWorkspacePlan( + schema = schema(mailboxes, messages), + currentResource = mailboxes, + currentRecords = listOf(personalInbox, workInbox), + context = NativeDatasetContext( + parentResourceId = "mailboxes", + parentRecord = personalInbox, + relatedRecords = mapOf( + "messages" to listOf( + message(id = "same-id", accountId = "personal", mailboxId = "inbox", subject = "Personal"), + message(id = "same-id", accountId = "work", mailboxId = "inbox", subject = "Work"), + message(id = "archive", accountId = "personal", mailboxId = "archive", subject = "Archive"), + ), + ), + ), + selectedRecordId = personalInbox.id, + selectedRecordResourceId = mailboxes.id, + ) + + assertEquals("personal", plan.selectedContainer?.record?.values?.get("accountId")) + assertEquals(listOf("Personal"), plan.visibleMessages.map { item -> item.presentation.title }) + } + + @Test + fun `overlapping mailbox ids have distinct rail identities and a single selected item`() { + val mailboxes = resource("mailboxes", "Mailboxes") + val messages = resource("messages", "Messages") + val personalInbox = NativeRecord( + id = "inbox", + values = mapOf("name" to "Inbox", "accountId" to "personal"), + ) + val workInbox = personalInbox.copy(values = personalInbox.values + ("accountId" to "work")) + val plan = nativeMailWorkspacePlan( + schema = schema(mailboxes, messages), + currentResource = mailboxes, + currentRecords = listOf(personalInbox, workInbox), + context = NativeDatasetContext( + parentResourceId = mailboxes.id, + parentRecord = personalInbox, + ), + selectedRecordId = personalInbox.id, + selectedRecordResourceId = mailboxes.id, + ) + + val selectedKey = plan.selectedContainer?.nativeMailWorkspaceRecordKey() + val railKeys = plan.folders.map { item -> item.nativeMailWorkspaceRecordKey() } + + assertEquals(2, railKeys.toSet().size) + assertEquals(1, railKeys.count { key -> key == selectedKey }) + assertNotEquals(railKeys[0], railKeys[1]) + } + + @Test + fun `sparse mail selections fail closed until an account scope is present`() { + val accounts = resource("accounts", "Accounts") + val mailboxes = resource("mailboxes", "Mailboxes") + val messages = resource("messages", "Messages") + val schema = schema(accounts, mailboxes, messages) + + assertFalse( + nativeMailScreenCacheScopeIsSafe( + schema, + mailboxes.id, + NativeRecord("inbox", mapOf("name" to "Inbox")), + ), + ) + assertTrue( + nativeMailScreenCacheScopeIsSafe( + schema, + mailboxes.id, + NativeRecord("inbox", mapOf("name" to "Inbox", "accountId" to "personal")), + ), + ) + assertTrue( + nativeMailScreenCacheScopeIsSafe( + schema, + accounts.id, + NativeRecord("personal", mapOf("accountName" to "Personal")), + ), + ) + assertFalse( + nativeMailScreenCacheScopeIsSafe( + schema, + messages.id, + NativeRecord("42", mapOf("subject" to "Missing relations", "from" to "Ada")), + ), + ) + } + + @Test + fun `inbox and archive cached messages remain isolated`() { + val mailboxes = resource("mailboxes", "Mailboxes") + val messages = resource("messages", "Messages") + val inbox = NativeRecord( + id = "inbox", + values = mapOf("name" to "Inbox", "accountId" to "personal"), + ) + val archive = NativeRecord( + id = "archive", + values = mapOf("name" to "Archive", "accountId" to "personal"), + ) + val plan = nativeMailWorkspacePlan( + schema = schema(mailboxes, messages), + currentResource = mailboxes, + currentRecords = listOf(inbox, archive), + context = NativeDatasetContext( + parentResourceId = "mailboxes", + parentRecord = archive, + relatedRecords = mapOf( + "messages" to listOf( + message(id = "inbox-message", accountId = "personal", mailboxId = "inbox", subject = "Inbox only"), + message(id = "archive-message", accountId = "personal", mailboxId = "archive", subject = "Archive only"), + ), + ), + ), + selectedRecordId = archive.id, + selectedRecordResourceId = mailboxes.id, + ) + + assertEquals(listOf("Archive only"), plan.visibleMessages.map { item -> item.presentation.title }) + } + + @Test + fun `orphaned and account-ambiguous cached rows stay hidden from a selected mailbox`() { + val mailboxes = resource("mailboxes", "Mailboxes") + val messages = resource("messages", "Messages") + val inbox = NativeRecord( + id = "inbox", + values = mapOf("name" to "Inbox", "accountId" to "personal"), + ) + val plan = nativeMailWorkspacePlan( + schema = schema(mailboxes, messages), + currentResource = mailboxes, + currentRecords = listOf(inbox), + context = NativeDatasetContext( + parentResourceId = "mailboxes", + parentRecord = inbox, + relatedRecords = mapOf( + "messages" to listOf( + NativeRecord( + id = "orphan", + values = mapOf("subject" to "No mailbox", "from" to "Ada "), + ), + message(id = "no-account", accountId = null, mailboxId = "inbox", subject = "Unknown account"), + message(id = "wrong-account", accountId = "work", mailboxId = "inbox", subject = "Wrong account"), + ), + ), + ), + selectedRecordId = inbox.id, + selectedRecordResourceId = mailboxes.id, + ) + + assertTrue(plan.visibleMessages.isEmpty()) + } + + @Test + fun `message selection uses resource and account instead of record id alone`() { + val mailboxes = resource("mailboxes", "Mailboxes") + val messages = resource("messages", "Messages") + val threads = resource("threads", "Threads") + val personalMessage = message( + id = "42", + accountId = "personal", + mailboxId = "inbox", + subject = "Personal resource message", + ) + val workMessage = message( + id = "42", + accountId = "work", + mailboxId = "inbox", + subject = "Work resource message", + ) + val threadWithSameId = message( + id = "42", + accountId = "personal", + mailboxId = "inbox", + subject = "Thread with same id", + ) + val plan = nativeMailWorkspacePlan( + schema = schema(mailboxes, messages, threads), + currentResource = mailboxes, + currentRecords = emptyList(), + context = NativeDatasetContext( + parentResourceId = "messages", + parentRecord = workMessage, + relatedRecords = mapOf( + "messages" to listOf(personalMessage, workMessage), + "threads" to listOf(threadWithSameId), + ), + ), + selectedRecordId = workMessage.id, + selectedRecordResourceId = "messages", + ) + + assertEquals("Work resource message", plan.selectedMessage?.presentation?.title) + assertEquals(listOf("Work resource message"), plan.visibleMessages.map { item -> item.presentation.title }) + } + + @Test + fun `record id only selection stays empty when cached mail identities are ambiguous`() { + val messages = resource("messages", "Messages") + val plan = nativeMailWorkspacePlan( + schema = schema(messages), + currentResource = messages, + currentRecords = emptyList(), + context = NativeDatasetContext( + relatedRecords = mapOf( + "messages" to listOf( + message(id = "42", accountId = "personal", mailboxId = "inbox", subject = "Personal"), + message(id = "42", accountId = "work", mailboxId = "inbox", subject = "Work"), + ), + ), + ), + selectedRecordId = "42", + ) + + assertNull(plan.selectedMessage) + assertTrue(plan.visibleMessages.isEmpty()) + } + + @Test + fun `message body facet keeps the parent message selected`() { + val messages = resource("messages", "Messages") + val body = resource("messageBody", "Message body") + val schema = schema(messages, body) + val parentMessage = NativeRecord( + id = "42", + values = mapOf( + "subject" to "Release checklist", + "from" to "Ada ", + ), + ) + + val bodyRecord = NativeRecord( + id = "body-42", + values = mapOf("body" to "

The build is ready.

", "hasHtmlBody" to "true"), + ) + val context = NativeDatasetContext( + parentResourceId = "messages", + parentRecord = parentMessage, + relatedRecords = mapOf("messages" to listOf(parentMessage)), + ) + val plan = nativeMailWorkspacePlan( + schema = schema, + currentResource = body, + currentRecords = listOf(bodyRecord), + context = context, + selectedRecordId = "body-42", + ) + + assertEquals("42", plan.selectedMessage?.record?.id) + assertEquals("Release checklist", plan.selectedMessage?.presentation?.title) + assertTrue(plan.currentItems.isEmpty()) + assertEquals(listOf("42"), plan.messages.map { item -> item.record.id }) + assertEquals(listOf("42"), plan.visibleMessages.map { item -> item.record.id }) + assertTrue(plan.hasMailData) + val detail = nativeMailWorkspaceDetailTarget( + schema = schema, + currentResource = body, + currentRecords = listOf(bodyRecord), + context = context, + selectedMessage = plan.selectedMessage, + ) + assertEquals("42", detail?.record?.id) + assertEquals("

The build is ready.

", detail?.presentation?.body) + } + + @Test + fun `message body facet keeps verified siblings from only the selected mailbox`() { + val messages = resource("messages", "Messages") + val body = resource("messageBody", "Message body") + val schema = schema(messages, body) + val selected = message("mail-1", "personal", "inbox", "Selected message") + val sameMailbox = message("mail-2", "personal", "inbox", "Inbox sibling") + val otherMailbox = message("mail-3", "personal", "archive", "Archive message") + val otherAccount = message("mail-4", "work", "inbox", "Work inbox message") + val context = NativeDatasetContext( + parentResourceId = messages.id, + parentRecord = selected, + relatedRecords = mapOf( + messages.id to listOf(selected, sameMailbox, otherMailbox, otherAccount), + ), + ) + + val plan = nativeMailWorkspacePlan( + schema = schema, + currentResource = body, + currentRecords = listOf( + NativeRecord("body-1", mapOf("body" to "Selected body", "hasHtmlBody" to "false")), + ), + context = context, + selectedRecordId = selected.id, + selectedRecordResourceId = messages.id, + ) + + assertEquals( + setOf(selected.id, sameMailbox.id), + plan.visibleMessages.map { item -> item.record.id }.toSet(), + ) + assertFalse(plan.visibleMessages.any { item -> item.record.id in setOf(otherMailbox.id, otherAccount.id) }) + } + + @Test + fun `current mailbox response replaces stale related rows for the same resource`() { + val messages = resource("messages", "Messages") + val current = NativeRecord( + id = "42", + values = mapOf("subject" to "Current subject", "from" to "Ada "), + ) + val stale = current.copy(values = current.values + ("subject" to "Stale subject")) + + val plan = nativeMailWorkspacePlan( + schema = schema(messages), + currentResource = messages, + currentRecords = listOf(current), + context = NativeDatasetContext(relatedRecords = mapOf("messages" to listOf(stale))), + selectedRecordId = null, + ) + + assertEquals(listOf("Current subject"), plan.messages.map { item -> item.presentation.title }) + } + + @Test + fun `sole account and unique inbox provide a useful automatic landing`() { + val accounts = resource("accounts", "Accounts") + val mailboxes = resource("mailboxes", "Mailboxes") + val account = NativeRecord( + id = "personal", + values = mapOf("accountName" to "Personal", "emailAddress" to "me@example.test"), + ) + val inbox = NativeRecord( + id = "inbox", + values = mapOf("name" to "Inbox", "specialUse" to "inbox"), + ) + val archive = NativeRecord( + id = "archive", + values = mapOf("name" to "Archive", "specialUse" to "archive"), + ) + + assertEquals(account, nativeMailSoleAccountLandingRecord(accounts, listOf(account))) + assertEquals(inbox, nativeMailInboxLandingRecord(mailboxes, listOf(archive, inbox))) + assertNull(nativeMailSoleAccountLandingRecord(accounts, listOf(account, account.copy(id = "work")))) + assertNull( + nativeMailInboxLandingRecord( + mailboxes, + listOf(inbox, inbox.copy(id = "second-inbox")), + ), + ) + val schema = schema(accounts, mailboxes) + assertTrue(isNativeMailContainerRecord(schema, "accounts", account)) + assertTrue(isNativeMailContainerRecord(schema, "mailboxes", inbox)) + } + + @Test + fun `mailbox hierarchy removes the account prefix and keeps children with their parent`() { + val mailboxes = resource("mailboxes", "Mailboxes") + val records = listOf( + NativeRecord("archive", mapOf("name" to "Archive", "path" to "Personal/Archive")), + NativeRecord("project-child", mapOf("name" to "Native", "path" to "Personal/Projects/Native")), + NativeRecord("projects", mapOf("name" to "Projects", "path" to "Personal/Projects")), + ) + + val plan = nativeMailWorkspacePlan( + schema = schema(mailboxes), + currentResource = mailboxes, + currentRecords = records, + context = NativeDatasetContext(), + selectedRecordId = null, + ) + + assertEquals(listOf("Archive", "Projects", "Native"), plan.folders.map { it.presentation.title }) + assertEquals(listOf(0, 0, 1), plan.folders.map { it.hierarchyDepth }) + } + + @Test + fun `ambiguous non mail datasets do not opt into mail workspace`() { + val inventory = resource("inventory", "Inventory") + val schema = schema(inventory) + val record = NativeRecord( + id = "tripod", + values = mapOf("name" to "Tripod", "category" to "Camera"), + ) + + val plan = nativeMailWorkspacePlan( + schema = schema, + currentResource = inventory, + currentRecords = listOf(record), + context = NativeDatasetContext(), + selectedRecordId = null, + ) + + assertFalse(plan.hasMailData) + assertTrue(plan.currentItems.isEmpty()) + assertNull(plan.preferredInbox) + } + + @Test + fun `parameter free semantic compose form becomes the workspace compose entry`() { + val messages = resource("messages", "Messages") + val action = nativeAction("send-message", "Send message", "messages") + val descriptor = descriptor( + actions = listOf(action), + forms = listOf( + DynamicForm( + id = "compose-message", + title = "Compose", + resourceId = "messages", + actionId = action.id, + confidence = Confidence.verified, + ), + ), + ) + val schema = schemaWithActions( + resources = listOf(messages), + actions = listOf(schemaAction(action)), + ) + + val compose = descriptor.preferredNativeMailComposeAction(schema) + + assertEquals("compose-message", compose?.formId) + assertEquals("send-message", compose?.actionId) + } + + @Test + fun `automatic landing requires the complete semantic mail hierarchy`() { + val mailDescriptor = descriptor( + resources = listOf( + dynamicResource("accounts", "Accounts"), + dynamicResource("mailboxes", "Mailboxes"), + dynamicResource("messages", "Messages"), + ), + actions = emptyList(), + forms = emptyList(), + ) + val financeDescriptor = descriptor( + resources = listOf(dynamicResource("accounts", "Expense accounts")), + actions = emptyList(), + forms = emptyList(), + ) + + assertTrue(mailDescriptor.hasNativeMailWorkspaceSemantics()) + assertTrue( + schema( + resource("accounts", "Accounts"), + resource("mailboxes", "Mailboxes"), + resource("messages", "Messages"), + ).hasNativeMailWorkspaceSemantics(), + ) + assertFalse(financeDescriptor.hasNativeMailWorkspaceSemantics()) + assertFalse(schema(resource("accounts", "Expense accounts")).hasNativeMailWorkspaceSemantics()) + } + + @Test + fun `workspace state follows account mailbox message and body context`() { + val accounts = resource("accounts", "Accounts") + val mailboxes = resource("mailboxes", "Mailboxes") + val messages = resource("threads", "Threads") + val body = resource("content", "Message body") + val schema = schema(accounts, mailboxes, messages, body) + val parentMessage = NativeRecord( + id = "thread-42", + values = mapOf("subject" to "Release checklist", "from" to "Ada "), + ) + + assertEquals( + NativeMailWorkspaceSection.Accounts, + nativeMailWorkspaceSection(schema, accounts, NativeDatasetContext()), + ) + assertEquals( + NativeMailWorkspaceSection.Mailboxes, + nativeMailWorkspaceSection(schema, mailboxes, NativeDatasetContext()), + ) + assertEquals( + NativeMailWorkspaceSection.Messages, + nativeMailWorkspaceSection(schema, messages, NativeDatasetContext()), + ) + assertEquals( + NativeMailWorkspaceSection.MessageDetail, + nativeMailWorkspaceSection( + schema, + body, + NativeDatasetContext(parentResourceId = "threads", parentRecord = parentMessage), + ), + ) + } + + @Test + fun `ambiguous compose routes are not guessed`() { + val messages = resource("messages", "Messages") + val actions = listOf( + nativeAction("compose-message", "Compose message", "messages"), + nativeAction("compose-email", "Compose email", "messages"), + ) + val descriptor = descriptor( + actions = actions, + forms = actions.map { action -> + DynamicForm( + id = "form-${action.id}", + title = action.label, + resourceId = action.resourceId, + actionId = action.id, + confidence = Confidence.verified, + ) + }, + ) + val schema = schemaWithActions( + resources = listOf(messages), + actions = actions.map(::schemaAction), + ) + + assertNull(descriptor.preferredNativeMailComposeAction(schema)) + } + + @Test + fun `compose entry does not guess a missing route parameter`() { + val messages = resource("messages", "Messages") + val action = nativeAction("compose-message", "Compose", "messages").copy( + binding = DynamicHttpBinding( + method = HttpMethod.POST, + path = "/semantic/accounts/{accountId}/messages", + pathParameters = listOf( + HttpParameter( + name = "accountId", + required = true, + schema = JsonPrimitive("string"), + source = ParameterSource.runtimeContext, + ), + ), + ), + ) + val descriptor = descriptor( + actions = listOf(action), + forms = listOf( + DynamicForm( + id = "compose-message", + title = "Compose", + resourceId = "messages", + actionId = action.id, + confidence = Confidence.verified, + ), + ), + ) + + assertNull( + descriptor.preferredNativeMailComposeAction( + schemaWithActions(listOf(messages), listOf(schemaAction(action))), + ), + ) + } + + private fun message( + id: String, + accountId: String?, + mailboxId: String, + subject: String, + ): NativeRecord = NativeRecord( + id = id, + values = buildMap { + put("subject", subject) + put("from", "Ada ") + put("mailboxId", mailboxId) + accountId?.let { value -> put("accountId", value) } + }, + ) + + private fun resource(id: String, name: String): ResourceSpec = ResourceSpec( + id = id, + name = name, + confidence = Confidence.verified, + ) + + private fun schema(vararg resources: ResourceSpec): NativeAppSchema = NativeAppSchema( + schemaVersion = "1", + app = AppIdentity(id = "semantic-mail-fixture", name = "Mail fixture", version = "1"), + confidence = Confidence.verified, + resources = resources.toList(), + ) + + private fun schemaWithActions( + resources: List, + actions: List, + ): NativeAppSchema = NativeAppSchema( + schemaVersion = "1", + app = AppIdentity(id = "semantic-mail-fixture", name = "Mail fixture", version = "1"), + confidence = Confidence.verified, + resources = resources, + actions = actions, + ) + + private fun descriptor( + resources: List = emptyList(), + actions: List, + forms: List, + ): DynamicAppDescriptor = DynamicAppDescriptor( + descriptorVersion = "1", + app = AppIdentity(id = "semantic-mail-fixture", name = "Mail fixture", version = "1"), + endpointPolicy = EndpointPolicy(serverOrigin = "https://cloud.example.test"), + resources = resources, + actions = actions, + forms = forms, + ) + + private fun dynamicResource(id: String, label: String): DynamicResource = DynamicResource( + id = id, + label = label, + collection = true, + confidence = Confidence.verified, + ) + + private fun nativeAction( + id: String, + label: String, + resourceId: String, + ): DynamicAction = DynamicAction( + id = id, + label = label, + resourceId = resourceId, + intent = ActionIntent.create, + risk = ActionRisk.mutating, + requiresConfirmation = false, + binding = DynamicHttpBinding( + method = HttpMethod.POST, + path = "/semantic/messages", + ), + confidence = Confidence.verified, + ) + + private fun schemaAction(action: DynamicAction): ActionSpec = ActionSpec( + id = action.id, + label = action.label, + resourceId = action.resourceId, + binding = ApiBinding( + method = action.binding.method, + path = action.binding.path, + operationId = action.id, + ), + intent = action.intent, + risk = action.risk, + requiresConfirmation = action.requiresConfirmation, + confidence = action.confidence, + ) +} diff --git a/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentationsTest.kt b/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentationsTest.kt index ec5e9524..a6c0090c 100644 --- a/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentationsTest.kt +++ b/ui/src/commonTest/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentationsTest.kt @@ -38,6 +38,14 @@ class NativeSemanticPresentationsTest { assertTrue(presentation.unread) } + @Test + fun `mail row labels prefer a sender name and compact ISO timestamp`() { + assertEquals("Ada", nativeMailSenderLabel("Ada ")) + assertEquals("plain@example.test", nativeMailSenderLabel("plain@example.test")) + assertEquals("Jul 29, 08:42", nativeMailTimestampLabel("2026-07-29T08:42:00Z")) + assertEquals("Server time unknown", nativeMailTimestampLabel("Server time unknown")) + } + @Test fun `mailbox counts become folder badges without treating zero as unread`() { val resource = resource("mailboxes", "Mailboxes", "name", "unread") @@ -56,6 +64,24 @@ class NativeSemanticPresentationsTest { assertFalse(empty.unread) } + @Test + fun `mail thread rows retain their message count`() { + val presentation = nativeMailboxPresentation( + resource("threads", "Threads", "subject", "from", "messageCount"), + NativeRecord( + id = "thread-42", + values = mapOf( + "subject" to "Release checklist", + "from" to "Ada ", + "messageCount" to "4", + ), + ), + ) + + assertEquals(NativeMailboxItemKind.Message, presentation.kind) + assertEquals(4, presentation.threadSize) + } + @Test fun `standard envelope and body fields become a native message detail`() { val presentation = nativeMailMessageDetailPresentation( @@ -82,6 +108,42 @@ class NativeSemanticPresentationsTest { assertTrue(presentation?.htmlBody == true) } + @Test + fun `bounded nested thread messages become individual native details`() { + fun scalar(value: String) = NativeStructuredValue.Scalar( + value = value, + kind = NativeStructuredScalarKind.string, + ) + fun message(id: String, sender: String, body: String) = NativeStructuredValue.ObjectValue( + entries = listOf( + NativeStructuredEntry("id", "Id", scalar(id)), + NativeStructuredEntry("subject", "Subject", scalar("Release checklist")), + NativeStructuredEntry("from", "From", scalar(sender)), + NativeStructuredEntry("body", "Body", scalar(body)), + NativeStructuredEntry("hasHtmlBody", "HTML", scalar("true")), + ), + ) + val presentations = nativeMailThreadPresentations( + resource("threads", "Threads", "subject", "from", "messages"), + NativeRecord( + id = "thread-42", + values = mapOf("subject" to "Release checklist"), + structuredValues = mapOf( + "messages" to NativeStructuredValue.ListValue( + items = listOf( + message("41", "Ada ", "

Ready for review.

"), + message("42", "Mira ", "

I will review it.

"), + ), + ), + ), + ), + ) + + assertEquals(2, presentations.size) + assertEquals("Ada ", presentations.first().sender) + assertEquals("

I will review it.

", presentations.last().body) + } + @Test fun `track semantics retain artist album duration favorite and ordering`() { val resource = resource( diff --git a/website/public/screenshots/capture-manifest.json b/website/public/screenshots/capture-manifest.json index ff7d9ec8..5e37ff60 100644 --- a/website/public/screenshots/capture-manifest.json +++ b/website/public/screenshots/capture-manifest.json @@ -178,6 +178,7 @@ "ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeDatasetSemantics.kt", "ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailActions.kt", "ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailMarkup.kt", + "ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeMailWorkspace.kt", "ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeRecipePresentations.kt", "ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeRecipeScaling.kt", "ui/src/commonMain/kotlin/dev/obiente/nextcloudnative/nativeui/runtime/NativeSemanticPresentations.kt", @@ -197,7 +198,7 @@ "ui/src/desktopMain/resources/marketing/raw-render-fixture.png", "ui/src/desktopMain/resources/marketing/raw-render-fixture.svg" ], - "captureSourceSha256": "95415ff1e63f81bc2e56f2613d8a431876dfeac57f8bd2be0ba0a98b30343986", + "captureSourceSha256": "5ffd3531103865096887e0e2dfedeb1e45de7fe47ec5af9be85cbb1f9f159baf", "avatarSha256": "a20433eeda834a418f92d76853633b4fc9115ad3006c5622ce2611432dc1f14d", "captures": [ { @@ -284,6 +285,81 @@ "viewport": "phone-portrait", "sha256": "f1290c89723184800c127401de7fea4256294049828d014beed5ce11c8e35ea5" }, + { + "scenario": "mail-workspace-desktop", + "file": "mail-workspace-desktop.png", + "width": 1440, + "height": 900, + "density": 1.0, + "feature": "Mail", + "surface": "Adaptive mailbox workspace", + "state": "Inbox message selected", + "purpose": "showcase", + "platform": "desktop", + "viewport": "wide", + "issue": 54, + "sha256": "dc3dbd2bc09b34bbfbcad8fcdd74b1f2555527b222f570b3d8ffcba06fc5166d" + }, + { + "scenario": "mail-workspace-mobile", + "file": "mail-workspace-mobile.png", + "width": 1080, + "height": 1800, + "density": 2.625, + "feature": "Mail", + "surface": "Adaptive mailbox workspace", + "state": "Inbox message list", + "purpose": "showcase", + "platform": "mobile", + "viewport": "phone-portrait", + "issue": 54, + "sha256": "54f1cdf144ee63a74395fe738a0e978ee8fec41ba8d0c2d6bac93c719dbec328" + }, + { + "scenario": "mail-workspace-loading-mobile", + "file": "mail-workspace-loading-mobile.png", + "width": 1080, + "height": 1800, + "density": 2.625, + "feature": "Mail", + "surface": "Adaptive mailbox workspace", + "state": "Loading inbox", + "purpose": "state-coverage", + "platform": "mobile", + "viewport": "phone-portrait", + "issue": 54, + "sha256": "11d4b57cd7fd5a38d1d13da8cbe3df349c6280b845fa8c766d84c75b7b9b14f9" + }, + { + "scenario": "mail-workspace-empty-mobile", + "file": "mail-workspace-empty-mobile.png", + "width": 1080, + "height": 1800, + "density": 2.625, + "feature": "Mail", + "surface": "Adaptive mailbox workspace", + "state": "Empty inbox", + "purpose": "state-coverage", + "platform": "mobile", + "viewport": "phone-portrait", + "issue": 54, + "sha256": "1c9b357d9f4265b886ba4d30534d708641f10278da91b15e61eda6d299a21da3" + }, + { + "scenario": "mail-workspace-error-desktop", + "file": "mail-workspace-error-desktop.png", + "width": 1440, + "height": 900, + "density": 1.0, + "feature": "Mail", + "surface": "Adaptive mailbox workspace", + "state": "Message body error", + "purpose": "state-coverage", + "platform": "desktop", + "viewport": "wide", + "issue": 54, + "sha256": "8dd96ff3e9d48f98c99d9c8b7ffddff071537c891192af6e24fb9c3243eae874" + }, { "scenario": "photo-timeline-revalidation-error-mobile", "file": "photo-timeline-revalidation-error-mobile.png", diff --git a/website/public/screenshots/mail-workspace-desktop.png b/website/public/screenshots/mail-workspace-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..065a9025ff8a681a33b8351f56e3bdfa603481b3 GIT binary patch literal 63355 zcmd42g;$ha8$CRTf(U|u(jg!qprC+sDJ9+Ak^)0_D@uoefV7g*-QC^IFfT=#YMwf8=O^0MNOACWwQKp>ALK8h$pAP;^+AgJFS zqJjUY$;6C+m;3e~B$OY5hsQ&s00`tcL_*}fvdhdi+}TChc&77U@8_{D6&3$C*@yL# zdtV(ye|&28tKZu!$o!lA5eg!@ch;l9Wd(I-DB@E*3yf57QxMYCM}3}HRulrNBL90Z#wk!e!TskEk@Ne0S-`&!WenQiqW^w3 zUGgQ$YwCX=DjzV+{y7d8HyckCZAnHTL&9Op&WT#FJ?@ygyuw1rGk&tH6!>#VrjT)YR=o++c^%Mn3$N|Jw3mx zs?`5CNIIJ0(#0lsQ~=T($!lbklvlFzi;OJkR!JjtnwM)~ZSBjn_DM#D3>`i;c9?p8 zyZS4F6QX}27eUfySz_4Ig&-QaV(v5HeXt_gId3Vx{8yEWx4Oi3%PuHig>7h3UE?wL z6z|g7X4tS<-KY0FY%?>>bHyErQ&}k(gA7^TFT{)oVd$3N$& zUaPKkJ2)*Bv{4E_c+{cd1YYWHwsERz-Bcv5q9b2(kc3tx%4X_5W-cgrCh5_5(~&?X z7}<9~)BS>yPo$Drr&njUzdH)rOD-7cF}KS6f|~E1xVX6aWR9qaOO;#IKN+K~CQZl2 zB8a4w*(_IhlM_gHGP6IDrl-%U;$<8xDIru_Q)Bpss6f*P3k|iPU^m(U^)p%rqILb4@Z|835olu zuL<6-Q~z%PE6_6ZPYXQ9W^GrGhjreR| zj!LeXtK0pfCEDP@+TEyd!GV2))`vOx%4?Y+VrdG^&;Fb95nHOuH91e@N88x9YmKEw_IzjekHGlZJ!_Yz_!C)}sO@Y;o<>Q=yH@FH{O zzVi$sh0WyHtfjT38aieM(%n{TX|UEKoC5wfp??K|U^BVq0x>~p%2LY8$qM@K=v|Ka zhP_^DM!ekB+<97+iRZ7kxE;7Kyc>n6X-I}H{2I7S?xjsuf1TE2eJt(#gcp>fbWd z;97g7a>3!Hhs4LgASD*uHQ;gH^ljFM=nu&lzDba@@-ky!{It56kq0aK`tzp|35S{3 znH4Gq4if`gvGEof@@luy_27cx`t<4pUImnzFHeB;F_DCm6J4FA-rhe)k3BagpgvGoT-?U1D^IF~Pq%G~mQ-{#kNMrP zT6%lYeYUryy>6faT6i2kVq?W!)Sv2DtxG8@8$y;U^Gq*-Qn)=_C?g^sZ%mX6o}|W) z1=u^QhzX@6czEs3532QI8eWEMfVo9|LP+S`Y%G|>5gMoGDPeBTSblx;S-y}09fx8C ziB4z7_*$lr^?!F(&MKi|#tz{#g2T?9_OVb)k*rgGXt!xo3ka>{?cy}g5S&ScB9S9iwu{{5d23P(x`3f;QP%P2Cws>+_h zq{=Ms@35*Rn%{f%S5_2W`zVkPUwz{aF3K>O1y4_Tb39Tg+z&CpGf;6958oM=j6&69 zy3n+LX-lKDN7{Qc&eR1wd!!5J{~BZ?a0D+Of@jyfEdIaQL!c~%cl3d^l=Y(ozofJ@ zuk_mCXi{}G_jT2R6wmyS{~zIwd-5zf7;=2?V#>F?O{abwR2bJflM6LAw4!{JkT99v z!*pFbP&1n?;*LqBURs*8T@c!+=>pjhLd=g#NXV&K+3-cDwzAX;{%EFbS9+vD1mt=1 zjv?hAdxQYQ#l_`d-ubrwlsw_{bSe!u_w+Amy3PCF@#T2~O!{YLW{@Cc)UBj%e&2q? zLZfk{Aw2|foQ^LFTv!NT49$-fZ?`bjJGfsqZ8@Ss|L^oCy?oi#IXCd9XNIMM09BvQ zbmizaHpb~I$iXq07BXUmU>}Pz_+6q03FpzIKal~q%kblg?~ zI+sh@P9|5FyTS?z3fYK>QHg^i=#{jPQ_hZFY$Tu-5V{FkaF4$L9Apy6@$CsK>qwuD6^gntv<>$WT?=$wjNAvpI2zq zRf=Z^Afj^KGb}ciML@tSJu551ZHY@jpd4j=q?&Sz^SZfg!+Nv<$_c@y-^=>E93vw7 zuHY0g;PH-EFZ+eVdz3=iNQT)d|k<#OBt87?C$$x*g5;BTI|+x!E5B|CCBKm zL`7#gHod?sqc<6`+QI$?zS2VCd*^9OTUl|ueY>+hZukTnn|4+3-n|d%m0sN9VPs8{ zl?1}*;TcDd>ru?c-uTf|cz++yjXm5sOIcpp7Beyu=HvG)?5fUv>6_pmUjB)Gvap5s zpi3C%6FZ5^Rni&b>_i|wLk&Q#|9#{HF8I7OsVlyW=WhUu#`m-|{BS;pooEt@Gb3?q zy1g8E(zQ*S=b-X66o~vU(}tQ?bjbKhf)|?pTAUIM&MNQ6^H_^Jsc>ENjn`oO`3Elq zXbVn2FLd7jHBg0KRx8eA+hAa`$XSQbDV0BzEN*YfE{jsB3AHt}>g*qn#t|6#3;p*L z!3r>zZ@2XgkKEnGAEcpyI$^j%^ZH}&$9x;DXA~$pMhrO|U#b&5iP>%5?A4lMo}>LI+Z4OQGRgFJBjxT;8+c))y^uD3@%#1oOB7G;tHb55u5Hjj!_F|M#}Rxx zShF)n;N?Gu+DSAd-!f}(6F(Ap7n_vOttQx@^m#|+obH?GchLo9{;x{P>fGJ?XSclH zjeEV*?6U@b^*e3Plm?#(xJ<^lITe*61PAMVQc@`C<&uro^5S05As+}0?(%Ppr{NS7 zFemc4Mo!NUn7~f&qa9Oz%nD1oIKv!Nl$UR+dRwVPUxZy)Cm>P(Z}(Z?I$a%C$9BVz zoN!+JRUx$gWZH0L#aIOZXb=f`bs>e}amoie%E}_|4c=#z8CzS+8M(X|6u8CFbz2qv z;48fDAxsFn?&_+!e&bDnBX9``ti>aChH*hQCqh3BH8uCe@g|^CdiwMqBvjj9Cr!a% zr8dL&SXoDjxtCNo#l|v3r7=xBE(HIt*1_tP))9XxL0y)RvJ!adJaiOPHBad1F?+$p zgqnM@`79HlE+b==-TfOqFP#svvdo=IVYd7GRG@EyCOGd8yT*C>Rt7G zRb7`o*{}?A8xu#{>ox;APaEfGELILxRbf|GS0iH+MQv@5_IpZ}40LR4zIAnVJ&jM8 zZO8_g3o1IXv9Y;$cx?FIeb3vr=4(w*GJw;fit-~S@Vr66`eCbk`gp%cSxB^i?6@(jf~1Es7sXpVo5J5@+mu3 zdir!l?;r{f@2Rx3w0(#e4JS_RcYJ!eABi5{-fc|+6fBlYkpG4x6pNe>E4cl`Y>bOE z9e!mPS$oO6_v+C`%5dIitWZ)8RUE?qUU$TnVnoId=S;zNZ$WQ7sbW!->XujS1asHh z3Ul$NM4~Y*jIglo=HUy$=;`0%=Cp!>Dc9E?L9f262M52^Z!^nNFMxe2mY4q_XQj(r zJv|Mge(xD2p4X^PvxC_ruArcxwhnx%!H^Wyx-M`&mWAfZAv?4JIuj8UCEQYx-^Ok+ z(Cmx8K2(9)>L1nw*5o+7!Iic^W!Xfo_XY-3zG&EMnJB(C_KwTJg$>VXSGm%x>mNI- zISbreKnMJ;JGtch>$kUhjP_vtoLl+Te@P@s}R z{%Y-2+BH;a31Xa2ZtiatpO*V418}Q1J?c@3-t8M)Iud{P1r4WSpxsf4MwKPqJTo$2 zEUH`0viAR?kv^7>{`_jUbUBevX^%z${yE?tZnrwdfyQntKnd28Yg+ zJ^dzqCXg!@A#va>BA$E5;BAW!8-S`|0*x{Nx(;ATRR6j>Nj|LEP_~Q zzIVqezGohwmDu<(^Cvx#M|Nbfeq{~u@(uWaTG8;1g?zTAzbE9P|DxQ(oaq1%C5jI~ zr;MB{-# zxX%>Bd63PIz6AtyseF1vWJWYcM2~J7iM^*l{OT?=*)i-O8<{nHtjTFp0Bpz!ENZg3 zceDBO$$zfoH3PVk*fw~(@82J8ccXlKhxbg85=RZ^!H2t9&mjl&>q;v36!%cN6}woP zF3;UR$Nk;XB03_5xu&>Z68&eKdVyTV`_y*Do8RBH%?;?@B~Z5C_Re-T;e`BuvMIt` z6ojDqC52V;xy$)~&OZJt+#d(LzdLO}fHEn#?Ycw*|Kevq2XDu|oox%%o8IxcA5ZS+ z+3VMWEZ%(D@8Tsv7Siq89JO_h%Kdlf_h9G?tp?poJSH#?X>+yF|6z9{%gT@A zKH>g__o%>UzAm-yOb`Fhr7LUPo3X4|uCL76A32K3*=eq{7!CVn(m#$V!rTNOM=kBn z69Q+i7Mte|;%Rndt_tzbLQmTx`(B!BpS@9F#q6*J|DMn}*Z11cI@3L+fG89VvdNh< z_#?u%+IaT$G4T*7p;|1a70pZbfaXdpla=#`W6D_^HBL1M85#Nda3yK0IF9ku-#=wr zv%6n+9M(s^3_FK0Ui`LXAFdI$@C&Et$zQhqbNd77;x--M!UBz3gSH4pTg~cq3 zNA_L|*4;vQ@hgf~5Gk$;$iV25dxOYrjZn|q{>lpbla8%ISf;p`NQvzZ zPZ$|jSKZ#4YE^x_{+zQtx81^X(#ZlER%*qYKYmGqxVY8qDltC0v)ODH7uDyNm#Q$% zv1GVAE-u9%-RE{F0=ok5kVI~dTkV7?eML8vQ{D@r`DZJwa{KM{Y`-{G*&OfVMlkA| znu@=N9a|3ycl6BTebZ2L)$$gv zGz9gF)y?K=*06N{hS8P*l6(L3G}E<|2zjzyDt)t0qx0~?)#=Vd42)(=4t#QQ&+${5 z=g)ntP5ReLvs08WD&pBc2Tfbjy?F7Bl*dt#{t0e`g=X|)3(M)$XSHYB&7Gb8;Qt1L zbNm&qp6+KE?vu$?wY5=kan0^ZbE^w~d=W`=^%l-YHxqwUP>Mj5drv$lJnU1>%%QP3fFyw z55lbvA3sjhOF>E}AQ|YQ0>5x#x3sqU&d!n{)ypGYj~dljBDUg#OSM7;{nq+FK>$P} z!a_?WsP1pw zmK~NHC_fUCg7u(+HK*G>CGCy2)F(y~Beg1Q746n(j{Xynr-WMS<(AP<-nfl8u3D}w z{%gF9j0`r5(^nyM_zeOA?A8>*A};sQe7_{1VH-{F_5M1_7h~2N^wO#bX+&NIH#PA9 z_G~w2rxWmFMcUnkEYLq^>Gk0yy*t^o%V(-nXikIz6`4;sET1kFP&=va=h!Mq!rq(~DlUSM*lBCT^$e{pYY< z{lR2@!g3ZFl6M9to6*;GM!24CC&mk*s28h~v>wOZ{&lB^qOU8s(YD}#w3J*G;kdQqRIvh5-hk6g=(W8mLXSmrWoA=R|HaAKhzq!1TZM~C*$ml9UNTq2XiWCQA4^4ipPl7{u(GlimsWP_zxnYb z)+am#2i5;^n;H9)TB_u+F_HqN5=fw8+(9`oRT!RrO$KM zJcbJCXv-d9V!9yP2_X&d*Q&YjIk9S7ZFxI!U?d(`N9k$%Y&(f6q!_+LbDnrS0 z@mWAPLm4lWXYwtaS=mYhg6I1RbOL9m_QW*H&DuMrLd&e+F~`RaNX{dB$kGxgYNE4S zX9YP|bj(1WbpzT$(-+jbi%VFUHSEiIzO8pH%k;EH-?=#&V8->zJ)Y8|7}pk#m(l@ z^nC60^>9TZXvLhvQ-oa1xWv)|X}bL-q~useb>RUY(coMG3%~UflXQyM61uy)sSFSt z0+-5yGz7TSWXZb8Wwn3EVfe@;kxdDRlO_CpuhZ+#(*?Ahk>Lu;Mhu)6So+0JW8JKp ze1^>cd$Obl!?D(5!QK({i7n(jAsJiMAMpY=gL>(w#}JtWaYI(3Kp2s~-cE@zQ-~No z{L+E;MwtgzX<7KzHh;idWG?=Pkg~FJw|kNGbOQO==5SQt8C={K?Xiusa~5cp#_;LY zE3L@G1y5dR#J-VVQG}5QSQ54RKc-;Ns$v2W{YHAby^1eS9Dezq$$OAaa@V zcn9u3Q;uq5Yn%D|w@+W5bmS>rvC)QNrpK{C_Nt!SqNv-+_Isfnu&|JI4Gb7qkLa58 zU4Lb1yxffZbTOa>XcAA}>ziu;r9mRcmX#@428FKfUhO_;nw*U7r1T5{aQz7pQ9wd2 z6R10Rd6to-Bc{{?htl%$Uh!(KsL80{= zuB_ILM|!X$4ClG-E-f)U0usOAV6a|YkVy!%$OU_S8euBb9div1hf53X%+St%hgBNh zB5%M-c-@GUxvGF3oSs&+^YZhDl6&v0Bv>~ZBflQqM()k3Hy}GmUx8XgnCzWQClkN0 zz1_D&D@EjuAcuVO^E=!#O-WP9RXulc2X}9GSC>Al0$O*n%X@u+NQosM?dA8@T3-6Q zs)y;5b$fu5Ie4y@eZgPjh{%m&0~%9$M#gBWOsj~BrH_ruxQS+n^X z@@WkXkGB??JfQ(ypT*KPtYdADY_hac3by5Vnqp)QDmH9MmjhwyhjpT`H6s(F#L7@m zHh?q;WEIdeE^e-Uc<)8k-cAtT#=bbzAe?t=j|#a#KTA_6?Xc9W?XK`r7kOB)TQKW( z^$}L4Wlh=rb&nu2DoJM03(ipS^yn(`**iw$>FGEp3RD1b)E+muZW=<#8-_q$yxQH( zkP5hucK?mhzW(N9uH0lYoW-0sc60)cPxk~Lo+teZ74;s`TMw=|fw@^8w=(FQIHk0~ z)X*Q}utCs~Y9h-4H^ma|lY9o(=5bh;zvQv8&(LsSFO+q=`_N^p(fW3$_`9DUtHqkM z*2wW}#q6v$x05V!AO*a}w)6ae2ss~1>+H-KFDia?nOhhc7p-E&S}hgJJj=FdMMh38 z1x*u`#@eg9;iwGb(PZ2>2e1sNY*3<5Q)^CT`Zqt^>7Qnj3E`@~XeY#;Tlx1NJcz#VB7>JPqBAJi8rVt(Z@B` zHzvbr#KRyq>-$u7eD&ZAE#1Qrvvqu5x9;QPs@e&UL}kgc-t^usu5EVw#ic2}^7by0 zl#nnOPhsMAS%2PGs4Xj^eqT=TlwCF~OvFz-r!@cwmd_iX$g#*lQb{ISjcWF93UuIb zfXjKsv1y};sLX?d03ta}== zn8>7rHtYWuZ`>u47E@)`3aqau*B95-O`dCIddX9hy>oDy#5;J3p{53y`?p#xF5@{W z9%rp*Rb0GmUfWz?Wj7o9OGWAV=KB@JFPBB6V;rRf< z*k)fegEvHXqUz>&F!kHw^a0v+hQ>0Aoy_vl>Jk)rp)pW@%8i5?M1r+9IE;kYQD zwCqNJh#s8e6$S=}XSrAIVo~xuMMp>9jkDp@8%!3pvpakczE@v)YatbHVr*QzIXDhh zmgPN!+|A{Q`ti|Vg)ze8>h;;2CyQ!co@RY~XaWZw+0#Byrrsy@(SFBSar6L%5YLWI$O85XxL=>QUa7b4go-&@Yktz9_6F+-demFUWlJ6XN7!$qT#C@c!^7n? z<@QyyPs7h&y1N$%mmBoQTQEX&bbmYRkJEJ*)9$r>H(mvEE}|ml0g`e;&O5WwWycON zuW$P~pmHO+z}XQuki>&u>xvK6sx;nSw{5eU6G{55&tawMJ-6XqpaIssood(fj~q}< zx%s)9moH!H?_8D}nV8&(#YewlEG4Es#16ps50C5CJ^Oq6Y53R^_ls;;S=rX@gw>q3 zXJy62&@`qs-g&KLb)6K*g$q<1l6vnjUo8D7;{TEvny|FJEz&r5bMA%2VYk48*1jE| zfNBNKYeue^!Be00C%j`B-6bqFSz1~DDD7acotV@$(B08Jj7v{X|3F8ifQ>edAwTQ( zZ=>OsQ#^;Yq`uAbIN~@XV_g>`&8S};RaHDnm0m9#w_>kxS=jiaF6LkVc2BW7zr6Sn ztJhTV8a7p5`eIs*z6$#)3OnXAlatP?eBLrDR>rT#Wmw2_LumK$W81Q=v9QH7e}gwd zJqOAamUBVj;W+P`-@mYuD~mR~x^3C=Q)2qPlC>agMQoXX-08Dsc=>W{qj8Fb%*l!G zqz#`aR1C1+GN4ES2a50LDuHgobq#cyp28E$+uNHfDUZbM=pn4`{I%A((;44NZEwfF5-UFSrd2G(n>3ch+c zHS%Cv@U|k%sZy7}N183JkMC^I8}j6-I-+iC0BM3Pce_kkfk=@}>iPYJ6Xgj3g;j#U zTE*LnL1FR8s10~yBlMfOkPxKTTgypeev)xS_tO${eA`co?gstl57g8&>#$lJ$jR0? z`b#B_RDfjX)n2iTuKm>-z?MCSPFq*ly*l!`jz~?VPWGrvPr+%}$n2FAy1Gh!jq)=p z%8;qE#0t(Mkj!%u2?GtwN?{{%Dfw#8@G6YFVgm}R$Phh>9IVpN(2(}nf6vk0kt{Gd zU$i?Yh=GHdrO@hE1_%$wtqC1FX_m8VXi%u}Rt2=oeE1%VoE(Mwih|ZfRD@Hrm8C46%IwZ@sVmBa>C-3W?cX&k5j7fRTw~J zxTLia{kFxcvh(G<5qk}{eslGg!}(Hbib_gx$aaKLGV^5dLe>Sq;IWmu-U+Da*hPkj z_Q_SPV!H>PZfC23;wekLg{FAVh(*J#_yI8wy4L;GZI*Fi5%VGw#I=W$PzovW5TZlz zi1eKq5JtRTMsvwZ@wy*n=WUk+M(M)chI8HJ06dqv`T1k?ow%q-0e$nI_du%{k&7Pd zlbbCLZX>Vl(K*fitQQ+saT;Ep$Di~Pc^iW~wul2j3`Lxt9V?Wy{_*VUh90&A{8Zh z^G%>;V>)73tAg&QrWZ&>GJdC@paz&Ix;3ZFtC?s)fFkyFRM5%J(Y9D-zS3GS zl$5gt4iBBy^X#8F+4}X)lmnCC)vHoLQ*)$=kQCg|+8 zry6cjkuLHoJ1AuQZeyoY&BKe46OY5Wct1IBST{z;pLJ+i-&vsaITA3iur_ zCA)4C^YP7Qs})iJaDKiV9_;~2V0C%)t*n9q?k#fATaq>f|Lkcq0q`qoS9a2jBc zX<-+2&}l~O>eSBQ4aJh&Vf!P(zATks0*J%jM1PDA1&2ex&e2(Xd5vjQz(*Oy4UBcu zWY3b>4Ma@IFV0){wf@_NK2}5ma;rq|!g0EAwc@I`Q0g2I3#$VO95 znPe8EF>bK8hLL-N2|Q&JmwNI?(ZUZ*df822^NMhHT1iNNOZK14UX^ z3`!;~@YdyR_uU^vQF#f#JJLN4GKvZ@r(hPwK%PTCoyWTdS3wFni<8EIU9L zl2Vw`xN{I!;!ik|>1aXWv48@YnUKm#PN1O~-~O`0B3;roMD}M0ph2-$5kk&D|iBHr=9n+ z*u=!XTFSaXUwrzd)eVW)x0)eD0*QcPdcnaFQ#tSI|BUIjYW-9;iAQDkqm^J|DNTL? zyOl?C!@BK&qeJ%F`q`tigR$&8puTw@ZKO(p#>3N7LPiG2rrm#c>gxD1y;xOP(y6K6 z1(-_*biK>A9u%mmiTOD{Rpm;PJCRq>ZvjtzM-Fpr>h2CCy_)Uv>rWsuDb{C=3$P-Q zNxOUuShY-WmuJja&QvilXNmLee4OnTPw^75NzwrlsXWP;l@dtRQKlMbDTyD<5b6 z*2h5DA7}tCnVIP>))iPs*ovNNJ^ZUfN=cc*x`jNwVx1|o9>l!$N}j8~V|2d^o29?^ zy{x+)ks2$|37({r>-fZ7djs56k63JWo<4h~vp*$`co9CxKX78}6gs_{B?SI`utRnO#Tv;kKd!(;!ITQ18PARIqspSMO()0Ox0`ciTf>;*) zedx?t$;vrbtB&a4xxHu0aGh}EOhqYu;gjNxjH9RYP7EXGmG5mN04Y*tJ)bN`!m+X_ zPWif0)!FsYz-Z?He;8O^UJ>*@2&=aHmZt*z~{&~P>Vl+dC!?o-R@ zj8Us4T1 zJ!{HjukFuRXu@$U+Q8I8%gIRyph^6@(8Y2>-S$>EDmuFO18tE4-V4`@M_;u|Bns<$ z^5XOW!zX#?F`mtPO~VgAJ>QxxbvfL~VsY1s9aX*cx&b)4a{huPYMzg`n6G@aqV(qNPfaT>Ed^Gg#X3N4Y;jsOnU{lkx(+~GiEDtwhoTeYOUCUzPNX}BLmj5r_*}EV+GITO&TgI&z^nWi@~L_ z3>*PoI)lC{+X`3fIwa3>M@W6%a__)E%V?>Q$o@I+?n_7ChMqFhJ&N5V7r{h|2*J$> z1>ibt1B(N%b>mGc{t&{RZ?$UYV6BSFs_yf`e1Sdp+x(B-0M6hLvD-Wc3{ctLQ1Z}_ zJj`q>Ln?N&T^TfpZ|}6A*N^yhyq1+`7$%_Fdgi)I1tNe2^eP~E`ZNUS^`j=ThG)s} zrvwC_7)pw)Zv`3>Z;ayfDjofF8J=?tu9I~N~n`0QJh{zGbEZHQ+Xb-f%I=K^~&@(V48{?HY zS+etLEv;!QbQV{@3kFC_2+%hU!Fr*6S`08$ABQ9lV-7QobwhO@t7+tbsa4yq+rOCX`s)rRwCb)mnJN&3mo#1Nnnn75pvSg1ZYLXK*`xmi^P}{vsE0>)XfsU< zwI$7ol9JNJUhUrce?mF@5GYu5@Y^X=!o=GZ`;4t|QzMi8r7f0djot9^jIHf{Ev|4^ z%-*?`oVw3I*HWCI2^SRW#3lzy0`1F}0nT%73AMY`q&{kT-bo4Kv(iaTLU*o_lOVx! z$7xn<3O=8#EJBoWi_t0xe5c*nZklj@x8@yfb1h!y-SpqTA)uuP+*6fl%l%BRONNt8 z(Ss387CbUC?Oi88`%^J61oj^sY)_Y>M|FR!b=ujtVW}<@(VUs)sRXR~T7&y;v;Ld? zeP0|rz&O|*9IUJ&6kv@65fQi|-^7QqEn+b#U_sH|KZ-m_-wyY`N$9V;JY+iFn@?Hp z3}0T}xswa3FIheh%&EsX~7 z8F|;9+};H`zP|OSJ2U04qp=EmPD@Hk_p^-Vet$uQ()j6lpQ!L?FNEU~#}NZ}$s$11 zm8FO$wcG^29#H|E?=VgA9*EWR7Omxgg36r=fOy|65`7|1OG;Am5fX{KkNyC7*zhxD zQgqFYZrf|llHFbQk%4X2@DCq8+(XBvXlsT0B5$r>F%l9o+54_DWR#tkCtG03@ppHv zq>~P*8ei%3=+)vCv%!>dV+2D<*dhAs{WQ$Hna_4`?7h$btY{wEboS@3;HZ#tSPcdL z4fyyt{l8mOv=u15SwSP&@U7b@)jCBWgoq>28WA(Af0z+Vf6yZp1vD@^M#iAOfB&*> z(Nl8UDZr|KRsbv;7#y4?lfVIXm*`#(V)9*_M*&IBfFt2ztFZB}UZYpsiH?rW=h4i^ z&>rGN4Q1uFvm>t}esARW+b6`t?+YpTZJnIfI*>Qj2Z<}x@|$a2gom?@$o4EHL8{+Q zP*8+Hiy)VMfdQ*Pd9&9^xnU=43fO2f0`mTvaqmyX>HxSbDr=H3Ffe3TNvh#)aau0a zR@)Qvn?D755C{+KlS#Q|;C#tiZOZN$aAE2YVhf(nN zlx>U>vwi|u$!!c|-B`V;N^eT=<|!ee5>QXX#OMI!i~#ibYV@QoQ~5R2u=8*YW*t!k zCEeH{21_<@UP-H}5`fG8w0kzMH&&bv+Q|ezER*3uLHifnaRAH!*Z|P90b-!>j+uve za5^(b>AJ?XwTS@guBfy$?Qd6$Unps{_mT*Q<*a%(;iiOXgG`S_`Ej*@ih+Sat_T(H%_T%N058Xx>?Z-oHm_Z*K=tyE_fR%{ANB zWMO08RJ-+bOOPOPVZAsF_|y$SL>U>Ez%~%D*B}g?()AZu>9T(w{Y*@h?qp87aGQ8_ zO1DGH%bNi34DgPC({`+#bFKBK=q>(IEfc)1Hp$;PNalBE)V>8qy#nkz!=;MBlWKwc z55C*14}Fo+%(BR(c$5en0FTQ(maSEg8t+BYbFR70+-Fjl4-TdgDMy2dWEFW45%cGv z|Li7e02OYRNK0eMM`DgQ)-8h`Xjosi6m5ciY*axErk{Y63 zol1ZyzqGtU@M#F<}iG|e${>;EK;BabOjcB z!+{-`^L|q+4g(her&C}%j#mC^bRviTn{}hE^4xS-?9P>+McFcGC|yVBIbk!(3Dej> zgD@Ez+8EyF05v1a+edg&f(x^-Qg6o^c{J;_-BiQw{ z+Zzv$tfx9lFQ9be5fJo2_+ZYg$!Ik__Igm3hL>LFOyoa)B9iXB zI}=oCa`j?r`3fPfg&|?F{h*lDrYk487F=ZXl3e5XiakV(?WQISn0*uK(ec&ydzDAn zl%!P431Y3bSnFF?ou2KPvUBt z6s(gqnUHv(aOX-gCj+jeoNBhTB=Zp#Of0nJIP{9opEo)$KJC7U=iHDi955tu9aVy? ztePGzvrytUdWu#I27uN5`FPbhplj^M&?- z#>!x0kMy!%sI9Yo?eHx@sq87^rjl>_ig1AD7Rfdo_y8 znq6V;`*Y}Kv%hh{hD;+QyHr^@3v!ow*1ANZY0x~bd5z*$lr;4|8W0>pkR2v)>7Q%g|gNa z{$4}MddDy@AlsjJEtVoq%Wm~j)1C5XW<9U&w|s4VSwT<=?c~TK!2C7P0LP+a4{?Id zEH3VT0WKUGHs4hywf)wwlrAd`{s1?iHbvnGqBPZgKe{889X7_|ke*g;gPl0R83Bgb zofo#v;g$h#c{*m(u)RS?a2wBbdXt{ndtM^xw*_5%Q2nuoilLzXK62SV@JCh@YOh!M zG=}yAbCiEVF7KY_HAS&)F=UqC>s}I%!>6r^{JMkP1h@B3tI?hktg%_lSsd@O#&96U zyqE`P`h(RkJ7XE^frkuK+W2Bt5(OZINjB2`BuDWq*iLjg|yhMF<3j&BFf!!@E7fMpL14Zri< z4v_P**|~HNW+=&~FRg61G@wefb##7uBXq^FvoTzb4)I09q62WNVsCa}?R9awsfqj# zJ=UCjsjPwHEjS@>Y24JgI_RS%@6ub)O}qNaZZGL<=nvE#Y|jOneuNu!G$5vfXTsU6 zwntL{95{Wk(>^yBaSELotu{1;py3dSz*M1cAt5gyp4v`uJpS>$6nZ3 zZGSCn4NT(xP~OUjD&B}D%`YJ&Zy(W%cQ*2$5eB)tZr;B?vg23q^y#x7k&$+`o~!pd z9p4sD$5r8{4GVQTkz0;Z(`?-rIYz}v>xY(J{({WVctveX+OpS)4 z?60GS57AVhM=VC<%~vHOJugvz)G@@l9wAWPoC#VlY%Rmg@(fdJmK=EEIB(f1c4lSg z=R7a2bk4>#OoyF=)sNw+Gm|U=H`L8bH6rcQ=jED9;3(h=f$z%3sXMTXfD`Ix#r}ReJmck^J zI?IhaC)henRts~9rmUZU-w8QhpGfiv1AEF|841(i^F5+sw&LLo?}**N!h25j?a7CS zwh~-f_sg*AsoE}RCugVQ-a$=v8re!&FP3^)AOTo7;(z3yJbBWDk0YpSN@~qg=(f7< z$b+?urp&0av;QQ^wMvctQAZd_XO}_i!O=;(OqytR&Te=9a1~0C;Td*EC`oU0RDqHD zlJWLTZPe}fSZ61U)F(SClhtu#jAzx|)lETHK^IXDL|f1+=pI&cpK$Fc>sswJ_V(oV zPL3bHtiB5ti8)$1J%Gcr0!0_+iK#q%FYbC>%mNt@lNxJpg1g!gPDLo2QK1FGQ*p$`v1(3T=?CNRt- zzG2uR8J<3>J{@T3c%86+dYGyft~<5O5tfmq;terphpZ&>X%tr4>!KPmZ=JY-0qK-z zb0-S2OZ$v+L<&c3$Hz9Rs;i5QVFavlMkA%}gFG0c-{)VgsL#CZ2qBYkFk%N~u6=Yg z*jdnx(71o-In!ibdXHs+5^^tU5Mo}QGrSCy<(Dm0&vz7;tVp9fx;ih3c!ZN??mDIU$jJA9JeL0TUF@{{gZau`&oN@PY zF>KrM%-gSGWOmt{kpseewoT2-7x^A_`61SN2z+;8($Qk&E*>izi@}wq=#U=9M;aBE zjW3@u(uLGuSPzDsyEuO+JWB7;rfSCfPoxOTOJ#-h@-T`}-Oq}lS58(9I}>QJf;WZq z)obw<0Xx&en*L_7%zhSwi$y3y-GaYx1J#mLh{pm1gWK-durJ~?s! z_-Nr;F0Ecfge_TY@Aud&`o=tDhHm6pc#xFj-#qpuu-!1bPU*$1f%-Qp42ksE>z!t9 z)6(TIp*f=t#CK!13b)ELJ|mM7?71!^fV{DtZR1%@)ScXMt}n+7e)Px0EMy+Xei$#b zy`FnuOciN&L@q<2X8#Gb=r}7Qgq+*2=!d*VohMgBlBoHN!o>pq5`cQM;GE8(ye-3k>np1O%Wru?p()xP0yFd)8{Tujkl%xTQBXt0Py$?URa7AoD~=n z?|so2HDxtfF~cU~Ysx9N0EP8AD6Dn+EA~$b2$uoQDy+o85kL+Rhi7D0adyVdNZN;O zNf&ePd^Be~u=Pdx$n7E|u>Y+}L?hp14!Moe!xXexXYD+t-sp(oj$J_WTR7mp7WF&v~Vbk#3Zt1Y|cc|`U;iF)Aw;p#1*s_M4)VFVRvl#*8I zmTpifX{8(K?rso}4(U!QDd`63?(Xi+L!WQK``&y1zi$kOgE7uId+#;Z+%uo~tUR!L zotA7mU49!XvGplW?w$ir!(WulnV6&L`U4Gs-FA!O1(ZH>xH(@m>zB#MsR>#cS$XT# zLyzG-ziZ69i~y&H>gRnDXf3s#x+1qgHDRG9eY@l+jEetJ*$J1w_%>cN7CM1Z`Ri94 z;KXPVXf2sGP3juZK8A?HD3v%rBO*FLmLw1Z))nztoCNvBuRWtb^u+GhZyl%)Ny)i> zY;{r6D$u~A?prAECg>caiEm+|e^^Xu2nY>+x2cOdYi~|rW%(&{*7bNCXD+)gjqVi!UumzFXLqiJ?ezNmOOkqu4@CKBjg-uAfw65FoQ#zs7>lR>*c{i74GNhFcC?c14K)eIG>MhwT&q^eRBSn97NX>Q=I^8B z$w5!p+jS1XDnN|4F~56#9ZTpuV)W6zeNqd?Oj)=u3c7nUQLHTPhk74O#2-30w@5w~ z7#OU571qm_V1N%65Coxnx*;w2%LkY(&Q>R@4oLY4M;$O7EoUg$l0Sy6(h(wIe< zeiL+{E|`Gxm9)3l?RQwdWcIKciw0%Yh2N|u{`f56pmE%%&&=(xuf4&lh=GOM9+(=l zy1uTgIx$G&zVRc`VxuQd_No&UhOrfrksrW24)ZS3$=683GvB=hy3O@l4$5D83yUxL zaD*K+uF|i-w=1IIGefWt{LxpE3g$~{`wy`m?TC+IU}+Y9wc0+7CgJPXpXKC8@!2hY z$JR@VOY6*rn%N#IIQ%$H7Zvy{wb11TSsdIM&yQzx;|hbGrlQ0^XL^e*uP%>imHv2g zA2tS^m9r3C-YnvB*&6P1jb=;f9WJ=>oQ3&aX>H5U8`ButJ<(w=xtj~jnRN4&&7}q z@*X#OS$oT1zQX4(|E%EQeNy3jD#Gou!|#6djRg+{fTU6A`JGNkL2;C?!KI9W?3r=L zr0df14x>Pma=rgTgEOQ3nUaR%c9!#O7y)O5q$=BK-|66!KY%8t(qf_IEKe~aNsaf( zbV)hO{dHB{6Q!f|SY%?pq&RcNkclgXs`*gRj+M=pB%$L)@q7Yz4QvyP(a)8P25evS zP4aiNN#O11>FHIv+NG93{q=vIG{w_=W2h`rWWLM)k}6m3H#XLxC5KXl(aYXRRtp0C zoYCpElhH`Bnf;3y$O+Ppl(GGZ9DT{WHvU|rcN2ds3ZbyRiu1k;UdVHP{-&A9nw*`B z`bwp~t%_RVT})hDFX2qB{+{Tj?d6K zF;6C4=Jyv$`P`^+G%KzoDK#m0)Eu~+R z84?g$Hm#>bf56Mjwajr?xwCcMI{j8%`Y1S9q9X)12nh!?Vqz31AEj}>hUvJ4QoYNYAiV}oo{jET7T=b8gO_;c4e|~w}=s?7{gXw z8S97Upbq6({V|ZyV_HC!e#IU@><(aAK>K^$FTK`#J;;F_eET+C&FX5M5)*MDj=O5$ zT0Ju}{^lAVbZ(eI+Y`jkj=RZK__Qwl39M?|E^McK_dc4FMIeHVto{ghwKnPmCP5mN z&uJJK433sKI>HG3Mz_~irTMiw%8huAr&a}pguyUFY+Mmz_3k;(Wtd-kWkm`62JxeB_xfRKw0bW>^Gn*O%5w}s|F)pq*v4T|@{$5w9$nPE=>h3l7 ze*f)r2yS;`DsRV3;o_vSf!qqqy?rZ^AuHE{<`JeZS&rk%0h)?j4#UPE5SaCDf0bqH z`DEtgZe9V470do>X}(hy8pYz@W%m@P8;r{*$9+kR-iVn$+r?v8IG()y3x~$<)6pNo zm?_NYKF0yj?hh;+g)#b*7Q+!_eYM8qsqVLoH11cvi57LyB1AV7X!FoF4$yP@F=N*C z_4R_w`M9A^rn(xZoy24i9)Na0xwBG#qs9$jtY1xuS{V@yHn_o~)pLX_4ZQ5TabQYqs*jg) z|9E@nOXIYh%uPk#pRYVCe+p%iN<_~v6BP8dSs$03l~1NmWlCANb4eYq^nUf6$#yOL zd91IG@B6!%Z8H@}^)C+L5aQtiyW*N{W7j*kL1TV|))ibn=c)G7XZdoL<4N1Ec~HKb zjG$!nV(#bNLcOG18BywhKj9iHa2 zPW78h!shO}ubGQ4X{7v;h4?-EPtn5uimoWX7{=4@i}#YsDTKIB9MhIEm#Nxmj_OOV z%1O~DPFmEw=}d_K>6<8gn!~rKu9Ml#8}CRTVfA`2Y)Cs95= zc3NL#2o~vYQDI_xMICjO^7kod-(lv=fBa^No|fwtxavyHA%B#^zgW_sO~p`LorYlO z;J`cYY@Z+bfj7!J_hK<+Aw@1qap?~?j7WZz2bEF&>gn-mvw7K988zOQ*2+e>dRclW zZ>idzEp0E)(?<;E7>(f}6D>r=;B%hl=owUObtoa%E4%8uwzV)K{T_MH za$h8Rd>hvpVeC4oEJ5z#5rhQZg!d*X5uq`=?V$YZHSR7IpFdUVv@TslW`@VvCJV35eB77G-^n-_sr zy9>4pX2|7ri4C@GTTalM&1w^{cr$PLeMr{Ehj!djP? z{w{bE@L9h0q<{Mn`85v=nlv0+e)N7~P!gc2F?WM z4-@mG_VhcyfNdf;#IAw9qWwZ*?3Xj&2*-@EVnc|2c;ui`Vv14s^jux}VF55Ni?ul> zDT;KOxFL=uRaZ}!w#mtaeiaToJBki@Xr6;B%!2!Zn$x))kTeKwO_d@ggp`FMZ+Pe^ zN&TBet*VVG9v(cnd{v2#t=8x1@hKY3z|;hOkhJW*;{jXotZT<00Z>f=VU+gCL7ckz z0WV&74(p@Ok?Z3NT}CVtaZD+5Now|{)6)fPZ|~I>m-l^}=P?Qsi{{%u?`F3y9Rv)^ zy+sjza3C2W zF1*UNC-##K{pP^&I_kB^PCCi2y#?vXDZ}SvsP8u0x@XKt>V&On&tG?&uz?QqYfkg0 z)oQNLbBC?D^I!t@2zM(tV+_5VbNn$JVqy#T>jMe`dw7!0FjJQ2Swdt5cY1VWLS)Fq zyuk~1&ShKc_-wYd9I6AqM>bI-F+;U%*xZDtxGTUq|(8OrmIa^--)si#D3Wy~O z{~6QWI8OyAe!i%weTsGxPd-6OAriC;(w~mddrd=)fQay``j0yUpRbIs2Rwh{-HB?w zTRkqP`_mHMI;+dSFN3iO9!Vip z>NbkH;@4iL+x*JYS*MVF{6RN$@VFh`rmN%K^#OW4QdH?St*WxEAd44>+b!YCqH9TA z>A!#f9zHQ1pwH|GNvkgpCRDX&tCRHSM@#GPZ~#utDR2#Z3(9%juL@Ju@i*E)ILm zqrGL#-5uK6butPnp(Pm+V{mzw4txH9igJL@-fULgf>`~NHw?v%eb$n7&1YWQsGh(c zF1E`~P@5IOI4KObMv-}pQb5XrHJ zYHu+sUssUFq4+w)c5CcsxIa3$)VXtN*lX_Z7`PNW$QH*U27!uJUl}k6G4+?n$QhQ3DYHcw!*S#`0UF9VHEoz+rlhYS?Rl`%K^u zWwAH^F7UleVlZt)DWIhOd;J^_ut62M4J_moG=8NcOyKRyv6fmkKjLWRQ@vLnvQ)L; z;R`X^nPa_(&y=Iy!W{Y;rG8_@rLJqBuk)MbB_7d?t*T{n_{)Gaxj*ib)cXO9n?<;$AFR=*@}DsfPjlgw{M_HXKPHrate$ zK@E7(JUHm5%--jd&>dZS?*CQ~a!(FfE}GOS84Jm8m#KfS zH?mu9Ht`a|VvZ*fojo%dEi9YK_&V;r=U;j+N-QxsJXZVs{orFO_N}kf(NWk?1)Q?! z@4~XsUBMi?RyDmMH+6Zvj^$h;#H>7yL!eW2{R3&2UI72)2ejULN7rtIDNX#1*fXWV zkgDE|w%&_6or+o0seOAM>!LhWLw!W%Z@VcOA)rD`w|Fb<)#YKipCGRqQ90!^>~oPHE-6IeSy7=zw~_`*#^m z1do^9T!oI2w|2O~Wpaio@B~R^Oao8$ypCY z8}tCMv-806=s1Ts+3t$DD5-hn5S!g(-c#y{8mkU=^T*~20g7J+znDFiH{&Gs53QQA zwI|~kGdnDohCW)`NT-bR4cfU3vjs;B!`{+2ta2s)xgsgc3#5*Ww`jU8>fYyVXgIn! zUWwJqx8%z2WJL`_CLyK$#r9-=iVwVlpfND+RII@?eLkzyEf1K2{V+87`4Np@nGz9Q zJBymYB=-N%C@yv@95ul&5U3)We-VUia4wxsMMFnYsYt6{CzQ&_N3Me z)pC^0asiLBsrpacc<0-Ta{dBo&>X)q8ZJDj zE;}igg^)Aa-9xN6aRc{Rcd|>kw~U+M_GDG8LlRFMqES+@*-&Hl>DH;Sm4P(tQ$XFq zYDPe8-2#TJJegFiEMC|{S}sUqTqgRWN%I_GvH1GeJkcdQ)D4ls&LG* zs_XqJGoUP;iB7jq;a1?^e>;M?*qaKH$s&E9%S^!}J*Hd?OdR5A5GD1cnX7zcNrXAC z_R;yNku_jPTSJfK@CWX<#AEQuJDuMY!zK?d;0;46AKc9!t#fDF1Lt=cB=`gxnaH>mEquf0l^rgYB7IH z$$FpQ*w-ba5^{$-Ff}P3pPWL-NNIgA;wk*a34BWCJ}VndbGGOH?(tD6?3f(%8;K|t z#t0qP+qJ5F!;n*J;9z<nVIW5HhFAaY4Hz{nBJH+@^59VGk|S1RPEHXmIg@k8cZ3Her4-n{ zGJajtPX%C@*P0%h!1uKKw)dMe&;=~UUrggA1U|+ClE4eBrBZ+U*7AX^aNcLy^exy7 zA)$837=xowN>n}?$06Xd4R<-LMJrV3H38{YiB6{@#Jeh9*D$aN$eqn-{RwPcN&l|5d#9`sQ9an}arW$SF0mP!kxZ}OvP7SiK{I`14m4>K4{neVH% zel8jy@FkBWj!s|0Wfe=mzrJ?iBEv1WfJwU~VRpUm+^l)qHoV@R#CrvPq{2l}jh@2y zO6dI6kou?Z9Dg7mk|DI%G|#St+Rpsn^0PM$yD1g2*_$qWT>N;qHC_ep>kF`vYi!EJ zlDllox`MApi{gLGFTbHU6*QCHU7Rh`L3_?1O)i=0-@3f^rRS}-%eZt>7Li1j_-CAK zbsI9a#1IfHy+A=TQwXlKm=j*n3+PK?hKtM#3_g>nZ`h?6vXNS|-0S-KBb4B~Odcr- zZ<+n)@az==bj%McM@w?E`TxNJ`0OYtn^vp}LKi01_9YUmo>>LJfvgn16O}mArT738 zSCX@W+$$Q#8A7pqi~aeL`R5hI(|AhnIk69nxwZ$b78C2_sTbk z=V$9$KDkzjQg{DAAz@LQd0C0xox(NRfk+im$&{G_ThY9Pxs-YG344L^AjqSTaXFvn zvyKAOo$PvbOOQ}hF`@LV4 z&8kJ=eYYi1aKUmF5OJeLz5^lnYSet){(&0*0`p?I|&>e46$d)?SHA2zSQo{Y9Y zM$HuAcTju~JqOs;i;|dzw_eF`y;zn>pi4b|j?G`t9O-(7WnJsk1ebsTgzRIDZp~=$m z14joaPzPh(?iaayrN#tP5xa9P5H~OaaFjZE?>*2TB0}UI99$rwk$QueDH5u6($;-@ zp3(&9W4p?v`8sP+Oq7q-U5gU9nS*%UURz2?V}S!7R5M9{`_+E zw$>bl#yu~Q;BqNB%n@=|HJwf3u@XdvE`8H*)eNfbbmm1wXICDP-W_h}zpL zz_ysAtB3a@geCJ_i3opBOH?S;SsT53kJ-t6voTGpUS7U{PV&iLe75_$sSI;iQk9D@ z|A^82@rCL1nzvY1peRXkjx>ZcD$oX>eP-Lb)C9`qu2J=;UBEa>KI&U#+^?4ik0E+Q z+0GL;XXMq3G%!*iC--`~I?ws}B^bbeMI8GfmVP|!S!`@<3Bbp}fKGKs-?ri;4GAp^ zX0%u}_WLPSI<4uHXXdEdmd*>N@U zEmZ8@*B&T>ScCuel2AuDuH?sm)R4y`;!gGF9* z>+0u^ryJN3xGyAMuG~zjsyT>$KzbBwN|5^t)ac&_Zz)aOb!H1Ho%w6AB+q^+-R+9G zUmo9Z9ZDv>f4RGDEk$u>cq`(nm-Q3C#nT2{08RoRTgGXNNqJ~t^T)sY)p4s7hIVy* zo+!Mju)kwpa8B+k=;P9JtaeEo-TpIc1|}_^po30kdEThwVXMP*nFBk!x(AY%R}LJ2mx3=qBi6yd%%X z$LLUR&P3zyFtO2GcI>dK!BbtkC67cDJ7G+qeqZe(w&e@@8TLheN@8EPeen-f)4wcb z4_7+Yng6`|eaIbXqttZQY4f{P&nj|jYtlDGeO0A?e|k*)(aEzM6r`A$NJj?jEz}`N zOH2PCMG?xAV{$%I0{l?j3|*j`I~w#>Q~(rJ+R*U&@@}tJ3-tB%7&+)uLJ7Gt>-6BOrFF>)qcAtJx zl;}q2E9C2XaaHfE=L)84=Il=idG3l0V8HP&+MNUYk_Qe@FE_x2eY_r-IgA`mgdR(4@9%Usrr@x@Ae^cDwu#F)hsZ#o1$3&0BM$`UUkBAV-+|kiJ?4 z@shd=*?K$Z0IaUAQ&4;aI&GK}*b_*ZPucK?|Giv7SwruWzov{Y@i{#eiPYO7u!v7u z6QoOK_azTy3-x!lRO8tW*yN~L^@9+SCmNb5ZW07Cty+z%lI)Pp>zAK{7CU`x&`|i7 zqPX{7sWA+(HbMNNCm80E0xobQwm>JyU4F7^S>N-7e)GN&YMwhqv!Fl)CN-n!jc zawW^j#{>6AmRM<8`^^p!8F^)zB6XD*>KYy~BEu<)<7LyZF<__twothDFOj#^Xmxk@ zLk2g4o7mqI>OK2sYJksb1}_rb8PC;n(y83BPVv4bj{eEd`tvLPV+g{xj&+ZZyV(>J zha86kP@HXLc)YnH6G!5ErW>Q$r-I)q6-q8QAyicTn-=W#f&+OhMAuFEDrz{9H4%ub z(~HCwDorU{TSWwXu0B&!=C{?RxK(rRv$$0^=EK?%5fPuIr1Y-~;zx2H>JD!4OBm-ZIn+$&D+8`H2jJhZRdP?N*`W|}+qdZc*4;c%cfC6QPTuRXb%=(6 zi`%XaS#avOPRX~ygHwqZ?5{HGteojapG{m0gQuIRLUQX@HpNE$wV!Fx2NN}74z|VL zzIEF+!rJtZlPpy=NF|S}Q>UcNw%@>Xt|kdT8|r=8nCW!y1udbz!pFY9B$wY1g8_}M zqT~~Y4pMoFxT-znc4(tp{7R|otLrdsw^Q4NFs-$tmtc|r%%xp|s!2e|zA&H&+bv{w zUZVtTJ65&!Asy@1KdqNw^kwh5(TLrTK9Z|52K@aCNX^hd$pf4m5=W8h9++HbFS?5J zu(NL~R9c6AY3)r{CARvZ{X|b~18!ov#swY=3ro#mKZHP(w=d`PzIUnm=|*2;X!#k- z$;l}m-RbY`vMoHU*6+pG04UuLLMcvbmS{rmDw|O|b{lFa=Aqje-`(}u`tNP#={gH= z01dJ6pMsaMA*8gl1mB8uJ>zfXMlLd_{r zb~P;&mKaXW=6pO?jvBBNf_Mr7h|Fve5LXhE%XSJNhp`$N27^S^YV_99>m!9G$W~V8 zn;8MY{-osDG-O%rzX+znR0`jj54}loUeO#mdQi91rG>h~)nk#=T({)+9A04yH?O6o zi-oI7X3co+Ze?B1`(qza#Av;ZB83VVuU?7i>S6*&7Olz&t5N5u^5r=!b#OGYDBg%J zuXEeQH)yk)>0DHwG(Q6gGfiZh4=K#t91Gyx0kk%~*>s7PHELV)^G_TP;&H0)CYr`# zR=2m?fsg?b+@)-1mKvf^_|?C6Jz~P~WlukE_r6C%G?*7d_+h9#OVzim`?2yV*jpb% z_)=?T4*95A^PS8uxvCZQcOq4%M^H(F;S&h()5k~q7S_=I;%}CamEF{ZOP{@`&r zEHdYI$lFFi#^~Pi6x;QR3h3Ax2=zrNgPk` z&_l;?m{Dt*C!NM+vr6?V0uvUR9ff5?o#s`?+ZnNx)V$+GJDhqax?mdCl7qmtVGAFo z(tN(h)BSF1GUw2Of5-V8_6-GvAJkoj*Xz1+f0omA3td!H)UIc)!2zufa_}Tgzz-D| zuh%dQ8VopI4`_y$;D9>amP-VH3W+H_*%3V2(Ntu1TG1t!PLj~jAkx#*<47JL@BNxD zuSC1Cco0^ga8|o>2D5%hC9?R}K7x%kWTr3`2AqWZ!o~)HgGa3F( z)1QQ>Rj5Foit-^1v(4z7T$SIh@bqCb^JY3{+Ku*fKO}1d7(o@z8b2*2bQ4=O}jjV0=<$=)+%P3NoWghI51fm*J$U!`mHfkEe-%;ejkluxW9%41!Znd zLU*TE6LajiY_^o{jg4EjTvvBw502*>-L}srFaQk>i{jv*EKRplz5N?ahU*BjMY@j3 zPQULhuo@ogl49cG360RQxM5?DI-H^E8m+2Xm}ii=JBLtW>D5&yV&?6@?!I_8UhMp6 zV4B8?ibuEO7~RMh8SaQOOEQGcc{k%k%U*s;3OeawswAHJG?6EfB<1&1@IlE1q;kA5 za!RM%zlqmL@X3xc->ih4P7}6ncRwFDW_^+j`(g|8LuV+VNo*KCGq&gN-#ZK92M2a8 zjDUxA%;^q{g@cG9{vql=4aBPFgM`cwJt7Y|_z9#aelJRX*^_17YmW!O9LJ+Ww66*Z zJ*tO|$`&>A=9y`KJbjuG9INZf81yV6*P~-%UZSIaxvACZl){Y09A&Mgxp#L5iX^^g zkH2{L$7gOX5_yaN&%gzs)_jo8w4!G3jfF?oUcN!*u%RP#A1xp-m`lfP(6^RODi{f8 z3>k^eBOWK?+2p|X@fg;A-KI?gnxtRy*&aBE!2n~LEKth*iS_gCe^qw5Q)`pDm@ZCqaPNh)Dy} z&Yp|ji)hHe3OSNo>ggL2=1i#*+;0m8r*ZD<(GO~}bcc4dvs-L+io%Zm>Qzh7Anzcr z!(vEkF+ZN>CWArxg{vjPj<95Kn$le^OZ;bE>$t&9 zkLRoyD17%@7_N;=HW87NlT`Sp1a5JZ(| z6+j85eMC?E378bmDJ^}KnHK@P{dmk|jVw@&hf?F+4a$Q6#g@1C4~=&t6_V9tVVJ(A zqn{UtBm^DvsNpv^r-QM*#i20dupT4Q$@4}z$|PROTmPq%Oo?LnU|{^6+&{|&sVeKAiC7wH*sryKiy zVp6>=k+YF-P!$6mgRzzLsQ}f@F$A)iC=^tEv*5Br2en%_cD~qa26i`|#SRhd`?6*j z|3?6umCA{{gGY-gMLE5)z2MstD1-6I~jnA4NJ7_&3VArV|<}OA_ zc1*PT&K!l5fsS5pynkW5tzy{y8N6Sm7$><17WfyJ#S27$Zcy(r@q25EYALCgbJ4@` z`JWluYBjn;N9`)rC;o@rp-TgsF-j;01Sp>U6DP#x^sz|0%BGVI4#niLVFcW@1G~}r ziY3&>}&6$8BGa%+YO5XWH|6iqt1SmpE+K zhRC8_H(bfmcIPC-vz2dgJp`$9oe-B+Y~H$8KR^suR_wUE^6f?|4C~b4+0ZAl@Dc7h zV02Wn=(%MkDjgF?5o{mo61P|NC)d3k$$%p_wffDC=F$4CI8)IHa{WUh0PrL7@pSTZ zQXd#Jj-OyB#xKmTe5H=sEceLi?Jm08y>hy1Df?ab@YVYyPv0?&s~VB>5_jhR zr|`n{Zv_UtkANQ>R5i4b0dP_EL+j z>Hbp_d-=a>1dr=CD=9CS?-~@)g3zKX;GYsH$^RadDstMt-PqjWoJm!J>Fmejh4CYw zK4MmZMEj%VF?FhDXC&QB?eoEu*u$Nzh(5!rfYpFMhc|%nZr6LZpFvUHt|BC=oSuaF z_?V|3{>AZv=(J_s`m2n>=dA6P5Ck(8`7bgGV?`9gm=6M}j>;u_3gSfTVU-&o|o zIZOfAW5yTCfnIlYdK^70G628WG)sN>I{K&oUKQ!DXT{R`o7G>+-13z1+9uVvMI@l*hHI zNqS}a_}oZ>|GPuay0wfEbq?4bg-oIR(aiBJm84*ME6oB%JaBuYKH%l zCk8z&8#8tyE)07JDtpEAEHPiPyie(J>AywAxc?tGb-#K3ywu~0%8CE?V{wH<+9t5I0jJ}%gc8mIqD}FEh)2Qx`=6T6OaXj(x9+>V?9LM-0YBtcT_)DLV34~~Fz`$N z|GztCCVzAsY+LKFtFhTYR5H(*@>9ytP-))X`b)<>NGBhd#*XCRnOz;T@$QWFsoogIwBgDCtubE0}2UnVoR zI_@y`?r#|bpZHf%#z+cjGleV0Vf8D$bws|~OE~1`(nWRps2~ARuW{aB-J7pVWM7Q$ z&8z1zuRXx7Z*Wt(-G2wjBB~D(cDL{d1wc09T6N|UoGoTvbF9GAQ15tt4m~<$;Ahqw zkpsm-M&mZh43at~Na5twU_Ml9G)D4YWAyK~`0E>%JuRO%Cm~toIQCwB^4VYf4eR-f zBL0FZ`@3RNisA>Uz@r^>_AbpAoP=c)>bRY7fiqV7V+s>rpaHI!&#te?KxyLE`3Xpq zS0bgMLBg5jjC=@|jL_aIL1AI5n?jG}tzo$d3#FjMMEv2e>eJ!%Ddnr%1!{Ll?d@b| zhuoem8SlzfP!JFTqGF;?dVgb$82=w>;*OaqUoJ%P2IISMie*KZ&ud>TejfzG#l>X< z=aUN`!VY+c0WB{W>Fk#XP*hNuxUZ}J^)y+^Po)rmtB^8FR;tb=qCso0zM%nzBf>cj zgOkGlMbJ{d1vc!`?rxY^)(Xh!(U=xIvx}jLRC@b}1OaZl=4ec$&5T z?<@59WNokSPJ)*tg925D?KSYfEaFStKOr^2rF4e@s4tb#&< z)}!a_52rkqnjxta#^8mkc^4`UHDITD@PC6*wCEz#*g2_?Z68GLFtSb)?9jZaJUA`$Z%tll|k<=V<=< z{PYvu+kcmoR7L#87{#~(FIolx5lbu!+47$;06xxSdeC78*qXZeAM@rWvp4(*HUIo3 z!;H$(W^`pE`(yeSv47C|^l3Y&Fw~&d570BQy#eFKt;Q8Fh5SlC{%fnvK zXK90n?e@R;oc<+a+}O&-rWFjCR?VtbxNf^Y6rsQ)8rp%djGeuZH1!`h@e0uwHhF+B zqyr^3|J?bLIGW)<8Y7rLYB)D!Z1?J)Wd(h`F)OpiAt8N z*Z+PE7AAi9&zhhHhefNuxu7ti9+YIr=vZH@s0UC@_c{hR>q^)Rs>*D33Zj$CT(INf zd;%%SUig2P`EDzAdk=G14{L3;;y!SAbH2iQ$hjGC$}`AW2XPs6OM$|$vQ~sKq4+)h zkJlsa@4U{-ew5RtMSaz1-=SD`4%{z;X?kfPe+Fe|XJtFAPiE=XT2 zJw_z|e%b*(CA*|;YZ55>f4uy0&1D))Igb}rTa$Rv$N%2u#W81BmC%d23fztv&d%xg zhfyPoT^5_4^Z&h~b-7uuzAF#0UY*5M_}fcoCnjiTjZ@DlAgP$EH&0yM^)TLE5mIZi z#;t-MaIC3YUfb&O;)je>+L>gn0@82K;#dkBgZ>^?{>?gvJo&O8$d6CyI>EwE`qf+( zX6*M!92Lpr+Mi+s81As5s0o}ExNa7LN2x;jQEzKvg;DTN+6KeKV~fJWqdWsj7|(Ym z^!k6xgJI(D7&%hwRD)YvhJesAz(2SrmW!K{>tr-x95C*xaeaBX)fM&N6GM4yVirmj z0?+m)6|4E1V&6(wR$DIC^O zLx112r_P7qkK{it|C6g08}uF@(Ck0R)p8dbX|uoAhDZP&Z6)H|iAPQC$kt~4I=WXP zg=4wFXr|m)Qd|2KzWW_(Z{z6%+gy!9?8$o1v1GA^*v%QrS&gnvNKPUR5j}kppIt-; zHg@10{$ye6WG@DwNo=nKM^Rbtb!p8Jajb4{1ny@A0bX0B5@`P!5y=m<)!Xe+9&5Yi zyJZ1-9zX}e1$SP&KzovPHhzSlp_~Gc{QfA+J%`+~K zZG!==>{;)>azA=S9XFBo&FlLmymOiUtZw}+(dX5NeO(CxoZV%#vw@gY5qh%=$=oG> z4BIO3*+J>Hqow8hTW|Q682GKVDERW!`63YWz63_^u3XA{F1LhVYq|++l}k5PtKdB7 z^(y}RE;jY;ku1l19#0oYQt7;f!QlsRJo>|7^PSQua;AqfHOx|wyxNOi z-k8kq)4cUu$b+FNs}$1K12YM*&k%<)UD)rZ>T#i-FdDv1uzyS4T=WN%LJqk4AswVaCc_RDPOa&4OKHHkp5|Wf|V_u!rIUbo9=H}S; z=-JM6vk=qK=hr$F_Bq4A;*VAg~A%ERdRsEkA6vR zEng)p-bk;Q=$B#-!}5DRX83M{@h*pNgyTVdFSYaX@=9DfFVwKk zEmBo-FEmPuh>J(V4S8QfMAX%jx0wyJ4wqo!KWfg3<805DiBvu@{$9 zL<$vOP{F>uls5&97<;yoMF#zvuPx$!hC3=n-5XPO@hZg6%s zc@Q?;a-dlUY>1JO5%Sh#7??3EvAeOyjeA&97jr-Kq#Gc0f}7#MiBt!nQXkEJD;9T5 zG3rFY4haQew`YK}KX@EHG@d^HTBl$JS_x8W zYRJ6`1;5mHCs>R|e4=|}Y>r2SR9H-;9344qaBe9x#dFt|;zOpml1MMJ_=V1pIqv=7 zeb02I_#SMx>-5Oz=yZ%EOsy^g2{?tT$Z@_%QuSeP>up4~t37cBuV(rr)=wmQW7dVf zrMz&I5&pXI$x9#@m;tVoL%=+$|vy?2LoALaTE? zJVj6zybQK-|t%9I-NKuM8i^i3ep451_3rI~YlATNea z=SM%aMxF{g1SLkw1Ug`~eWE8EO7zV0blxQ}wMxCD;kTmzhs821ILS?FH>Pk3x|zz7 zn|l1bOu$8aXRJul^7DI16(_x5LoG4vYXGzE2~N^LSEY=)JsWs-8U(H{w{#%by4 z%|*O*PPbF4!m(eJkHkG-8u9BfQBY8l<}E}s|FIBN#{Dz2vp-O9GcY~rRajQLR}fY^ znYC^mvj$;{HJcP_3Sd>9IpRW@dN1OpUbC>WG8U^R!lMyW?*|11k?`@QWK2sSod`!$ zM?dio_LrFFMzJxR9)Dr0S$und^oV1Yxi1^LpvX$OsePjbXh9 z!kgspTyd{)S68nnclmhLal;>9i#G|-bBy}Ky@E>zL0wW{P&&G%K9|tFee0#u$?R^g z?{bF+xX)hW;mOoHTJ4N6ibzU^czSLIu2z}Oc7)k%$dn2S6VVqH?JYKi5qCg6^YW-1 z4(D~w2l;!uUOBO444Tfc?|aulcq<81l6H@cM|2;ZNn2YR3;?OWO}V2An7-Zi~)A|?7Gu9xG(e0xOnOIy=Ryhsa|?ODK7|l;`A0}n{t?@fS$fM{&-^W z@>2ygb!aNzUy)c10;{6JNfeuq@cXjr=g*Rr#cLtGou@w?ylbWPKU4)cUh(Q~{I-x6 zi=_W(_!y)V&1mR!rG1Qxi~I9!cm-{s^DuxIWoI(SsZ2lcTS-a^Q8bPGJHXFdU0qGk z)6@f5?O-%&d78zU{DjMH?}PXC`SJPrIxvc2H`H!-6(hU$g(`4M7hSxw);v7K!+*5k zY|HJe)zH7n1L8;+OlrB$Ms-kT596`i(8N0K&`^g`NfSdu|B|0CrBiu(OC%rG^mZZp zDvR9{oL_x+bFn`3lLVaDhU(_#mXVQ(fP}O#)UD|3tQEe;=yVU=SYndT?}81vl4 zme7YA3eua;PHR~le(2rk=Pb7%4y&*KqNv!}))wb;`IKBT`L_%oAc#m;=uaq6srjB? zSxHJpHe7Eci;RrS;dp5ox;;^}_<_*ICV|bUul;n>(gyP8Eu+^+me|)SDMEl_xUw6~ zrrqwNmixAtGGAR=^R?#}=KgF&>*AuOQRrsXU5OJCI1WXBE^c_NK-t^V69$-ODihReM zIh)ym&?}pbp+Z%~35(lxV)&Ma`07~iau03@jIn2mWd%EpizP;77=#feUGEn2td}?r zYd=RL5cEaF8X6mG+it{wVZ$+XTw3|0ZewGv+4S*m(B>E;XbyJE=D@_Ux{-5naS?Ep zCZ28M45A?>So6a{TpW}NtSF^&Kt^Q@?G0e8)uT~h>Mzv7NQ1I2$yJrP*O7ELdtrbbYAvG>#KF>{U1#iBQkyDwob zRG$7Gaw-kYcXIWHbHcvDjE$Q#YFJ#*M4B0u_sA(sR0>)5LqUP*)ck z>6TjY5eH3s8+NL&sqiBfLvM^8Cc;;cUSeRJhmClAf#CvvXwoUgr5s;0=(+mP&`_7` z0`M_vCH&1-CO26QzL)Tm-`w4DAL`6)9F#dnX0Sj(O6eMu?jE{CKx*h5V2~Pe1{h#~0p`Br=llKr@BQDku4}na;+(@d@7eFO zpXb?oAJ;F^{3WbOui%I4uycD9N(pIP;Vi$J?;CRc-G@n^2Zu{Mm;|x0E-p*oi zW2(CigAxGjgX2J@I%9HFnRj&q1p`YC;WhO)M2H^c6 z<5GqH>P?LB1a6{@9;9!!4yN0>Rc(Jx2({j)DF#vC7mr>wo z9(Q8J_V>Rl;4ws@=7fa1KQb~tMMNCV9~F4?X!#TR1VP0r4t;vEVzX|7o!in)m9lWZ zb+a4XUYS8urXKF- zR)igD5331S5HZ3y)rg?bI~QnW^mSS3`8;+WAyOrZa!ZistQ`<(-@W?NLe0U>*J8{P zvEYi5<7t1pm&gZbPd%4j8+LXsi)_K&i~T+>Z1sbC)KvR)^+GcKDuOdz4;of>IP zLqSh2KyXu4lVy%qs+|nlMh_*xNvEr-%@?McoB3_V;hbQ7fQ!gMRij+@<}bASq)7O@ zTkcC@jji_Fv%{cj+srAvoQ$fobjr+h*W7mpp8Ge7)uLCT(3SZkhmpq6)^bBpNWMmK zWSlEoyXizEwR`54)DQ8UV?7B}I{oXYB#dk7bYNow@E^knCfM?)*l&zHX#+w)j zuC&HuA*tKkw>NiC2PXU;H&Y+#c52&xImyP#vRE#wXK0K)Ah=)i55S@Zq78S&>K zj`Swfmzl>72{;aY07u@Kh6^Y(5~mx(R3Gwn>=sfFgYU2aWCjGx;)pVry|%FC4+Gyf zT~^;WHChlm1QQKNdPqj`#Hsf#ozu*GS%_c6ctKA9%N=fm-)k_foq<(`Nb%|0>H$|7 zgo1j&?zFh}j?hMyA`{4{WmD}t|tlm~!?Y?ain(bx!jhz37jhWwIzL*Pjg;9>yiH~^bAXbnZfqMZ7! z_nu3hTGp#qukJm1bRM82HqE1?n2~YF7doC4TXp7)tSr)YRp#PymzJ8xrUkMaw#Mhu z9pkWG1A@;HezU+kH7zaT?b|beC4k&J9%ZK)a|YPUX?f&k*Da8X6&u!XfszfdH?s|` zt*!AoW9R@nkyB8Rl9dfv8_nl2KjL?qt-FwT29YLynuhriQ+BD*Z(l7BtEp5VpIV?% zTqq;~@GPjdfPB6A?Nk-k>^S(&CtG&5jKqyLPtJZb_ak!0-lgecWef@e)9(W?L<9 zL(8ijW@KQqjW#p+B+sj=0~SoUBLx~!=hUnwkb5vcdHjjgrz)UR*+1=IeslAESu~Gi ziP6XBssY6YRZP1}3U*p0%KZ#8ApQ7L&&Yf{6VKcM^5CC+ec|a**Xgj+U1b3rG*8pL zw{K221SHqg2yM{Ql{%o(Ci$#y-niY>bdGFrc$l3v4e*?W#sjHdd?M2P&%P$1aN)`wi@~8RK+MrW)Q2BVq=>)wDVmBp z{FU`l`XNSGn8#|`E7U!r+Ie_zh<6;~4p!#&_IB&x_baBR+|)e&cSrLz&dmJ=jb~E@ zVSv7JnAs&eI+CV-YVmm33eo#D^85GuU`)lCmcu_%N4uLLATxlb3Mn7DF0G7Jg*|`- zY;D~z1B0vf@RH#7H5qnpHk)h`XHtks*RL)nh54^c3TNM(EGu=WB>a;Y*10)dMH|$F z@_!!}cZb_Jn8*9z379SjUQj+qy{hh=^E8-V26rKqStB93@Z#sxWl z{`{MbUvdo%4ZsEQ_f0~jiLb1#s&+Pb#)*CVW?b=R+o6F$(h6LKTAjNsTMT>71S(ro z0dkX)Qn%XWA%&rVPJ_vPO*ZZBs(+U$Qpa;Hds94s`_ zZvwNu);y)+ z)Op5gP6>BHW%KtTK#&E~B$+^L0&VuL1bvoc^~BEf3@x#{Ix?ycmn*^qz5y08)Uhr2 zstibyrNiPLXFmsTrTMewK(HN!)+;N6aTLh_OS3hNlsSw?WM*3IV@~*xu63U4FW%Vv z(|EM2nqM#7CIjNa!sdb$7#NeQmUlBPk`c@dG5=}Y_&}IdZguLhVI9A+@=ajI@b?+X zy7V_c16VC1H`hiwD6H4STv3tZ<7KLg>4wR08yg!7pLe`-?QUPbd~xlQe8eAf&9DwM zP&WW&MnxJxr?szk1%NxQgt1F~b=7n)E>wYY!`Q;Xn89>}CD;K|p3*eR!s!0#)6%%HA@9U$j*V@8W4APcfe>NY{G6*zjg2LjGQcUqrzi^ zUG}GiV~-@bZE0u4uTL6M33I-9?D$uy{GR_I z^FtxF;+3}l*kirQe;||{k=8#Cw&h{cM$Lh#_Q244U%uo@<8A(446C71(T1cE_1zWr z(-UT)!WiWRtUD6!ko~;T_ZH&n4{JR2S`J9uU5>qbdwWS?@pgB7Cjd0dy~+KKqN11Y za3ts!pSgJPqV7(YQ}NX3hz zR_{V3mNeds*nr*K!-xjC$?{l-?F1P&fAsBQE76jCxObNqGS<{=h7sBo| z3mWR^Bn;VWcJ3~Ird%1A{R+ajdit|7Bcr2(BO|@8MxYy?@IH0RYyg2;-1pWUa=x@s z%wQuJadsUkT3n>!W<;m!6CaJLG!vadow#-kiQS%bLsN@*UvKo?|6vur7QZPQ@eBvtYCN{OQx&zN6@aA3wl$dM%@u_4#b9 zew3u}p#a$3UW=7oGjVVzR145lN*)(!UY8<>i2@P85;s<~i<$g(<6$r#fH$B4;o(v> zN&_Jk%Oh?zV$%dHfSt1v$F)$&epoY!mLYfMY`9CsNP+d=hNK%;+Qji6@M6HZf@n%=H9yQzNnDU**V6ol=AHCO6T#o%*;po zo06{-9j>AxX%)im^yR%S7V9@|0A)|l{^ya6zW!EIaowlU>CqO+v-;2Wpg~n*N7VE8 zPk4B`_TmSW9D2#%=SRuF5CJx5^TI+QpEV7*$D2Pd1V8 z<(*jeP)OS7?;9^=treNnFa=+vd%<3K`|U#b`j};x^Jw>NI$_^0pnGwJ7b?(crY87v zG*6v~2t*7=k!}~;tx;l>`u#mw8TcXuOr3c3ap(5IW~5~KqOGIbTN295$dCdnbY-T3 zh0CcJ@O2UM?c}wdCl`;7s9WVa>%9{B9ceV#G=KPw7c)+$0m#7$_7zQbZL5{J=hL-r z@nAT4KxHMEzN=n~aDKNWy%+YnQBMF+FWz8GGa3GnkRs%9S=5irX~L+r@WsbSiELW_ z+>oRs8cJrRpIBR&mMV~$$*Tm3ii+}i&p~MTb32!-=Zhzm`ghQ+=iFCJx;}lEV%5yQ z1t1{8&A7g%W+>NGY8jE#9;#Vz3%M?stK#a)3m-2Is9c{VCQ1s}X>|6@(93piP(7J0 z4-h>e>}7eZYiZ;ePmA-l1F)PT z4h1cUk4(+fLQ|3Oo0PO+5%8x|Q&V(8?w4hcM~ax|Ee{Wmu|mWCI7fZS z+p{MLD1^MKbuP<#;-RM6JgAaK{fP7O;FZqo}av4TeJ*fq2BstTtUL z)E-95`{wt+mu*kN9gz5C4UOMET<@ip*3%Xg1cjrY;hxVi(~V?7KATg=$HOY58nEcL zpXneH7(WQR{?YmR|xi}uT4^u{Yi z#Y~Isn=5N;W%m6}$H&JpJHCsnVE&(2U7g4+4xOlhcy3|O`Sa|7-T%-qO8CY|E8JQ5 zvnmIoJdo<1D=35k=_&w%|=HQVLjkD*@CDxmqxe*=B$XS%{F?)b?77N?}TKof` zAvRpSqRz2@@IBxZu3hpV*SG}8>EviYLpV0YNiTj$Al$6yA23)?*eSN=y!H+#H zA5rl6Th9FQvhw;^Q7H}2J9%ShpARjqOe8&CwZz9h`3i?Y!-p;HlF~|t&eHquZBcN* zfz!Nf5|AjKm@+dlc?O<>A8{H#E2dp^nAoRZ4ahsC5(e?R6U~xJH2P6d2l#jffH@!V z@?PfTk^?H1vpzE5gu^_Z?nURTUIz+@PkuFKB!J7uEBkH>z#!wioX=T?M-A z(xDsF_AkA;i1hpT^JAF2)a7kPTpJz*JdG~{2@4cJ2#}@$ zbX8zi`t<3azclK>J)+IE6+l$z@+*B(c~va@mx8_jE5`)nb0E$B0a96w60Puuoe_U^ zz=L~?bU|^?60XD2z+E%&`%h%^AD{U74(Pbo85#S*xSRx0=O+G8l40S2+p{a%7ovs# zx{IPw*xMG@Z2pqD#5kxWII;U@-7DM9U+w?8Oa48W|22Lb`+}2W@L;~G7Z71%;Pu|Z z<+v4jTc3X~?%%BBAd-*{ad*P?kNtn9m!R|C0cZW6Q~b;S0!NM;L@)Njz}3(@WG34s zS_WQX852f2C68&BQ?1@avR=jTFohfs*O+;|)6{1HYhkBEptp9|`Z1tw`t+)LfmLal zbE3+etVg@pq_fzN_v*3`W=iVQn~2N=Sd_8t}%|;W6#NyeZ^6(bCG`SBz--a^LpNB%w2BXgu^#guhESI;JK)B`Bxac$u&T*J z@Fj)#H~pCy8r>eq%n~lIzDC zir0H}E;Uh-{@c}aD%ej5zk)`%o^)HbuY;rg0R%1}&3>y(FeWK4GVT$(KfAAw#a_PM zE97@d2U7WL-3lvggQ}}(Yow%^+icP^;EJOYJKvI`Tk)m|{W2X2>Gy}dS!p>Vodi}l zV0GUUDJ73#2QDX}oJvU+y{0pDmh7Zw;xsKZ2HsJ$3QV=YN-2xCkQSa8SBhX{wi1mw zcCMwv7;26#o_Q%NOL_Ztdx3UIrut47r>N*Y23c|t_UY5TCql1mkpXBjq8+`tnHeDU zABc#^h+O3@348V6LB=g)3LX6+ykF2qndQ_li5N>sJy0Ua-DbpV+ifA@xze(AU#b>d z(-046cd(GxENMSp(uqRB{z!%Jm>yG1H$!0{Oq-?~f2gTB-@Xmp8H*sx?M;=8{K_Q1 zb5es%cxub*>FFtd=!B|$?@ZV=U5UD{2ot6ZT2;?ct$A}lB2@^{a(a?@&~_ey)Nwo7 zpw<&`?rJ%6?w_mvtttiDJ&*s@fF96-=l_tG_v>8LYZ?KYEvPZ73>Cng8b=|br?*qf z8Sqs-wcZ_DygT)ON(Y0E`_6fq85g@)VV);>u1if10NGfEiqxKJvf30`jq-P2?$t%4 z2p0eghav5}`GQUZ06#7PzWCGeHShMZIG{-k={g%yIvZ1gO?qIQI|=PRkBV10v!X(T z)&Z&h&zuQGP(c`bIE_HBtD=EFonf7aW`l&sh7b^2+&3p5BE=Tw=c)M}9s~FT;kO_9 zz?*GZPKVxJxnTs@l+sg_CERZCo%LzIkROJQC4z2AdhQC?I0|Z31stb7+~L%d|BpWU ziEgA=H>`7Z_CUht1*inK1!6#aiGk_{3cNt!oHQi-4JcbFfV<@6<$tbko8RHo4XqCe znV&EgbV|2fV7|qcDQjWzNH&5Vh@eV&4Q@FqlvGqbnn?Srj3O~+?N=wDbN9mHIn4p? zzDmviX(+1)SWaYKz50iRcoat7e4HQC^lI=Yzw@Ms%2HDg@Jq>r(>?#VvqZ`yE?v3= zr_lYwcXl!69E(J0;{|SKHb+$lv&p*0tE@8VAgE9 z(@b4%Uf!SerAt6}hVlfAaqRBy>Qq|^0F5{2&7T*)Iy)DZF^C^o3b*a|NaQLITzH{> z9t2-wcv!kT}VA-M3VZ(KYqw@UvU*ZNU;tXn8nKe6v{2QdKgRw^W+`HgC^ zk(|@Di^a9Oys>p*mKn7_o$|;x@pDx&Vf6C`&=LbD9op>hIpapKQdd zfYQ7SSN%k=uMF>4Y82>^i;EkAWbD$_s}?gI#x>rnH%Y$7V=oj=Q&*j&K8J;Mc6KHM zIFl!aAPF!(K3>Vy%DN1;TTn)5=C(cW*I9E?lpMpMdiL3%*05FYA~0k`9Tu#dgJQC* z!f9-5ZEu{efvG2{^JtHCRH*cbC1OKYBTwTJh+3c^W1`B78(@?8EHNo5sR#zKXFxax z+VATa;c2^D;6=%{k4IG6ji&))LM+x9@Ujj%)o~;$DZNBRPmiWQ?XbdWK_-h}>EueI zGHl(aRw)gT&A~p>`LS-p`Olv}dy5D5&S&++V5%e$iBj>1)F&KTUp{;|j}Z~(@!b&0 zDqrqP1(nosF;6&vDS!@s9D7M(E@x5U^gUotqXz0?Y)5xz`r6?&AOZbp z3s$YuUvhWPG>h>AGotX}(&tk7qxo4HV}N~B?QIFl=F|%uarug@l5p&{Akhb-k|pLn z@Mf&``uMRT9%HyVTTuPu#7Y?^-_Ib<>SXf@3{w_#MllO$9uj$g=~LZ+YN0bc!#eT{ z_jaIOQwr$X0dmPyhQgf3|aLYxbSR~ zghrm)?e!~9A$MtMRkPix(+(w6>5KtSrKYZCc|MeanS!4LE9RRW04sO*?%g*a>;ZJU zrBpKOKU`oPN6~$Bbo7Nr_^clpS(Pzj6nu8DEYUXSsDoh`GBg zktohsezSp~w_sISvR21@<^fUjjhoxU$B)i;ih8Yp4X?tg_Z}}>XtOemnN>J3JDl?X z%n<;lhC>o%ARf{XLx7KWmGH3XegzjX&p4;jDB=MOwwHRSxUF_}S3?)_wTcxFOPWYY z*8?NzflN8dI`_2?Fc{;y;OS1}TDo0bqo|je>EI`OL8rOR&G3&OFGyXac)IJb zKJ({&_cmHb?Z?4oNg1Ppfb|a4?ItyxqgC;|Y{4EKo6BJlqyKijXm^hM`Z3^efC( zZ|YT7_m+`&$MJwU<_Tf(CC_|CfFZ^Lc$4VF15>uPwwfg)5vlJ%{){dvxzZ40?{_3{rD?5qQ-j1tDu+%+4=eF*N5U%Q9j%G^Ref`u(T@9WELS5^r4Lz=Rj$1mRgoP*l*PGxGJoB z!I{4UGnL!U2rF9*w+eW$6F^hf%IIX97iNS|4oqiLQ4HTfGQTW{tQno{>dnk z+1~mi)$xU(oK?2Nb8etEwZxLJ4|fT+m&S-QB3`Ye)|Iz zeiVAu4tckNFryV@c6N5h9!LBakGj{t2dsDyiX(ZHcU+Bo`#$|?yDKmh8WnYYpHb-5 z+jkdi27d^*?}pvDv(Jm<2e*awbvi`6&TApEFL|5dpE=DMJM}UDe3yr=aRBC5sT}LW zz@*0?+1VZYefp+26jIb{E%R1TVCwPFOz79Nw9{F^!2F{C9CI)^eRovr`%9O|pUcW7 zOX5%R9)k@c-Wa9p@ZhMZw)w+v9Pv8SKcwo2PsCC%73t=kJH-c4n9YUo+FGBu1&~6O zRy87GsG($5+><)yTHoKzdkkAC0WmfcUyWje_oa%{7Tjp7ShNO&(u^Oz-2L!!JNzNp zenxRIVmGnkmP+s1>Z+;V>I0zk{^o(C#=D|O&Pupr39Dm0+C=3-#btRUkWEO&(vS$c zx4k)vj=(*k?1+OJkZBGH*o|Dj5+*b4=BftD-|3uD*%?_(>%hSD;_z~2c6PZX5CmZV z_#;yi`G8%SY>bNQ3E0*l2z}%ei@AFs;tTn1)XY!7i}cl-jl_ZcN-g4=X+}t9xyqt+ z@O(9ImL*VyT5JPbN33%>mn!OMQ5kz1>ACS6E&&W^F-BCZY9E{l{!+k&E)=+vY3BF+ z!N*mcBNTMSzKtv|z}15jy{?e)fSi5*E+(R{XrnAcR<(QL16T^B4(;6>KGxc&rT3*Y zFk#h9Of17WP-y!wJ~H^KX=?-HDhjVJ4H2n6qM=Q^4%Fa{TDJ<$wt<1`fYymC>GkEx z|55>Pjarr~6S(e}?4Og(UKDr2X_ma5WFzUVcYb|-l#^+J)b8pkS>1CqZm$gq4(4$? z(nu0;eAoE?+&5;$bRc$ZOgGA^0+%_(f#r$s#eHl%6XYbj*U7N%?=so`zIH;MZa(fL zU(&~xpbD%6u>_&&?eipa@n)61Vo!?atvOKRkX7ftIredG;JWYLDh_|hAo1Z}Igpa> zreaP6J!n9W*kKy1_jSj1#K=+l0O1q(Iq*1$&)GoJ7!x2#qrkH;Fx zzI>TpP;liLNPw^I?)fb4>8vJzz9rU#C-Uy@U(~j!TPhuNf%}|IY5YG%aCuN#uqnJ) zH9ZY7w~UOUqDoF)UilmT7lAr{kC{2{#m6he43XTV;(vA1Id62tkjokFG;pn#CDp1Fptwgm>*ZK+e+J2o$P1DP;|ah9{*^{%w_4?eivQ z_Ky!)qN7z~cmyi9;PG6%Ui%IJZ^uM zCAj|Dj@bDb2E5Y5+?kVe$FYc$w+bC+J%WSV&*Z8$(y+3!%Bxi9Ar0>F^4_Gm)V@2Rb~(m?rXmS z2=9ak(xIhqwtrCM_q6wDCrEf)zV!Jsuwp2dolJC57V4FKrRDJy5+5ZIiu~k=(doIBEzU`rR0H1Tgt3}I7eie+qhGfqjP`fC4eWKwM_WfbZ-W& zJYF(pyclx+TTDz$*2cua1PAi6&Fwi$|1sG4&R-qrd3m1!Uo7T*@Y>ecs3$-lnz z^ahd*vb-Y0>%hH#`PSp~T_3W0_gU{NOt}x;Zhmz#Kw5=1gAbyF4ZA;VL%FlTpN{o$ z>Sktfu+6dNv0kO;|D;SWI?!4!z8`U|Hwl+9)L(_Hc8&x@aB%xoO`3BwjWG?1NxVIM3OW-&l(2 zqg~+Wf{gf+`18PqWC`GMrOj9j>h$0}#;_hZ!a-ls5Q(+_0T2G;^^{Dv9={G6h}Xq( zy0~oHG~+DSJGWRn!+#s4og2tkEV*$fdYjp#^}{Ad!j|dnE9B7cLoVdB{BvpF)Z+xr z$DL zY-Y^(Dns(B0{-|BCuex+)*CRfoAu#q|0e>vV}GkDiK^f%_Z~lv0!9f|N9WnX3qW9K z2if83doMLL*9f1FAFRZbG;`nF&)Nj3VJ+hQvCIp#cMs+c;h;$B+t;t}sw4Yl*{gvS zqnEfX3&b2DHw=eL+QAKKusc%omD437zl|{Jk!cP$URq-Sf|d2@seEU4V^!1$kdlS{ zFk+zGZ2@rlq=x_yd~xNI$pAD#Y-iVOam&=<;Ltj&wzz^amb!&aGe2f%A5`V3mYO`D zzd0WRU#A+?_BAXq>X?UuMp~0lII=ViK`-jMu&lH}!FXSY|3lrf$6XO2B2}SU*2b?7 zFWudD7&29}xM%k;!`;purv;xriB*jPoocedgB^e!i(jAqkeCKwN(wyWG|!LmxpL=) zRl3hJVxVHOSfU>ulgE#k=RMcXBp>6Qg9+z}gYny*aiwd9(T_LE%jPI_-6l_?h%ZXw2*n#jX^X2hL#)Q|FNnC)+Nt#tM@CIB1 znx)-X?pt8m60jRUd#3vAU>qY}|Bqck9RG0MnSBVO~*kj@&VPR_e)Iwv(vh3EO zdL#&l6uxJHEBvIfm0O#e>?tNq>HlX8e;X2M=Y|}4Qj)sR6p<==aw1dgS>zC@TjQ+? zR}u4Co#pI-w@QVuojL-5$fRJI+LR%`OlO4Es}H0HT;sPJEE1v9|5nU?>emEyYfWtW zaq2lL6?T1kSpj8b+lr}TpIyv5a>XJu0006Tl}5gfsx85$Aes%Twe2?_&ogQSidBRS z_jY%44f1XRONP881uD)V%J2JGIAgfCT(OEWv=Br)O#Y@o@Ku@*fSH(= z8^hOn^}WwIoDb2R9vW6aR+#GL1W@`@3Ep~*k>}YS(pTv6k3h}aJWh@ z_6bzYZmnaTM_poWgM0vx_w4k>c|+s!CA1?Y6hUEr`|A8aB#8x4NTx{u?@+MJso_M} zSSw`H?B4g8S9pIBxQ5-BLCZ>n+aY#6%quaDM;bK0Xq_asa6W5mYf!fF3>KC8M>a%p#&f)YwUS4u(aEni@KtG0u)ABK^_$)q6)A)n=^Zd=Lf0&s&XfZf^AKT*Xc!CB_t#l$3x{O~yK6iM=rJ zO@M|g=8t{p#AVc^2rv?85F!JtYzSC|7OSD>xTA)}Es}%dh>7GEe8Og%xqIuh^Daxi z!8&jTLGDtsLaBF0Mb-Duhn&ZGw3m?Tm>)n4N}LQsskoyT9(=I4SbXO4ZMNOklen3h z8;9Je?74&W9p%$H4wZxd$SxY=1==cV>gvMo2e0A+nw_V9ZGD%r*-0}Nw(3N*{(b3p zx9($R>Sed*+igdGe4Kyp;N*#!k|I@TR=Hl#c60=k>JOjcY!W}Rwe=@buNX^d41jH} zy-_@1fz9-?uYxXaFSWHpC=!+Cr1}kG-K#e@fCijyiCd`|3!FKYvPcHOd}zbaWWhxU(W%sW^4Jfeu4WJi(K4XY8tank4l3w~la< zE1Zj~xWS*g1JH~$K7>1*$<-$Kh)uB_|Cfop*_Dnn!8!eD<$(*_@`p*9Pt5kS6wm8~9f4R})wmOT6O5c#jOHt0pY2H{Gy7b$37O_pbW z_|Wt#*W%I-bF%~iYbW^9c&@6rO2Bq75dQ&Hy$o*@r=dv#T7UGxfp>e%nfwv2{s{U< zkC^B1Bat6IJWA5hNe6gAN}CD-oOhS8owH&%s7&j-3o9nJa=>`3T|9M@?q-vUt3i3TZ%?{ ztBr!H*Sn6E?H}E&U0gkxd3d7dgWFk+rla0U@iMH`yDwcH3Hz1&UoXH3VZR;t;4zZk zK>z?)Sy>%FF;$DJ9YJ#&yaX#`b+(Efj}-;=A%pmc+d<@#C9S`ICrqs9I1pR8r!~v| zAD#d=I$6N2c6yn24pk{w1Lw#@QrnB%XMlVZ#bX9*-B_0U3DKLPp1?tMH-NC8)uOMy z=wImaqq{0_bf0E8`{iI$fT(`}>^eQIRD1;eA)_Cj-by;4Cg4E#nZYxS507cC>wjsz z**kHgBovV61BEMBw`a=D`2Uqwt$5UKV zH8#%U>TAK|jA?3lF)+rhVdC)}HOpc`8)MT>6?8OEYCG=nGf~{lCf$hV5EJRDJuS)J z`iHVhOBbf2Y*)5SZ5wf1leV4oR6eQVDndLS#f{9Om{Rk=nx(kJC#GhYn)PD$S?6YH zy(S``3cBG6SFftL?;;DqOAeTicUE&?iyg^MNi6PxGw6WD!A_FyxiR=%3e&L3ohT9D zYvg~pbk!SE>ri?+j~a21s}4|&7j2M@H1IfFnsn);ujqTK58C0e!BmdLRK$4j%+Q67 za0QTS4BI7Z<*Da*W-F#9LB$ChXPx;Ej%b}Tv3=ExBi~fIvD|f!iP*XKZn`ju!`W<9 z&o!hYEY)k86$&jiCS5fhxL>tvq3q>72vJLPs%Lj^A|IdsL8*ZdtYU#6e*7k|(y`#! z2I;7-so4z%I46hsaUUr5+n3Z!Sf{%9DvPf!j^t~`@tAikCao8%lnkrrXSx^<*c;sn z+nFW?VjFiw);Chze{KWArpMY?Q8KG~_HuM5gW()5l3LWNY&ML$;kdhpm7BYtNSN$b z%TZ2U8^=i-=*Nr`4$+iD*?nBL)$7HqvGRxhKR--+cBYPw8>jLF_;?P($8TnCnfaTB3 zF57{0Q)b1K*9Q}lM-!52B@ITtbS^JNJg3DA3d`lQRbXHm?7=-s7Ovx)93_qWdLo!I zStI}LtdB-LhXtqPjVB1vio<2j3fYirwL3dKeD-674ci^bK7n&B{#ZYhem}P zXLuiZfOGeKLyF##ei1MxYv+`Z;f8O-FVDTdmY;?N>sEfDYD^xjoa(yLN@jhuy9%Zm z^jqx(lUMw?NXxNHjP}C}@;K^MBe)~QpGpN^Gt7jXXcEYK(#-`7GF)us?i>$!VBcCU zt{Vhq=vM6E{)Av@UqaGL`!AEz7MtGFb)xehcrHw=ZthYNM3w)FzoU~#9wqoLLRa{9`=9SR?(v8}EJ_v-P3tu83b*@D)EABpoG35*d0!jbpEI;@F zfqc}Nw|{mHB~g5a9CGVKw^bnh3`C0qH9`6a{+O7aw;_FmTvpWy;)<1LjWw7#cZX2( zdEp}XWYBG?)E`;~T3T_B5|QZ&SN!R;WN^ekiirzn|9(|I^#{zvNriGWec9zt0_iX& z?P!_-(mx=#UIdX20ZG43x{?;{8t`WEy8hC)1+s@}|MpST_)bo;^N~z74&2=C-#46> z3i%K^nDKyCpXR;-?xuty__SHs81zIy8$DA!Td97og;&iRT;uZWo6R1miRIH~^Pi?? zAf+oJUQ^s9O$YO0!`z!Egk1vR9Q)`~?mTCLj#8SK@Hb|q-VdL@(Orj>(y?K;j+Tp`s$F%lv(yJ0K@R0z%(k_YR-?ms>O5KA;fs*K^@>T(8IP7UV#%Q?*0d$HYuybyKd<-@!pCtxas5jmD9USU zj-Ktbc#ceYL{7v1n|$0jo^*7ibAyq%QL;n%_Sy03(lYt4!Q`~dWg$mPeWp@4(v$m@ z5xE$|WoTDuj?^mJ8TZ2=w#JS6^xHzRh?J4&QYnhVZoF5YjQ#TGP6pDam%_hG;pWca zt#jzT3ImU0zA2OL#!^CtU6W)0S0l$m*#=GV*)Uh#m~(aRU6hd$U#o*Dde)_a7n}UB z+dj0AxH6Gou$XkxdK1N2)(aaw!5opG24X8=(lc3W(lS2PZO{k3^h;f(4|ci}KcbuE z^mNiY!(gi(#Uv*ae<r`QQa9Kr5yQ-4~qkwf|}{Fh}+E(Ym008i?1++bl47`K;s2 zo>SrF+zeN20N(QWVB5A%dDy^H4qI5Ytmm_Ti01X&s41+Ttvj4+Bc>VZgS)?3+Q$24 zE4=|f>o@5>tTY@rZs@kw#gavcmSvLjP4(2PV+_;@CWngSCAXeEoqE&eKH*qBJ&h0E z6ZA-l)g2m(de>sjnlFK^pNW;rIqukk{3 zf=Thjq;`mym^0kmHY||c2;PgQQ{EYmx*kSK#7WgNq<|5l(}ZzCKHBFnR@-%cyVKfJ zS~`4H&ec1TL7>SfU~d#x0b_^)*7)Tn0=Az=mOgPWsW@4mc#JkUs1HLE>g-1IV^38i zQ`MCv8-1rp%OzZJD)(qT0FPubm!yv8l0329tMtP*v5Pu2OC=Q#^OIsbSCLm&0uLja zMUtSqCuY637RxYG&-q62PGukcRCRwOeCFvnGIE5eES;+O$&V|D{}+I57&HxG_$n}N@KA8pUESB%S9fpM znz-klRNNSGjvNvft@n53&ys@KUUyIY)KSM5`frbHhZaTUzG9)!VE|LC-)E@kp}z_34JdvJX1dOAU;bo0+QaQ5MA{$k-Pr3d%MZny2YI zoebYJqy+||u{^_i&x_4lFTz)$4Q0;qS!(bpyB;PQSank+xp_x~0$}RO`<_ZFesw7G z>Cw>8SX|b3DoR5ScAiFmrew+X!R=AiVX9GiwVNv9C;hbx`1gz)qXAZJcQ|>i5h*m= z!g8l4Fuu++L6&XQV3TNZU1A|%Va0|N@;K~M1)sxw(gl!!(O`xw_qGW4`iy81d{V@| zc=B;Up&Cn--KZE<4(KVF$YZ{&U5xG%L>bJP8>f74v`>cn;ER0FppA|y2@O0-6ti^= z@9c=6O$LrK&V5e-o7Ygxj(O);!YK&j7Gs6Fwy#TCZ-$R&ayK?{&mT~Ys}vhI2d<6e zeY1wG8k;wfz)F&s&-e8-5f8iYlIBk{du!wRE3RRFtIL`_J!nFjaw2d0^NWz4f$_@& zS!!M6bSBiUy=Nfob$$BqUSVrkDm9;VCaR6XawHdOJ)ik`)nm$5p#f1)vhj`d$`fgx z+&hPD`nz1U^qs%8T@$YHO-tmn$~I~&k!bTBE1bOI?=bRPRqpHa_hdOlzW!d^0oYP1 zj@AlTT7@p1Y(kDQev zEE=qkrO<-n6m;2VN@gziN$!rhE0PEOiT%SleYvN-qLSoI{8q*%Mt$<&Dc}@A=a(kZ z()-SIZQ#XS4nNTHK0+K~@)532*w+o%3$9&Hs~;i^^%Ue7d(R#UAg&kZ7A82Ca%yT? z#ZCcr3fZtk!E4o{#{H8yHm!{h43%*f?Vsx z$jXi^)+UE}5RlxzDcLEC=6Bx6JINY9vBV*lp<>(K*F+cRHcC%CYnSVYx~OPzH2_Ke zv>6+3;oWi61=4#R`p#B_&1!|l9pBphqjf6#Nu_3dBaJb3)(I0%5z;J-uZo}-<&rB$ zh@kR#jKh}usMdXEX~jj5a65s1k5c_YNi5TgItFi((@EkgxTvw`|3DNbZ<5)Zx!Occ z`rW0Ux{mzT(A3Nt9V;q#EYPx@E!4dxQDeV0UJ}2(KomuVFb2k?dQGtk;v4S+BTP>Y zEHF+KQ^&p_al*kVh~%J3gBmd_CB>l0u63g+nU~2>#K4G^So%P#{B}G5(#$7e=>8~J^TJ3L4UNOYKgZs3&^;?ZUb;JSm z)t&6zm}u3Plp{r$*_mCz525o5sA`%H!$*JAokj{~N)h%+7^HkDPJi(|g~TgR$Wal9 zTlU$j8h7=9u~XG-bkI7+AWx5TuF^_~tryiB?N0>Y8;GZb(ZN&L2@Ju?qSVdcw~-e8 zP}UM?CzIACjYB`A!`i3fF*Ug2jX_hqyXeMNA<}(D5k$8lxMM81MI#9%}D(^|LK%@Rx%34ZbFuLlh#-uS0ZH#dlWBYq6(f07fM*B9NzFQE7h4%*rVV zXZppp&6|3TcDo9sf-OQe;r(T@jHyNN6u*kbCV=k~c+6eF3^d`5D5;^1dQ@N4xFIZ3 z;^=Wsn!78e?gZ{WZH_l^o7oe1hiyjraW^7FM6nG7r>RP()MB#JW{2jPePim6&4nPp zS&9^#P1xDlabKMlHlz@HB8sgvx9Uv+^h-aba_@qQShUj9DIs7OP(hA4E_dKu7Vgwx zE;!<%Wf_xY83H);9h!W6-6bE?!)?F)0Wc|3UDen7yf%{_)ow;0?VWni zFl!Ke4jqoY$?idJr5FC838$*J;Ou6C>?1d~Dv{rZ#hPWFy8oJ+cEz^KFf;`-HC~mi zuv$mAQJ@5aAkR!;w`ralv^_fuDSY;CvSR#0;f=rM!IWJ^s_W2=c&@p!)Ne081edg0 z3Xw8|gQq$hkjBT>Mo;z3F#=VH`fS-W>gf_+-?oePi`~YO2~r}k81T0;Xis}74^51l z6=Z;QcZV*SMJY>cXM%B=;=tG0?U#Y-K{!rLxE*xVQr{;XxTjvEXQwM$F*!z^OX6N* zMB~#Xj~=vWe^P;97pDH0Ka#wLujDFY>8tgCqb_K+We?*cIRH+09jA7`1VY`x5{;O4 z@8L8iczB5(m-_QBFQgo?3PWgC(;;D?b2F!-oRLJwdjI&H}c!)qvG3 zV|%|byGkvF4g70{4MDsE1{31dqZdvy>G$^xcYYv3%kNj9d%NhpW_8V{z7f5}X6ijk zt_@H~PH+$BsPuohL|Ja#8F9Eftb)s+_xdfMZJ6p=5AV|pAM4(jtl+cw9koFmKIeK| z64750c-S*iq%SDT=wlHfvGZGOKN6Y=LJyOi5uMOuIoDR{=AMKyM)V@3iXsry)j`PJ zhC$Ps1W_q~@)$Gvo81-0*cJVz^}>sLSr^HK58-OkMu*`O{y2w*md?k*sUgo9jtV5CcwxXqiz;pF;kaZHO#nSuV652pU0*K6%(#vUXtT({ zk+z+Mjk9$i=-ay<-z=8B=p7=+NW$rhClN(V zyVBo$k5iAoBu%S1@WfrTT=pUbgMs*_AR4B9f+y`Jfu|KP>o#&hokFx;mQ!kPqG2?6 zAl8ey(YTawa?-6XE!X|tALKNU{=B=pTa7I?KPQ}8G+V}B`Kx_#od`%a)n)_MHya3J zNL}mADs}5v%{%M0PIZUNg^l}OI|mt&OZ&~oOhx+Da4*$dUMbQcTU?8yAck6S|I9Mj z2FOZyT}N`)Y;U`<+4T++=EK}TL|Vmfwb_Ck!l8UJn_AFm+Dvl1uX;9VY}2zZ0FR32 ze2RKN^y(>E4fGcDyZe!qnv{e?;@sFbs0Rv);Cg|cEh@Z$#|P7%gv~1{&bYW_bX%lE zZ*B95QpXo+fEXvU`PPYim05rVG4fvyGAr( zk3mXS)gpNU^A?la*?Lc5)xviYziLl=)ZKH~tna+Xdn^^M4%`}& z$pO%cN~FhlVFf~@cD|dP4A{JGt3ZK*|+Z86un+t%Un=2X7as%Z(r1z zMJ{l!XJKbfied@Z-W8O(~R~c z=&+JtUu?W_G66e$rx3xuMKI*NdV zUV{Z0nxG&pp(skE1}V~siu4j8A+&_tck7+I?!D*y1Lt1$TCA0o&Du%6^1jdW``*33 z_+ZI)odCfCeXNKXR7NwUz#|Ez1AHbE{O87TOB_*A6<4Qb?fKo%FBaB{-oi-1(YZ>_ z?06N$yH*tCeb&Uejy_TtCQ=Bg438WAY1AyMsAWOf^=u3GbRE1X3vR4m2%{hMyQNgXJ1XSpR3SNa#Buw?moAIXPJTFpx(Makz zya6dNBgtgv)(^#BAzS&nCEv-(i<5&p5EpL>6L|Mzu?zwy${@pN!~`leol)UZ7cD!I zwPKptY2k=vU^uby?DtP1Gl*=5ZqG0Uvl93I2Lc|uPf#sfHhEurGiha8BrDNoH{nd0 z=s)%tNG*p=@&_wC`;>wbcTA`<4(8;NAvulo`!eeoRLRMvHONKF+g7&*S*8QzDjj0j zR)`pzK9qV47CBcKrIE%d&}Af_Zesi-dr)emVt$}uySa6&v~!Qw)P>m7MA)Bdw%d_{ zV^whLg{-)YZ=Y*CdnE*Xx4OXjZVm7wO<+G^*Ek$^veW>4wqII6knOrHVn-PSsi4tE z>e=)t(IfV!BDA?X4asdL+UhxR@gvPtR^0>9wnE)75wrXtE&Q+0W|to$Q;kLo4(jWK z5Hi->O1Y}y(=F7YlBJuHnbCB~@%X%wrK@wABQ}2L!f^xsE+?N;hsPnrsVJ}Eq^NIK z|Mp1_op{o9@Z&stsdQKcH%i>%zAyUNi3ob|WEz zKLO*#onH5I<;MN%rI6!f`_`v*9pIC+7e0kTjhJ$dvTJEIPBMTu19q#CFgP=><5zV| zTej}uBfV(p@XqU3*y4X$;?yS|SSM-{J%hY?Gl?p0mUDJBHo;oG_!6sW!GulQ;2+Zi zdytU)ZRx2Y8ynJGbc7LJ=K~AOFrOBaM2R=itaOx|>Qqt^5leWKPfPinUy*dodzi1^ zA`q!FJd$~>xsMfay@NN|0fgOx(4^d&{`$Ie-&2Q_Y5&oysG?w}zDoWI`0kWIR+6!` zpGtg!gv44Z=pjtWFBqgcIIshMM#egG3PBT)EP7^ z78}M%p^%O!j;wHLG4c6H%oIYiW~5-LkNMQQ*QacD+~wtUBGE*B=B?|ip&bMAh;7FH z5(uL?MnG2)wzW#dUM1SWqzlhiTW{@g0yUgzS*09F%I(r*u{!z+|l z`bi_y;qr;ul4X`Dkw^s2*dPre(ltdywX0fO7|Fdbz6)Zjtv;ttmhu#eFULGi0$A(p zN7o-bojRWb@m}be&>m5(YPxvYJ<()&I@#QssO-xOz%TLnH)*gVsVIMCG`IYE|77)Mu|N4vF^M;DlFsb5QZD;=ytVF86D=1lcg`Z zVd0{!;A#!erMhrn7qpSt#~b0b`)iOxcO9BOGVV%M;$bAb(LQw4we-%-l*qznwSE0t zbmXhlrp<}j!NJ075RwawyfGIA8(_pn8Lj36zphPScxeVGz++QP`8 z)HjN+VQZ~_!G>-B){#e#g6VWgZhMf(XqlGrh0rAWZMz@T*aij$dK};S7kl1|b|iwF z{o_r((3H&Y|ELPkZdsL@!dX#zW*gf$9+4qob@6?18w_>=A+A!Xr&~d-S@W0padJKd&JJ)R<~h zvZ^U?4V2{lv;nCuIV*vFIr&H~tH=g56E6m}>tLbC@i>B1-u}V1I5i3-^}Q@wbkvjI zhN>w7O{(wcLs^P{cCBV6#ov?5q6H@%bx#q+IM{>N0&N2)B<8#J8AyK65_c=TDyHI^ zfSz2K$RA0tk&K6+De8oTtO?9Bx)F1F|Go_k5AC)fmn=A%)1`2G$^p|k7DY!eq?Cxs z{QG*Z?y6c4eG+N=B1fa@@89nWqNfr^qYP$iq}*fSKBV>peDkC_s!G_6RqMVk>8u<^ z-6+a@!kRT0@WX#~y~p^D`VSq#+$#7fHa1qB3)A%k)rUF^t2-kAb&Sb0_OwQ~|3sck zW1BORZ-&Ljo)4I-|MXf(+7Kf4NMGxGtr&YQczBG%`sNkxjE0VIm4WwvU4BRPr{vFF z!pKE0fXE&yy_{vy!`Dut4hqfLulDK{a(yeK_m%tRq~ZIY8M8morLgo7Y2x(a2pd)i zNkfohzSAxd73BD9NS98Iwr^A$AjRdrj~M-^Ff^3o5O3wvtVo@_GWa4w!iS+yvLa`Q zrYzFz7>5`~QE~IH7sx6K>;?R`R};FNi>8YAI46blWh3gp2_N3= zL?`#+fDE$%0#4MUnmZtm-8v2$Cy``9#W|DhOSn^jhC~RRTD~2Zn72n#DL}qNZy+JJ z6nsLgV{G{NqTiyW>xiA4_n6RStSP?BHvG!s#CpQ1k!Vl&+flHRtvSbIwl3EWLP-8B zaVy_L9)dxy*VxNo*kG5?*+1XN?(z;^&?}elaq<~(&ip}i+f1AjbCx-E=lRQ-K2yiw zemCRO8QJ6TKx45)FjGZ6nEzCBEe(NK2+w$i` z)L>k0+Sr1V%b8&cls#r0$Gq!qZoX0s1Bu|ysI;iieWLIG9I&)nCdKnQs=sscD`Yav zV4EXid))ejRv87mFw;NsAX76#zkl^&|E z4>L~>CA!BZKkgL~YiEEynWc;4--`q;KVylgqCg=dH&>oQ(v&H5XgUqM;}wiR_(KrV zZA&IsWS5%X4V0%!`SuYiBlD@#-BnXIp3t0{x z#NY;=u5);j&}^u$uOFf1Kb^SUKmum-xPU?8%+M_YD!ku0qMs0=f1yRRrD3|(>4`yP zbGYhU)7Jio_Y-<|96qJ%js-L{iE8@YAb*8^t`~F3jWV$+w+Dk}NWPd?Tvyy%lx=MQ zklS>Wxkuhk{Y=uOKB|5vm8p(m~Jcs zHY?rj^hBhv{$S2m3NV@vK&LqG&pB7QP>(vbr28+zPDA4hDbmq0rY5P!yn$G44%pC; z_g_9PA^Dd$h2^6t5lr!`uQMdym0SqeqQUu=68r)7`mzA(k%VDr=hX6Iv9TS&6pUkp z)=hjWc?0S#!3Q?qFFjYo^wWa8Q;+uN{D63B1eFzKc6t$(Fcdy40eXie4jlfwxxMrg za|z++3o4P=b=+VUpgh)Dyrta2!kOR1hXxPZ zy&RiYG3NWvdDf3*Dzp+vOLdvft;HVxlARd4+92B7z2az7+2USy3HhH>%%AE0{e>Z! z5HJu!2vF?ayll@i2s_Gb6m4UNvhZ;#)S~Z!6W9n%`AZ&erPYWm=zIF@L1A-amTW3{ zFleTsJ?p$IZ0*#nlje6V%BEpXmA4o8YAnV?Lm6bs)^rO+(zf_=^hbrfJBR9$jCWSB z-ESa{H%?pL`p+InlDOo<+CmDqyAhP6d|5{-XrWSQEwX7jx1i^G&ay5Ds7;Tvvtyjw zWP^Yc|UCBLmU198223ZyPA;k+cgQLylAf4qN051rq%cjamXq8IDXoN^VuMP&xOc+qZh;1|diAsNpfUu!nga9M|h;2Z((W?i};e<8>2 z6rB2dW17|>NXK$Y`7G-lpkm6PiboXlOet3U=aqa*{Yu-;z|j3_?q5pbd+vq}p}`N- zn`wo?r84-5ZYD5GU$zet?rRD!g<*CNtBkg;k-8iEffuZHez+90Xct2p<8TI*MCYOY zq&?e8<5fdF`K4tRwgD>yi7W$Rddz8T*1=datVJSB6ky^zxTM=Qx9t8~A;862yw5>Q zfKSFvXs3H>{m|vm=_jCj(BprW2EZG)(O(V6f!~qu_~rQC|E&x+2#KNpuzCr|YO8I5 zZ2HSFthU9!Q(NSoM8n-L2twHoalv7&)1`Yc@tv3rNC;ySm@dp;HA}1E;78RIM7-6| z_@5PIt8IZMz}0cFDj#4N{GZZ6)dD;{;&15aUblET@|w-nwdm{3P+SQ|^$8H+a1{LV zLp#c^{ZZGtdU~~4U|6gUht*lK8XZ=r!T*iAcPhmA>5Vo`@TE(?|bLYojY@wiF;!9UVD{yz2$kIcSSwX)nYi$c^(3RFg$#q z{uBZ^DF=a^IeYdr_@Bu)Fci3)^!)pw;aTt(boNCg1ab}XQ2oB4-_+`iuNSM`)R{T1 zv*!vf2QXaID1O>;-luccd#x?id%QjbW9dEaTCrZ??K%-?B0BLkI$AqP__5P+_CG&2 z4?pEgp85z$pKl)cot2vIpG!`sWcU4`ZuUuyR#$UfrN92(8zYnB;CgN4Bscvl?i}bE zB&>t^6}Uj61n20ND|%m#fy<4YuoK|&K1*~Z>FnKS zy=E;wu8-0b?r6sD-`Zf8{%!CY-9TT;uY(_w6L|txgZ#GFf-SuWjTVNb#*g)%T@V%( zjZL&YgU;krW+nz7c!2I&e{dB@Fb?7dreeoK+&MH1i=W$9DeXPeI2~4=ry2LLaejmgSA=vBIc@m2MC+skjXaTS(?2zu z?1p_B)b@1{HfZImfst_?KSJ5}XAD)@Ml|kbsA_0y_c!80eTA<;Zak{#D#uUh5M$P+ zyi6_@6~wE|Wi3xsI8fIHVr&+(ZYMio`!1iPzF^A=4M}{3k9hj@DXvH$!SDv;L7Gb2 zrFaT$x8l`_k}%yhpU4(>Kf&GUl}hb8sOGCD#SB4&wdJYLy{8*8RYOC(*6V|tLTOQG zKE4JTIVEmtH>xlv8VU_DKrSye$|Xh$Vys zhfY)Gp|~g$x6-SW7bnjI1>O(&=D(C2*rLS^Q~z8xo*`{Fh-`IRGe5%uxzW)iNY!sV zW;6lXV0Pf%%G9osIDTnwj7C|5uDk9o8_P%dh3xJ-=$o1zP&=d?2E6VayLa5uXE6@8 z`5X20Y!PliZc!GtelGM8HRP<^oCU^r&AejG%J18$cGZxe*4+aF?E6DO%_AB@E)SA-TycpF6>~`8F1&n? zNozIKJ}Y%Dk^2_MTfXHMVhC(}#y3^R!m8P;e0%2r9VgqR>ef2+`UIH6)%#26hi*E@ zv|+z~qoUvHEOvRGSbu1VjhhSOTYjqBP)yzZQ!1d?6948ngrx`B!o$OsO?7w+>G2x+ z5gLCODCqt%H7s1%akka}rZ@tMu%>R}bYz+imC4hk9SaxO#0`TW&q^nJGTlg+3vLO2 zMy-xRxXzw0F-a&LMBP-VT}dnpq5LU|wqG2G)`($CZFIx7k!K6)Go_tbvlV?rVKZ#) z?}Sw#m7R74<52{Oz-v#RItiby)CZTYI#jd7onJ{(cV@V`4IkD$b?#i&hue^6d?o7L z4BQQx=JR6&l$F~iHq)gXG_9>??Xe9xGl3l{lvQSVF>`fIP0bNq1dpSmV`6S9pTEDq zq{Bd#AGwW;Yh#@Cy#~3*LTb4{jQql2A$)Qp>8|UDa7f@cS6F}OzytNrQ{auoj?%Vs zEyNV|S0kksvf^#?zZ%!#F(Jm7U>|}NZgVgqgb6ghfRxBq^o}0ZRTc}_nYwPiP#YVt z^GBo3X|yM3@Fp9SduwShfqpNe^7gA%sh4wlwCScA4;?FVhk;%vLITzI`ZR>)Yt@-- zzBXUEC)dMreS?Pyb8@?RTg;LxMHYrdAAUU@#_cK+Bj3ibCO3wlf#k**D{ zP?!B?Zvt+mF!%O&7{1kWAWGIcRC$(jLo>^B%xnm5K`w%#Xs6rbh<9Bk{<@?v_tkHM zM!}CA&EoPPVcJ54jxBP;f1Ix#pQv?CV6KSD`m!b*r26mZi;J0TO^oy_5O^^F?(}!^DI9qiS%7+P~k5~ z-iIb!RwjR)ea7FAOrJwTDKT+X3X}zzd;C&K!AEzs*RojumW~~7f<1ZxMO$ewU2PqX zzbVeQIk|+*V()Q0iMG{KVihqi6B^IhUKti#Z`_eNa|U8~<;*(l@9pIgt?OYPLp59L zusL2q!)2B8az!7Uz641f_RWx|4gP@PPdX!VM;28A*LYl~YQ^eYo&u?(NFT0QwZMGqQLMzfkS)K74Cx-?kPBIL?^&5y&6n=# zn>s07OKK5a%zDZ!p^b|PumdxPPTiI@&cbY%CY89}VmsYPva3(e$>B|PTz;!cfglvnhrT;z)Y%7%3rti8t z^*rKAYAAI@P<3ybbD^H`#4P(|cvo!vC5#)JEjl5=7t3??sFBolr6F6v+o_c_mI-rJ zpZ3SB!KSOwDN}As1KHfyAn%`vWzJE@L0qWb&}gcpE%pb@?7NLx6s>TCuW6UnF`+3xId*8Q_n1v z13z+~4chodVe!DCwkS>#(jSKbp z307i`AJJp)6$5?J352n70_0d&!J%7{wcsTz`QlqhePsKtvhtnb8WF=>(B*HVCRQva zRxmqtbt;LBV)ih+ET9!^hTGKTQPi-vw=X6tZqKP{TdD+X7nvf1{NGNG8=+a z8_?^49~-IBz2XT0H>U@xUj6>wco>h7bq)>mAu=VXP+!GzNh`Qf(WoTQ10xQ!gB(BY6~vpTPL))RvU<-Lj*%PHG-QvpzL$lng$ImD`+v z^GitReX6hiv8VG{N{=Iz&(`ekV%Iib6ga?g(F#yJ?u4KajK$nr9D zLv*rI<8#4C>|p?(!Se%wxryU4SKYWnwwWZIjVt~(f*{&x0a3kDQd0QwRBQ7WX6^47 z;GTuLH{FhUN)c}LDk_^l)nHS_g{Xwo z(tO7x+@RO`umhR@2sQsbMw@#y5lDy9<}y6gf{E>DZL+Bx_6yud}XQ6Ts!{gEhPvOJ$ilFmGUQSpMr?E#dqoo(>1E43l zGZSA4q-%!k+eIDID!jy#|GfR3WGIaq895P5p3w<9s(juqqk}SUaN`lo^?RC*>C2H) zv`M(>Pd@57FYDpy za6wkM(!|>TbH@S)2M28E)RLBZhY!Y;i>Dq_F(LEz?OW1x%%FQpNOtJDe`2!H0p7`> zFO8`%C*Y#0ZZ3n0_% zN4or%vbcb)6|N7Ns&yPf9f@RqhPDOl2zws#9JNS+u`X!V8KFXyp?87NQ1r%_Flkr0 zO#Vuf^MCXxQ{lG#z=6VIe=gSrwt=YaDKq^B>+qLjcLg(K9GS|^>*G?yFdCYgU-G{V z{)F2S{fdrnt9{iUkhwLTCga-tx6vyB&3GZnxxICnWGmm<&mH7oS|?j(x!%qn`_yJP z8g+k&`1*`Yb9suqJn{vk=wyjWDX*)!&(lagv+5W6K^wohNPnF5&^>RcHiT4ht1C52 zeUUJ{W*O92q}*o}b;JbL-Bv(KN{8vU;PMn~yvVvdpiIQF!Fwy3ra3J?I@E9AX*uF`T2$LLH2; zyo#bU|KX!fPYESMn@0VNTZBH1^sB_k_O3i2{F~@kXkK7K}SzXXM9j2XUwB^e3 z`;5vFuDx+(5v%3qwu16?a2QYEl-B0$MlR)?(b8sk%|zuE%XB^5O0+QSdHo9R!6|9u zch`NaY-01n;%sE(o>%w#{;6Clwe{(^wBs~b`E{P~GmNv(6pxxo(8O#jG}}c;GVV=& z8-I{9uAmAwu6!g~->RFvD!2Wf8Ez2aHq;2)dZ1Iv0wganwSj+epf~OuvlbeidolX6 z4yy)v&G+epy>xSFcfQ;>?nWcZwYdrP?{PhZ&$L7QT==EgBG(J&&*x)Lkln{Or$5fqj zv?y`bbxH2G3!noZ0#ful3nX#_$ei=+xNFX2U7Hgm64q2hA|ak5P-i1wq9G^R-G`1<+; zzBGzCAMe9sQ&7}}7?uio+gIuTuP8y_u-al=%=)+bF| zNB;RF{q!kNMRA#`&wl6cOS(;WrzzQ4&Myu``fnkd%A3q;Qie+GT9zlCQzqP6*5DwP zw5zZ2`|-Vz+G8+wbo38?Fedzx+$|jD;S;Sm8h=+T4{MF5LkI5j1-RL8%22CW>GE`w zme=}7%>#<_cty-PW@PM;?K^bsN|McDS#hGZqEv?TVAQUwqE^CsizZz2anI_Y2tt`> zQ2FSvU}qc}s8#DUDZ|hIWiahZ`@7I92B;kN8jnH^Cnxi}?z6%Q-pjl*Eky3gN!7J; z!3#$1#4__b;aiW`S(tCdM{!7f>BwrTu^Gah(nq+3zx&5r?R25tt#}?ZVL%THemg4Tl??)xFRT#EgR|+OWmyT zTc{I+TV=+>wj~R-Qgyjht0*1k-~wRIfub{0BF!sH1`fpX6WB!4xZs+hOzz0TzgK_4 zeY5<&?++E}C#A`{>nf4IpCGNgCr7*SdDJ9U@5+7>HYBj<}^uNbxB)JV2vu=-KMt5M3 z_A|i`zksuo%IWqfTjn;+lTdf_9oNmbf(gnbl;37?OK%W+*w#>r-AOI^cU(+Nah%fe zdMcc)qX)jjDED|S_vRmLM!MGPSk;P_MZLtNBm?`6_ZB_OCOsH`Hp|Pd^^P?Uw_XPA zcCyhSg09VlUi<;jJNAz=5Au&)`*bIEE^=k~7Mn#q{!&Y-1=wh1QH8l{Y-*ui$8r-B zSz6Yr^*}6m*BD{OV}PWUOvo^*1_X|jTc`%?PPoEV2m>v&dYX4(ymG!#uS``%2Cj5wOUJ&QomA+K|a*N%$#l5DcYr9FL#$j7ji$Io3*D zJkGANIcyU;gmpyE;0u_=LAcL()l9{Wno74jkvDZ%E1DD z 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

%U7U|LIr#I4Lz&$_+ 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 YK5pHfj`9$`0iz_lqN#^0P`7>be_~rHrT_o{ literal 0 HcmV?d00001 diff --git a/website/public/screenshots/mail-workspace-error-desktop.png b/website/public/screenshots/mail-workspace-error-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..32b138f6995ccc599398c093d8879b9bb47ff6ce GIT binary patch literal 48118 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 jBU1xXoHp;m;WpEA=tkKJnxPK5rE}Q- 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 literal 0 HcmV?d00001 diff --git a/website/public/screenshots/mail-workspace-loading-mobile.png b/website/public/screenshots/mail-workspace-loading-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..30dbc97bb3dfd4a0aae49fb4582c1755591ed292 GIT binary patch literal 47430 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 literal 0 HcmV?d00001 diff --git a/website/public/screenshots/mail-workspace-mobile.png b/website/public/screenshots/mail-workspace-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d4577e1fdb7385be73643194504a78d953c45c GIT binary patch literal 117964 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

w|vbd6g)@) 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 Date: Wed, 29 Jul 2026 15:01:39 +0200 Subject: [PATCH 2/2] chore(changelog): link mail workspace pull request --- changes/unreleased/54-native-mail-workspace.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changes/unreleased/54-native-mail-workspace.md b/changes/unreleased/54-native-mail-workspace.md index ef5d07e2..326bf6f1 100644 --- a/changes/unreleased/54-native-mail-workspace.md +++ b/changes/unreleased/54-native-mail-workspace.md @@ -1,6 +1,6 @@ category: feature issue: 54 -pull: none +pull: 255 platforms: android, desktop user-facing: yes