* 'main' of https://github.com/vitorpamplona/amethyst:
  update cz, pt, de, sv
  remove unused imports
  remove unused imports
  remove unused imports
This commit is contained in:
Vitor Pamplona
2026-03-02 11:25:18 -05:00
31 changed files with 144 additions and 50 deletions
@@ -25,7 +25,6 @@ import android.content.Context
import android.content.SharedPreferences
import androidx.compose.runtime.Immutable
import androidx.core.content.edit
import com.vitorpamplona.amethyst.LocalPreferences.parseEventOrNull
import com.vitorpamplona.amethyst.model.ALL_FOLLOWS
import com.vitorpamplona.amethyst.model.AccountSettings
import com.vitorpamplona.amethyst.model.GLOBAL_FOLLOWS
@@ -43,7 +43,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.tooling.preview.Preview
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.service.playback.composable.controls.HorizontalLinearProgressIndicator
import com.vitorpamplona.amethyst.ui.stringRes
import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange
import com.vitorpamplona.amethyst.ui.theme.Size30Modifier
@@ -43,7 +43,6 @@ import com.vitorpamplona.amethyst.service.playback.composable.MediaControllerSta
import com.vitorpamplona.amethyst.service.playback.composable.WaveformData
import com.vitorpamplona.amethyst.service.playback.composable.mediaitem.MediaItemData
import com.vitorpamplona.amethyst.service.playback.composable.wavefront.Waveform
import com.vitorpamplona.amethyst.service.playback.pip.makePipParams
import com.vitorpamplona.amethyst.ui.components.getActivity
import com.vitorpamplona.amethyst.ui.theme.VoiceHeightModifier
@@ -43,7 +43,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
@@ -20,8 +20,6 @@
*/
package com.vitorpamplona.amethyst.ui.components
import android.R.attr.maxLines
import android.R.attr.onClick
import androidx.compose.foundation.combinedClickable
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -31,7 +29,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.style.TextOverflow
import com.vitorpamplona.amethyst.ui.components.appendLink
import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.navigation.routes.Route
@@ -20,7 +20,6 @@
*/
package com.vitorpamplona.amethyst.ui.components
import android.R.attr.maxLines
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.InlineTextContent
@@ -28,7 +28,6 @@ import android.widget.Toast
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Arrangement.spacedBy
@@ -63,7 +63,6 @@ import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@@ -100,7 +100,6 @@ import com.vitorpamplona.quartz.utils.TimeUtils
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlin.collections.map
@Composable
fun RenderPoll(
@@ -37,10 +37,8 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -23,7 +23,6 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chess.dal
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.filterIntoSet
import com.vitorpamplona.amethyst.ui.dal.AdditiveFeedFilter
import com.vitorpamplona.amethyst.ui.dal.DefaultFeedOrder
import com.vitorpamplona.amethyst.ui.dal.FilterByListParams
@@ -24,7 +24,6 @@ import androidx.annotation.OptIn
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.PlayCircleOutline
import androidx.compose.material3.Icon
@@ -33,7 +32,6 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@@ -65,7 +63,6 @@ import com.vitorpamplona.amethyst.ui.theme.Size50Modifier
import com.vitorpamplona.quartz.experimental.profileGallery.ProfileGalleryEntryEvent
import com.vitorpamplona.quartz.nip68Picture.PictureEvent
import com.vitorpamplona.quartz.nip71Video.VideoEvent
import kotlinx.coroutines.flow.map
@Composable
fun GalleryThumbnail(
@@ -41,7 +41,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.emitAll
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
@@ -26,9 +26,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
@@ -1274,4 +1274,40 @@
<string name="confirm">Potvrdit</string>
<string name="next">Další</string>
<string name="add_poll_option_button">Přidat možnost ankety</string>
<string name="favorite_relays_title">Oblíbené feedy relayí</string>
<string name="favorite_section">Oblíbené feedy relayí</string>
<string name="favorite_section_explainer">Relaye, které často navštěvujete pro zobrazení jejich globálního feedu</string>
<string name="ui_preferences">Nastavení rozhraní</string>
<string name="translations">Překlady</string>
<string name="reactions">Reakce</string>
<string name="account_settings">Nastavení účtu</string>
<string name="app_settings">Nastavení aplikace</string>
<string name="go_back">Jít zpět</string>
<string name="approve">Schválit</string>
<string name="connected">Připojeno</string>
<string name="social_proof">Sociální důkaz</string>
<string name="poll_submit">Odeslat</string>
<string name="restart">Restartovat</string>
<string name="chess_accept">Přijmout</string>
<string name="chess_decline">Odmítnout</string>
<string name="chess_new_game">Nová hra</string>
<string name="new_chess_game">Nová šachová hra</string>
<string name="chess_loading_game">Načítání hry…</string>
<string name="chess_game_not_found">Hra nenalezena</string>
<string name="chess_game_waiting">Tato hra mohla skončit nebo čeká na soupeře.</string>
<string name="chess_game_id">ID hry: %1$s…</string>
<string name="badge_and_n_others"> a %1$d dalších</string>
<string name="remove_language">Odebrat %1$s</string>
<string name="relay_active_subscriptions">Aktivní odběry</string>
<string name="relay_active_outbox">Čekající události k odeslání</string>
<string name="relay_req_subscriptions">REQ odběry (%1$d)</string>
<string name="relay_count_subscriptions">COUNT odběry (%1$d)</string>
<string name="relay_outbox_events">Události k odeslání (%1$d)</string>
<string name="relay_no_active_subscriptions">Pro tento relay nejsou žádné aktivní odběry</string>
<string name="relay_filter_authors">%1$d autorů</string>
<string name="relay_filter_ids">%1$d ID</string>
<string name="relay_filter_since">od %1$s</string>
<string name="relay_filter_until">do %1$s</string>
<string name="relay_filter_limit">limit %1$d</string>
</resources>
@@ -1279,4 +1279,40 @@ anz der Bedingungen ist erforderlich</string>
<string name="confirm">Bestätigen</string>
<string name="next">Weiter</string>
<string name="add_poll_option_button">Umfrageoption hinzufügen</string>
<string name="favorite_relays_title">Favorisierte Relay-Feeds</string>
<string name="favorite_section">Favorisierte Relay-Feeds</string>
<string name="favorite_section_explainer">Relays, die du häufig besuchst, um ihren globalen Feed zu sehen</string>
<string name="ui_preferences">UI-Einstellungen</string>
<string name="translations">Übersetzungen</string>
<string name="reactions">Reaktionen</string>
<string name="account_settings">Kontoeinstellungen</string>
<string name="app_settings">App-Einstellungen</string>
<string name="go_back">Zurückgehen</string>
<string name="approve">Genehmigen</string>
<string name="connected">Verbunden</string>
<string name="social_proof">Sozialer Nachweis</string>
<string name="poll_submit">Absenden</string>
<string name="restart">Neu starten</string>
<string name="chess_accept">Annehmen</string>
<string name="chess_decline">Ablehnen</string>
<string name="chess_new_game">Neues Spiel</string>
<string name="new_chess_game">Neues Schachspiel</string>
<string name="chess_loading_game">Spiel wird geladen…</string>
<string name="chess_game_not_found">Spiel nicht gefunden</string>
<string name="chess_game_waiting">Dieses Spiel ist möglicherweise beendet oder wartet auf einen Gegner.</string>
<string name="chess_game_id">Spiel-ID: %1$s…</string>
<string name="badge_and_n_others"> und %1$d weitere</string>
<string name="remove_language">%1$s entfernen</string>
<string name="relay_active_subscriptions">Aktive Abonnements</string>
<string name="relay_active_outbox">Ausstehende Outbox-Ereignisse</string>
<string name="relay_req_subscriptions">REQ-Abonnements (%1$d)</string>
<string name="relay_count_subscriptions">COUNT-Abonnements (%1$d)</string>
<string name="relay_outbox_events">Outbox-Ereignisse (%1$d)</string>
<string name="relay_no_active_subscriptions">Keine aktiven Abonnements für dieses Relay</string>
<string name="relay_filter_authors">%1$d Autoren</string>
<string name="relay_filter_ids">%1$d IDs</string>
<string name="relay_filter_since">seit %1$s</string>
<string name="relay_filter_until">bis %1$s</string>
<string name="relay_filter_limit">Limit %1$d</string>
</resources>
@@ -1274,4 +1274,40 @@
<string name="confirm">Confirmar</string>
<string name="next">Próximo</string>
<string name="add_poll_option_button">Adicionar opção à enquete</string>
<string name="favorite_relays_title">Feeds de Relays Favoritos</string>
<string name="favorite_section">Feeds de Relays Favoritos</string>
<string name="favorite_section_explainer">Relays que você visita com frequência para ver o feed Global deles</string>
<string name="ui_preferences">Preferências da Interface</string>
<string name="translations">Traduções</string>
<string name="reactions">Reações</string>
<string name="account_settings">Configurações da Conta</string>
<string name="app_settings">Configurações do App</string>
<string name="go_back">Voltar</string>
<string name="approve">Aprovar</string>
<string name="connected">Conectado</string>
<string name="social_proof">Prova social</string>
<string name="poll_submit">Enviar</string>
<string name="restart">Reiniciar</string>
<string name="chess_accept">Aceitar</string>
<string name="chess_decline">Recusar</string>
<string name="chess_new_game">Novo Jogo</string>
<string name="new_chess_game">Novo Jogo de Xadrez</string>
<string name="chess_loading_game">Carregando jogo…</string>
<string name="chess_game_not_found">Jogo não encontrado</string>
<string name="chess_game_waiting">Este jogo pode ter terminado ou está aguardando um oponente.</string>
<string name="chess_game_id">ID do Jogo: %1$s…</string>
<string name="badge_and_n_others"> e mais %1$d</string>
<string name="remove_language">Remover %1$s</string>
<string name="relay_active_subscriptions">Assinaturas Ativas</string>
<string name="relay_active_outbox">Eventos Pendentes na Outbox</string>
<string name="relay_req_subscriptions">Assinaturas REQ (%1$d)</string>
<string name="relay_count_subscriptions">Assinaturas COUNT (%1$d)</string>
<string name="relay_outbox_events">Eventos da Outbox (%1$d)</string>
<string name="relay_no_active_subscriptions">Nenhuma assinatura ativa para este relay</string>
<string name="relay_filter_authors">%1$d autores</string>
<string name="relay_filter_ids">%1$d IDs</string>
<string name="relay_filter_since">desde %1$s</string>
<string name="relay_filter_until">até %1$s</string>
<string name="relay_filter_limit">limite %1$d</string>
</resources>
@@ -1273,4 +1273,40 @@
<string name="confirm">Bekräfta</string>
<string name="next">Nästa</string>
<string name="add_poll_option_button">Lägg till omröstningsalternativ</string>
<string name="favorite_relays_title">Favorit-reläflöden</string>
<string name="favorite_section">Favorit-reläflöden</string>
<string name="favorite_section_explainer">Reläer som du ofta besöker för att se deras globala flöde</string>
<string name="ui_preferences">Gränssnittsinställningar</string>
<string name="translations">Översättningar</string>
<string name="reactions">Reaktioner</string>
<string name="account_settings">Kontoinställningar</string>
<string name="app_settings">Appinställningar</string>
<string name="go_back">Gå tillbaka</string>
<string name="approve">Godkänn</string>
<string name="connected">Ansluten</string>
<string name="social_proof">Socialt bevis</string>
<string name="poll_submit">Skicka</string>
<string name="restart">Starta om</string>
<string name="chess_accept">Acceptera</string>
<string name="chess_decline">Avböj</string>
<string name="chess_new_game">Nytt parti</string>
<string name="new_chess_game">Nytt schackparti</string>
<string name="chess_loading_game">Laddar parti…</string>
<string name="chess_game_not_found">Parti hittades inte</string>
<string name="chess_game_waiting">Detta parti kan ha avslutats eller väntar på motståndare.</string>
<string name="chess_game_id">Parti-ID: %1$s…</string>
<string name="badge_and_n_others"> och %1$d andra</string>
<string name="remove_language">Ta bort %1$s</string>
<string name="relay_active_subscriptions">Aktiva prenumerationer</string>
<string name="relay_active_outbox">Väntande utgående händelser</string>
<string name="relay_req_subscriptions">REQ-prenumerationer (%1$d)</string>
<string name="relay_count_subscriptions">COUNT-prenumerationer (%1$d)</string>
<string name="relay_outbox_events">Utgående händelser (%1$d)</string>
<string name="relay_no_active_subscriptions">Inga aktiva prenumerationer för detta relä</string>
<string name="relay_filter_authors">%1$d författare</string>
<string name="relay_filter_ids">%1$d ID:n</string>
<string name="relay_filter_since">sedan %1$s</string>
<string name="relay_filter_until">till %1$s</string>
<string name="relay_filter_limit">gräns %1$d</string>
</resources>
@@ -57,7 +57,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
@@ -25,8 +25,6 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.isLocalHost
import kotlinx.coroutines.flow.MutableStateFlow
import java.lang.ref.WeakReference
import kotlin.collections.mapOf
import kotlin.collections.plus
@Stable
data class RelayInfo(
@@ -33,9 +33,6 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.update
import kotlin.collections.component1
import kotlin.collections.component2
import kotlin.collections.set
@Stable
class PollResponsesCache : UserDependencies {
@@ -25,7 +25,6 @@ import com.vitorpamplona.quartz.nip01Core.core.Event
import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter
import java.util.SortedSet
import java.util.concurrent.ConcurrentSkipListSet
import kotlin.collections.mapNotNull
/**
* Creates a list of events (regular and addressable)
@@ -25,7 +25,6 @@ import com.vitorpamplona.quartz.nip01Core.core.Event
import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter
import java.util.SortedSet
import java.util.concurrent.ConcurrentSkipListSet
import kotlin.collections.toList
/**
* Creates a list of notes (regular and addressable)
@@ -31,7 +31,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
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.LazyListState
@@ -62,7 +61,6 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.min
@@ -42,7 +42,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.ui.input.key.isCtrlPressed
@@ -26,7 +26,6 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.core.builder
import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent.Companion.updateOrDeleteTagNames
import com.vitorpamplona.quartz.nip01Core.metadata.tags.AboutTag
import com.vitorpamplona.quartz.nip01Core.metadata.tags.BannerTag
import com.vitorpamplona.quartz.nip01Core.metadata.tags.DisplayNameTag
@@ -54,7 +53,6 @@ import com.vitorpamplona.quartz.utils.text
import kotlinx.coroutines.CancellationException
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonNull.content
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
@@ -35,7 +35,6 @@ import com.vitorpamplona.quartz.nip01Core.tags.people.isTaggedUser
import com.vitorpamplona.quartz.nip02FollowList.tags.ContactTag
import com.vitorpamplona.quartz.nip31Alts.AltTag
import com.vitorpamplona.quartz.utils.TimeUtils
import kotlinx.serialization.json.JsonNull.content
@Stable
class ContactListEvent(
@@ -28,7 +28,6 @@ import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.utils.TimeUtils
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
/**
@@ -22,14 +22,10 @@ package com.vitorpamplona.quartz.nip88Polls.poll
import com.vitorpamplona.quartz.nip01Core.core.TagArray
import com.vitorpamplona.quartz.nip88Polls.poll.tags.EndsAtTag
import com.vitorpamplona.quartz.nip88Polls.poll.tags.EndsAtTag.Companion.parse
import com.vitorpamplona.quartz.nip88Polls.poll.tags.OptionTag
import com.vitorpamplona.quartz.nip88Polls.poll.tags.OptionTag.Companion.parse
import com.vitorpamplona.quartz.nip88Polls.poll.tags.PollType
import com.vitorpamplona.quartz.nip88Polls.poll.tags.PollTypeTag
import com.vitorpamplona.quartz.nip88Polls.poll.tags.PollTypeTag.Companion.parse
import com.vitorpamplona.quartz.nip88Polls.poll.tags.RelayTag
import com.vitorpamplona.quartz.nip88Polls.poll.tags.RelayTag.Companion.parse
import com.vitorpamplona.quartz.utils.TimeUtils
fun TagArray.options() = mapNotNull(OptionTag::parse)
@@ -28,15 +28,10 @@ import com.vitorpamplona.quartz.nip01Core.hints.EventHintBundle
import com.vitorpamplona.quartz.nip01Core.hints.EventHintProvider
import com.vitorpamplona.quartz.nip01Core.hints.PubKeyHintProvider
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip01Core.tags.events.ETag.Companion.parseAsHint
import com.vitorpamplona.quartz.nip01Core.tags.events.ETag.Companion.parseId
import com.vitorpamplona.quartz.nip01Core.tags.people.PTag
import com.vitorpamplona.quartz.nip01Core.tags.people.PTag.Companion.parseAsHint
import com.vitorpamplona.quartz.nip01Core.tags.people.PTag.Companion.parseKey
import com.vitorpamplona.quartz.nip22Comments.RootScope
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip88Polls.poll.PollEvent
import com.vitorpamplona.quartz.nip88Polls.response.responses
import com.vitorpamplona.quartz.nip88Polls.response.tags.PollTag
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -21,14 +21,8 @@
package com.vitorpamplona.quartz.nip88Polls.response
import com.vitorpamplona.quartz.nip01Core.core.TagArray
import com.vitorpamplona.quartz.nip01Core.tags.events.ETag.Companion.parse
import com.vitorpamplona.quartz.nip88Polls.poll.tags.EndsAtTag.Companion.parse
import com.vitorpamplona.quartz.nip88Polls.poll.tags.OptionTag.Companion.parse
import com.vitorpamplona.quartz.nip88Polls.poll.tags.PollTypeTag.Companion.parse
import com.vitorpamplona.quartz.nip88Polls.poll.tags.RelayTag.Companion.parse
import com.vitorpamplona.quartz.nip88Polls.response.tags.PollTag
import com.vitorpamplona.quartz.nip88Polls.response.tags.ResponseTag
import com.vitorpamplona.quartz.nip88Polls.response.tags.ResponseTag.Companion.parse
fun TagArray.responses() = mapNotNull(ResponseTag::parse)