gitextract_xytv9ppo/ ├── .editorconfig ├── .geminiignore ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ └── feature_request.yml │ ├── actions/ │ │ ├── setup-android-release/ │ │ │ └── action.yml │ │ ├── setup-gradle/ │ │ │ └── action.yml │ │ ├── setup-ios/ │ │ │ └── action.yml │ │ └── setup-ios-release/ │ │ └── action.yml │ ├── release.yml │ ├── renovate.json │ └── workflows/ │ ├── baseline-profile.yml │ ├── beta-release.yml │ ├── ci.yml │ ├── compare-screenshot.yml │ ├── daily-build.yml │ ├── nightly-integration-tests.yml │ ├── promote-release.yml │ ├── release.yml │ └── store-screenshot.yml ├── .gitignore ├── .idea/ │ ├── codeStyles/ │ │ ├── Project.xml │ │ └── codeStyleConfig.xml │ └── dictionaries/ │ └── project.xml ├── .ruby-version ├── .swiftformat ├── .swiftlint.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── GEMINI.md ├── Gemfile ├── LICENSE ├── README.md ├── android-designsystem/ │ ├── build.gradle.kts │ └── src/ │ ├── debug/ │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ ├── main/ │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── compose/ │ │ │ ├── components/ │ │ │ │ ├── Background.kt │ │ │ │ ├── BadgeChip.kt │ │ │ │ ├── Buttons.kt │ │ │ │ ├── Card.kt │ │ │ │ ├── Chip.kt │ │ │ │ ├── Dialogs.kt │ │ │ │ ├── EmptyLayout.kt │ │ │ │ ├── ErrorLayout.kt │ │ │ │ ├── FilterChipSection.kt │ │ │ │ ├── GradientScrim.kt │ │ │ │ ├── Image.kt │ │ │ │ ├── NavigationBar.kt │ │ │ │ ├── NotificationRationaleContent.kt │ │ │ │ ├── PosterPlaceholder.kt │ │ │ │ ├── ProgressIndicator.kt │ │ │ │ ├── ScanlineOverlay.kt │ │ │ │ ├── SearchTextField.kt │ │ │ │ ├── SegmentedProgressBar.kt │ │ │ │ ├── SheetDragHandle.kt │ │ │ │ ├── ShowLinearProgressIndicator.kt │ │ │ │ ├── Snackbar.kt │ │ │ │ ├── Text.kt │ │ │ │ ├── TextTitlePill.kt │ │ │ │ ├── TopBar.kt │ │ │ │ ├── TvManiacBottomSheet.kt │ │ │ │ └── TvManiacPreviewWrapperProvider.kt │ │ │ ├── extensions/ │ │ │ │ ├── GradientExtensions.kt │ │ │ │ ├── LazyListExtensions.kt │ │ │ │ ├── PaddingValuesExtentions.kt │ │ │ │ └── ScrimExtentions.kt │ │ │ ├── theme/ │ │ │ │ ├── Background.kt │ │ │ │ ├── Colors.kt │ │ │ │ ├── Shape.kt │ │ │ │ ├── Theme.kt │ │ │ │ └── Type.kt │ │ │ └── util/ │ │ │ ├── AutoAdvanceLocal.kt │ │ │ └── DynamicTheming.kt │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── test/ │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── compose/ │ └── roborazzi/ │ ├── NotificationRationaleContentScreenshotTest.kt │ └── TvManiacSnackBarScreenshotTest.kt ├── api/ │ ├── tmdb/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── tmdb/ │ │ │ └── api/ │ │ │ ├── TmdbConfig.kt │ │ │ ├── TmdbSeasonDetailsNetworkDataSource.kt │ │ │ ├── TmdbShowDetailsNetworkDataSource.kt │ │ │ ├── TmdbShowsNetworkDataSource.kt │ │ │ └── model/ │ │ │ ├── CreditsResponse.kt │ │ │ ├── EpisodesResponse.kt │ │ │ ├── GenreResponse.kt │ │ │ ├── ImagesResponse.kt │ │ │ ├── LastEpisodeToAirResponse.kt │ │ │ ├── NetworksResponse.kt │ │ │ ├── NextEpisodeToAirResponse.kt │ │ │ ├── SeasonsResponse.kt │ │ │ ├── TmdbGenreResult.kt │ │ │ ├── TmdbSeasonDetailsResponse.kt │ │ │ ├── TmdbShowDetailsResponse.kt │ │ │ ├── TmdbShowResponse.kt │ │ │ ├── VideosResponse.kt │ │ │ └── WatchProvidersResult.kt │ │ └── implementation/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── tmdb/ │ │ │ └── implementation/ │ │ │ └── TmdbPlatformBindingContainer.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── tmdb/ │ │ │ └── implementation/ │ │ │ ├── DefaultTmdbSeasonDetailsNetworkDataSource.kt │ │ │ ├── DefaultTmdbShowDetailsNetworkDataSource.kt │ │ │ ├── DefaultTmdbShowsNetworkDataSource.kt │ │ │ ├── TmdbBindingContainer.kt │ │ │ └── TmdbClient.kt │ │ └── iosMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── tmdb/ │ │ └── implementation/ │ │ └── TmdbPlatformBindingContainer.kt │ └── trakt/ │ ├── api/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── trakt/ │ │ └── api/ │ │ ├── TraktCalendarRemoteDataSource.kt │ │ ├── TraktConfig.kt │ │ ├── TraktEpisodeHistoryRemoteDataSource.kt │ │ ├── TraktListRemoteDataSource.kt │ │ ├── TraktShowsRemoteDataSource.kt │ │ ├── TraktSyncRemoteDataSource.kt │ │ ├── TraktTokenRemoteDataSource.kt │ │ ├── TraktUserRemoteDataSource.kt │ │ └── model/ │ │ ├── AccessTokenBody.kt │ │ ├── RefreshAccessTokenBody.kt │ │ ├── TraktAccessRefreshTokenResponse.kt │ │ ├── TraktAccessTokenResponse.kt │ │ ├── TraktAddShowRequest.kt │ │ ├── TraktAddShowToListResponse.kt │ │ ├── TraktCalendarResponse.kt │ │ ├── TraktCreateListRequest.kt │ │ ├── TraktCreateListResponse.kt │ │ ├── TraktFollowedShowResponse.kt │ │ ├── TraktGenreResponse.kt │ │ ├── TraktLastActivitiesResponse.kt │ │ ├── TraktNextEpisodeResponse.kt │ │ ├── TraktPeopleResponse.kt │ │ ├── TraktPersonalListsResponse.kt │ │ ├── TraktRemoveShowFromListResponse.kt │ │ ├── TraktSeasonEpisodesResponse.kt │ │ ├── TraktSeasonsResponse.kt │ │ ├── TraktShowsResponse.kt │ │ ├── TraktSyncModels.kt │ │ ├── TraktUserResponse.kt │ │ ├── TraktUserStatsResponse.kt │ │ ├── TraktVideosResponse.kt │ │ └── TraktWatchedProgressResponse.kt │ └── implementation/ │ ├── build.gradle.kts │ └── src/ │ ├── androidMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── trakt/ │ │ └── service/ │ │ └── implementation/ │ │ └── TraktPlatformBindingContainer.kt │ ├── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── trakt/ │ │ └── service/ │ │ └── implementation/ │ │ ├── TraktAuthPlugin.kt │ │ ├── TraktBindingContainer.kt │ │ ├── TraktHttpClient.kt │ │ └── api/ │ │ ├── DefaultTraktCalendarRemoteDataSource.kt │ │ ├── DefaultTraktEpisodeRemoteDataSource.kt │ │ ├── DefaultTraktListRemoteDataSource.kt │ │ ├── DefaultTraktShowsRemoteDataSource.kt │ │ ├── DefaultTraktSyncRemoteDataSource.kt │ │ ├── DefaultTraktTokenRemoteDataSource.kt │ │ └── DefaultTraktUserRemoteDataSource.kt │ ├── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── trakt/ │ │ └── service/ │ │ └── implementation/ │ │ └── TraktAuthGuardPluginTest.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── trakt/ │ │ └── service/ │ │ └── implementation/ │ │ └── TraktPlatformBindingContainer.kt │ └── jvmTest/ │ ├── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── trakt/ │ │ └── service/ │ │ └── implementation/ │ │ ├── TestResourceLoader.jvm.kt │ │ └── api/ │ │ └── DefaultTraktListRemoteDataSourceTest.kt │ └── resources/ │ ├── trakt_add_show_response.json │ ├── trakt_error_response.json │ └── trakt_user_response.json ├── app/ │ ├── benchmark-rules.pro │ ├── build.gradle.kts │ ├── lint-baseline.xml │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── app/ │ │ └── test/ │ │ └── runner/ │ │ └── TvManiacInstrumentationRunner.kt │ ├── debug/ │ │ ├── AndroidManifest.xml │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── app/ │ │ │ └── debug/ │ │ │ ├── DebugNotificationIconProvider.kt │ │ │ ├── DebugNotificationInitializer.kt │ │ │ └── di/ │ │ │ └── DebugNotificationInitializerBindingContainer.kt │ │ └── res/ │ │ └── drawable/ │ │ ├── ic_app_launcher.xml │ │ ├── ic_debug_bug.xml │ │ └── ic_launcher_foreground.xml │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── generated/ │ │ │ └── baselineProfiles/ │ │ │ ├── baseline-prof.txt │ │ │ └── startup-prof.txt │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── app/ │ │ │ ├── MainActivity.kt │ │ │ ├── TvManicApplication.kt │ │ │ ├── di/ │ │ │ │ ├── ActivityGraph.kt │ │ │ │ └── ApplicationGraph.kt │ │ │ └── util/ │ │ │ ├── AppNotificationIconProvider.kt │ │ │ └── TvManiacWorkerFactory.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ ├── ic_app_launcher.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_monochrome.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ └── themes.xml │ │ ├── values-night/ │ │ │ ├── colors.xml │ │ │ └── themes.xml │ │ └── xml/ │ │ ├── backup_rules.xml │ │ └── data_extraction_rules.xml │ ├── sharedTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── app/ │ │ └── test/ │ │ ├── BaseAppFlowTest.kt │ │ ├── TestAppComponent.kt │ │ ├── TvManiacTestApplication.kt │ │ └── compose/ │ │ ├── TvManiacTestActivity.kt │ │ ├── flows/ │ │ │ ├── calendar/ │ │ │ │ └── CalendarFlowTest.kt │ │ │ ├── discover/ │ │ │ │ ├── DiscoverToSeasonDetailsFlowTest.kt │ │ │ │ └── DiscoverToShowDetailsFollowFlowTest.kt │ │ │ ├── library/ │ │ │ │ └── LibraryFlowTest.kt │ │ │ ├── search/ │ │ │ │ └── SearchFlowTest.kt │ │ │ ├── seasons/ │ │ │ │ └── SeasonFlowTest.kt │ │ │ ├── settings/ │ │ │ │ └── SettingsFlowTest.kt │ │ │ ├── sheet/ │ │ │ │ └── EpisodeSheetFlowTest.kt │ │ │ ├── showdetails/ │ │ │ │ └── ShowDetailsFeaturesFlowTest.kt │ │ │ ├── upnext/ │ │ │ │ └── UpNextFlowTests.kt │ │ │ └── userlists/ │ │ │ └── UserListFlowTests.kt │ │ ├── journey/ │ │ │ ├── AuthenticatedUserJourneyTest.kt │ │ │ └── UnauthenticatedUserJourneyTest.kt │ │ ├── robot/ │ │ │ ├── CalendarRobot.kt │ │ │ ├── DiscoverRobot.kt │ │ │ ├── EpisodeSheetRobot.kt │ │ │ ├── HomeRobot.kt │ │ │ ├── LibraryRobot.kt │ │ │ ├── ProfileRobot.kt │ │ │ ├── ProgressRobot.kt │ │ │ ├── RootRobot.kt │ │ │ ├── SearchRobot.kt │ │ │ ├── SeasonDetailsRobot.kt │ │ │ ├── SettingsRobot.kt │ │ │ └── ShowDetailsRobot.kt │ │ └── stubs/ │ │ └── Scenarios.kt │ └── test/ │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── app/ │ └── test/ │ └── graph/ │ ├── GraphFactories.kt │ └── NavigationRouteTest.kt ├── benchmark/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── benchmark/ │ ├── Common.kt │ ├── baselineprofile/ │ │ └── BaselineProfileGenerator.kt │ └── benchmark/ │ └── StartupBenchmarks.kt ├── build.gradle.kts ├── cliff.toml ├── compose-stability.conf ├── core/ │ ├── appconfig/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── appconfig/ │ │ │ └── ApplicationInfo.kt │ │ └── implementation/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── appconfig/ │ │ │ └── AndroidAppConfigBindingContainer.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── appconfig/ │ │ │ ├── DefaultTmdbConfig.kt │ │ │ └── DefaultTraktConfig.kt │ │ └── iosMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── appconfig/ │ │ └── IosAppConfigBindingContainer.kt │ ├── base/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── base/ │ │ │ └── di/ │ │ │ └── BaseAndroidBindingContainer.kt │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── core/ │ │ └── base/ │ │ ├── ActivityScope.kt │ │ ├── AppInitializers.kt │ │ ├── Initializer.kt │ │ ├── Qualifiers.kt │ │ ├── di/ │ │ │ ├── BaseBindingContainer.kt │ │ │ └── InitializerMultibindings.kt │ │ ├── extensions/ │ │ │ ├── Combine.kt │ │ │ ├── DecomposeUtils.kt │ │ │ ├── Lazy.kt │ │ │ └── ParallelUtils.kt │ │ ├── interactor/ │ │ │ └── Interactor.kt │ │ └── model/ │ │ └── AppCoroutineDispatchers.kt │ ├── connectivity/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── connectivity/ │ │ │ └── api/ │ │ │ └── InternetConnectionChecker.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── connectivity/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformInternetConnectionChecker.android.kt │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── connectivity/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformInternetConnectionChecker.kt │ │ │ ├── iosMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── connectivity/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformInternetConnectionChecker.ios.kt │ │ │ └── jvmMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── connectivity/ │ │ │ └── implementation/ │ │ │ └── PlatformInternetConnectionChecker.jvm.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── core/ │ │ └── connectivity/ │ │ └── testing/ │ │ └── FakeInternetConnectionChecker.kt │ ├── imageloading/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── imageloading/ │ │ │ └── api/ │ │ │ └── ImageQualityProvider.kt │ │ └── implementation/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── imageloading/ │ │ └── implementation/ │ │ ├── CoilImageLoaderFactory.kt │ │ ├── CoilImageLoaderInitializer.kt │ │ ├── DefaultImageQualityProvider.kt │ │ ├── di/ │ │ │ ├── CoilImageLoaderInitializerBindingContainer.kt │ │ │ └── ImageLoadingBindingContainer.kt │ │ └── interceptors/ │ │ └── TmdbInterceptor.kt │ ├── integration/ │ │ ├── infra/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidHostTest/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── kotlin/ │ │ │ │ │ └── com/ │ │ │ │ │ └── thomaskioko/ │ │ │ │ │ └── tvmaniac/ │ │ │ │ │ └── testing/ │ │ │ │ │ └── integration/ │ │ │ │ │ ├── EndpointsCatalogTest.kt │ │ │ │ │ ├── FixtureLoaderTest.kt │ │ │ │ │ └── MockEngineHandlerTest.kt │ │ │ │ └── resources/ │ │ │ │ └── fixtures/ │ │ │ │ └── test/ │ │ │ │ └── hello.json │ │ │ ├── androidMain/ │ │ │ │ ├── kotlin/ │ │ │ │ │ └── com/ │ │ │ │ │ └── thomaskioko/ │ │ │ │ │ └── tvmaniac/ │ │ │ │ │ └── testing/ │ │ │ │ │ └── integration/ │ │ │ │ │ ├── Endpoints.kt │ │ │ │ │ ├── MockEngineHandler.kt │ │ │ │ │ ├── SearchStubs.kt │ │ │ │ │ ├── ShowFixtures.kt │ │ │ │ │ ├── bindings/ │ │ │ │ │ │ ├── TestAuthBindingContainer.kt │ │ │ │ │ │ ├── TestConnectivityBindingContainer.kt │ │ │ │ │ │ ├── TestDateTimeBindingContainer.kt │ │ │ │ │ │ ├── TestDispatcherBindingContainer.kt │ │ │ │ │ │ ├── TestImageLoaderBindingContainer.kt │ │ │ │ │ │ ├── TestInitializerBindingContainer.kt │ │ │ │ │ │ ├── TestLoggerBindingContainer.kt │ │ │ │ │ │ ├── TestNotificationBindingContainer.kt │ │ │ │ │ │ ├── TestTmdbBindingContainer.kt │ │ │ │ │ │ ├── TestTraktAuthManagerBindingContainer.kt │ │ │ │ │ │ ├── TestTraktBindingContainer.kt │ │ │ │ │ │ └── TestWorkerBindingContainer.kt │ │ │ │ │ └── util/ │ │ │ │ │ └── FixtureLoader.kt │ │ │ │ └── resources/ │ │ │ │ └── fixtures/ │ │ │ │ ├── empty_array.json │ │ │ │ ├── tmdb/ │ │ │ │ │ ├── credits/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── details/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── discover/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ └── watchproviders/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ └── trakt/ │ │ │ │ ├── calendar/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ ├── episodes/ │ │ │ │ │ ├── season1/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ └── season2/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ ├── genres/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ ├── search/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ ├── seasons/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ ├── shows/ │ │ │ │ │ ├── details/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── favorite/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── people/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── popular/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── progress/ │ │ │ │ │ │ ├── refreshed/ │ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ │ └── success.json │ │ │ │ │ │ └── watched/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── related/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── trending/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ └── videos/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ ├── sync/ │ │ │ │ │ ├── error.json │ │ │ │ │ ├── history/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ └── success.json │ │ │ │ └── users/ │ │ │ │ ├── lists/ │ │ │ │ │ ├── create/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── error.json │ │ │ │ │ ├── items/ │ │ │ │ │ │ ├── add/ │ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ │ └── success.json │ │ │ │ │ │ └── remove/ │ │ │ │ │ │ ├── error.json │ │ │ │ │ │ └── success.json │ │ │ │ │ └── success.json │ │ │ │ ├── me/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ ├── stats/ │ │ │ │ │ ├── error.json │ │ │ │ │ └── success.json │ │ │ │ └── watchlist/ │ │ │ │ ├── error.json │ │ │ │ └── success.json │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── testing/ │ │ │ │ └── di/ │ │ │ │ ├── FakeAppConfigBindingContainer.kt │ │ │ │ └── TestScope.kt │ │ │ ├── iosMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── testing/ │ │ │ │ └── di/ │ │ │ │ ├── FakeIosPlatformBindingContainer.kt │ │ │ │ ├── RunTestWithGraph.kt │ │ │ │ └── TestGraph.kt │ │ │ ├── jvmAndIosMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── testing/ │ │ │ │ └── di/ │ │ │ │ └── FakeAppBindingContainer.kt │ │ │ ├── jvmMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── testing/ │ │ │ │ └── di/ │ │ │ │ ├── RunTestWithGraph.kt │ │ │ │ ├── TestGraph.kt │ │ │ │ └── TestJvmPlatformBindingContainer.kt │ │ │ └── jvmTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── testing/ │ │ │ └── di/ │ │ │ └── TestJvmGraphTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── androidMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── testing/ │ │ └── integration/ │ │ └── ui/ │ │ ├── BaseRobot.kt │ │ └── SystemDialogUtil.kt │ ├── locale/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── locale/ │ │ │ └── api/ │ │ │ ├── Language.kt │ │ │ └── LocaleProvider.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidDeviceTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── locale/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformLocaleProviderAndroidTest.kt │ │ │ ├── androidMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── locale/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformLocaleProvider.android.kt │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── locale/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultLocaleProvider.kt │ │ │ │ └── PlatformLocaleProvider.kt │ │ │ ├── commonTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── locale/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformLocaleProviderTest.kt │ │ │ ├── iosMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── locale/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformLocaleProvider.ios.kt │ │ │ ├── iosTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── locale/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformLocaleProviderIosTest.kt │ │ │ ├── jvmMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── locale/ │ │ │ │ └── implementation/ │ │ │ │ └── PlatformLocaleProvider.jvm.kt │ │ │ └── jvmTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── locale/ │ │ │ └── implementation/ │ │ │ └── PlatformLocaleProviderJvmTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── locale/ │ │ └── testing/ │ │ └── FakeLocaleProvider.kt │ ├── logger/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── logger/ │ │ │ │ ├── CrashReporter.kt │ │ │ │ └── Logger.kt │ │ │ └── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── logger/ │ │ │ ├── CrashReportingBridge.kt │ │ │ └── CrashReportingBridgeHolder.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── logger/ │ │ │ │ ├── AndroidCrashReporter.kt │ │ │ │ └── AndroidLoggerBindingContainer.kt │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── logger/ │ │ │ │ ├── CompositeLogger.kt │ │ │ │ ├── FirebaseCrashLogger.kt │ │ │ │ ├── KermitLogger.kt │ │ │ │ └── LoggingInitializer.kt │ │ │ └── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── logger/ │ │ │ ├── IosCrashReporter.kt │ │ │ ├── IosCrashReporterBindingContainer.kt │ │ │ └── NoOpCrashReportingBridge.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── core/ │ │ └── logger/ │ │ └── fixture/ │ │ ├── FakeCrashReporter.kt │ │ └── FakeLogger.kt │ ├── network-util/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── networkutil/ │ │ │ │ └── api/ │ │ │ │ ├── ApiRateLimiter.kt │ │ │ │ ├── extensions/ │ │ │ │ │ ├── ApiRateLimiterExtensions.kt │ │ │ │ │ ├── ApiResponseExtensions.kt │ │ │ │ │ ├── InternetConnectionPlugin.kt │ │ │ │ │ └── StoreExtensions.kt │ │ │ │ └── model/ │ │ │ │ ├── ApiExceptions.kt │ │ │ │ ├── ApiResponse.kt │ │ │ │ ├── AuthenticationException.kt │ │ │ │ ├── HttpExceptions.kt │ │ │ │ ├── NoInternetException.kt │ │ │ │ ├── SyncError.kt │ │ │ │ └── SyncException.kt │ │ │ ├── commonTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── networkutil/ │ │ │ │ └── api/ │ │ │ │ └── model/ │ │ │ │ └── ThrowableToSyncErrorTest.kt │ │ │ └── jvmTest/ │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── networkutil/ │ │ │ │ └── api/ │ │ │ │ └── extensions/ │ │ │ │ ├── ApiResponseExtensionsTest.kt │ │ │ │ ├── InternetConnectionPluginTest.kt │ │ │ │ └── TestResourceLoader.jvm.kt │ │ │ └── resources/ │ │ │ ├── error_response.json │ │ │ └── success_response.json │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── networkutil/ │ │ │ │ └── ratelimit/ │ │ │ │ └── AdaptiveApiRateLimiter.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── networkutil/ │ │ │ ├── model/ │ │ │ │ └── SyncErrorTest.kt │ │ │ └── ratelimit/ │ │ │ └── AdaptiveApiRateLimiterTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── core/ │ │ └── networkutil/ │ │ └── testing/ │ │ └── FakeApiRateLimiter.kt │ ├── notifications/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── notifications/ │ │ │ │ └── api/ │ │ │ │ └── NotificationIconProvider.kt │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── notifications/ │ │ │ └── api/ │ │ │ ├── EpisodeNotification.kt │ │ │ ├── NotificationChannel.kt │ │ │ └── NotificationManager.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── notifications/ │ │ │ │ └── implementation/ │ │ │ │ ├── AndroidNotificationManager.kt │ │ │ │ ├── BootCompletedReceiver.kt │ │ │ │ ├── DebugNotificationManager.kt │ │ │ │ ├── EpisodeNotificationReceiver.kt │ │ │ │ ├── PendingNotificationsStore.kt │ │ │ │ └── model/ │ │ │ │ └── StoredNotification.kt │ │ │ └── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── notifications/ │ │ │ └── implementation/ │ │ │ └── IosNotificationManager.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── core/ │ │ └── notifications/ │ │ └── testing/ │ │ └── FakeNotificationManager.kt │ ├── paging/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── core/ │ │ └── paging/ │ │ ├── CommonPagingConfig.kt │ │ ├── KeyedQueryPagingSource.kt │ │ ├── OffsetQueryPagingSource.kt │ │ ├── PaginatedRemoteMediator.kt │ │ └── QueryPagingSource.kt │ ├── screenshot-tests/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── screenshottests/ │ │ └── RoborazziScreenshotUtil.kt │ ├── tasks/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── tasks/ │ │ │ └── api/ │ │ │ ├── BackgroundTaskScheduler.kt │ │ │ ├── BackgroundWorker.kt │ │ │ ├── PeriodicTaskRequest.kt │ │ │ ├── TaskConstraints.kt │ │ │ ├── WorkerFactory.kt │ │ │ └── WorkerResult.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── tasks/ │ │ │ │ └── implementation/ │ │ │ │ ├── AndroidTaskScheduler.kt │ │ │ │ ├── SchedulerDispatchWorker.kt │ │ │ │ └── di/ │ │ │ │ └── WorkManagerBindingContainer.kt │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── core/ │ │ │ │ └── tasks/ │ │ │ │ └── implementation/ │ │ │ │ └── DefaultWorkerFactory.kt │ │ │ └── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── core/ │ │ │ └── tasks/ │ │ │ └── implementation/ │ │ │ └── IosTaskScheduler.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── core/ │ │ └── tasks/ │ │ └── testing/ │ │ └── FakeBackgroundTaskScheduler.kt │ ├── test-tags/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── testtags/ │ │ ├── calendar/ │ │ │ └── CalendarTestTags.kt │ │ ├── component/ │ │ │ └── DesignComponentTestTags.kt │ │ ├── discover/ │ │ │ └── DiscoverTestTags.kt │ │ ├── episodesheet/ │ │ │ └── EpisodeSheetTestTags.kt │ │ ├── home/ │ │ │ └── HomeTestTags.kt │ │ ├── library/ │ │ │ └── LibraryTestTags.kt │ │ ├── moreshows/ │ │ │ └── MoreShowsTestTags.kt │ │ ├── notifications/ │ │ │ └── NotificationRationaleTestTags.kt │ │ ├── profile/ │ │ │ └── ProfileTestTags.kt │ │ ├── progress/ │ │ │ └── ProgressTestTags.kt │ │ ├── search/ │ │ │ └── SearchTestTags.kt │ │ ├── seasondetails/ │ │ │ └── SeasonDetailsTestTags.kt │ │ ├── settings/ │ │ │ └── SettingsTestTags.kt │ │ ├── showdetails/ │ │ │ └── ShowDetailsTestTags.kt │ │ └── upnext/ │ │ └── UpNextTestTags.kt │ ├── util/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── util/ │ │ │ └── api/ │ │ │ ├── AppUtils.kt │ │ │ ├── DateTimeProvider.kt │ │ │ ├── FormatterUtil.kt │ │ │ └── ItemSyncer.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── util/ │ │ │ │ ├── AndroidAppUtils.kt │ │ │ │ └── AndroidFormatterUtil.kt │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── util/ │ │ │ │ ├── DateTimeBindingContainer.kt │ │ │ │ └── DefaultDateTimeProvider.kt │ │ │ ├── commonTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── util/ │ │ │ │ └── DefaultDateTimeProviderTest.kt │ │ │ ├── iosMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── util/ │ │ │ │ ├── IosAppUtils.kt │ │ │ │ └── IosFormatterUtil.kt │ │ │ ├── iosTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── util/ │ │ │ │ └── IosFormatterUtilTest.kt │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── util/ │ │ │ └── AndroidFormatterUtilTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── util/ │ │ │ └── testing/ │ │ │ ├── FakeApplicationInfo.kt │ │ │ ├── FakeDateTimeProvider.kt │ │ │ ├── FakeFormatterUtil.kt │ │ │ └── FlakyTests.kt │ │ └── jvmAndroidMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── util/ │ │ └── testing/ │ │ └── FlakyTestRule.kt │ └── view/ │ ├── build.gradle.kts │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── core/ │ └── view/ │ ├── ErrorToStringMapper.kt │ ├── InvokeStatus.kt │ ├── ObservableLoadingCounter.kt │ └── UiMessage.kt ├── data/ │ ├── calendar/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── calendar/ │ │ │ ├── CalendarDao.kt │ │ │ ├── CalendarEntry.kt │ │ │ └── CalendarRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── calendar/ │ │ │ └── implementation/ │ │ │ ├── CalendarStore.kt │ │ │ ├── DefaultCalendarDao.kt │ │ │ └── DefaultCalendarRepository.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── calendar/ │ │ └── testing/ │ │ └── FakeCalendarRepository.kt │ ├── cast/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── cast/ │ │ │ └── api/ │ │ │ ├── CastDao.kt │ │ │ └── CastRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── cast/ │ │ │ └── implementation/ │ │ │ ├── DefaultCastDao.kt │ │ │ ├── DefaultCastRepository.kt │ │ │ ├── ShowCastResult.kt │ │ │ └── ShowCastStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── cast/ │ │ └── testing/ │ │ └── FakeCastRepository.kt │ ├── database/ │ │ ├── sqldelight/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── db/ │ │ │ │ └── DatabasePlatformBindingContainer.kt │ │ │ ├── commonMain/ │ │ │ │ └── sqldelight/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ ├── db/ │ │ │ │ │ ├── Calendar.sq │ │ │ │ │ ├── Cast.sq │ │ │ │ │ ├── EpisodeImage.sq │ │ │ │ │ ├── Episodes.sq │ │ │ │ │ ├── FeaturedShows.sq │ │ │ │ │ ├── FollowedShows.sq │ │ │ │ │ ├── GenreShows.sq │ │ │ │ │ ├── Genres.sq │ │ │ │ │ ├── LastRequests.sq │ │ │ │ │ ├── Library.sq │ │ │ │ │ ├── NextEpisodes.sq │ │ │ │ │ ├── PopularShows.sq │ │ │ │ │ ├── RecommendedShows.sq │ │ │ │ │ ├── SeasonImages.sq │ │ │ │ │ ├── SeasonVideos.sq │ │ │ │ │ ├── Seasons.sq │ │ │ │ │ ├── ShowGenres.sq │ │ │ │ │ ├── ShowMetadata.sq │ │ │ │ │ ├── ShowsLastWatched.sq │ │ │ │ │ ├── ShowsNextToWatch.sq │ │ │ │ │ ├── SimilarShows.sq │ │ │ │ │ ├── Stats.sq │ │ │ │ │ ├── TopratedShows.sq │ │ │ │ │ ├── Trailers.sq │ │ │ │ │ ├── TraktGenres.sq │ │ │ │ │ ├── TraktLastActivity.sq │ │ │ │ │ ├── TraktListShows.sq │ │ │ │ │ ├── TraktLists.sq │ │ │ │ │ ├── TrendingShows.sq │ │ │ │ │ ├── TvShow.sq │ │ │ │ │ ├── UpcomingShows.sq │ │ │ │ │ ├── User.sq │ │ │ │ │ ├── WatchProviders.sq │ │ │ │ │ └── WatchedEpisodes.sq │ │ │ │ └── migrations/ │ │ │ │ ├── 1.sqm │ │ │ │ ├── 10.sqm │ │ │ │ ├── 11.sqm │ │ │ │ ├── 12.sqm │ │ │ │ ├── 13.sqm │ │ │ │ ├── 14.sqm │ │ │ │ ├── 15.sqm │ │ │ │ ├── 16.sqm │ │ │ │ ├── 17.sqm │ │ │ │ ├── 18.sqm │ │ │ │ ├── 19.sqm │ │ │ │ ├── 2.sqm │ │ │ │ ├── 20.sqm │ │ │ │ ├── 21.sqm │ │ │ │ ├── 22.sqm │ │ │ │ ├── 23.sqm │ │ │ │ ├── 3.sqm │ │ │ │ ├── 4.sqm │ │ │ │ ├── 5.sqm │ │ │ │ ├── 6.sqm │ │ │ │ ├── 7.sqm │ │ │ │ ├── 8.sqm │ │ │ │ └── 9.sqm │ │ │ ├── iosMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── db/ │ │ │ │ └── DatabasePlatformBindingContainer.kt │ │ │ └── jvmTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── db/ │ │ │ ├── Migration22TraktListShowsTest.kt │ │ │ ├── Migration23DropParentFkTest.kt │ │ │ ├── SchemaCreateTest.kt │ │ │ └── util/ │ │ │ └── MigrationTestUtil.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── database/ │ │ │ └── test/ │ │ │ └── BaseDatabaseTest.android.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── database/ │ │ │ └── test/ │ │ │ └── BaseDatabaseTest.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── database/ │ │ │ └── test/ │ │ │ └── BaseDatabaseTest.ios.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── database/ │ │ └── test/ │ │ └── BaseDatabaseTest.jvm.kt │ ├── datastore/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── datastore/ │ │ │ └── api/ │ │ │ ├── AppTheme.kt │ │ │ ├── DatastoreRepository.kt │ │ │ ├── ImageQuality.kt │ │ │ └── ListStyle.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ ├── src/ │ │ │ │ ├── androidMain/ │ │ │ │ │ └── kotlin/ │ │ │ │ │ └── com/ │ │ │ │ │ └── thomaskioko/ │ │ │ │ │ └── tvmaniac/ │ │ │ │ │ └── datastore/ │ │ │ │ │ └── implementation/ │ │ │ │ │ └── DataStorePlatformBindingContainer.kt │ │ │ │ ├── commonMain/ │ │ │ │ │ └── kotlin/ │ │ │ │ │ └── com/ │ │ │ │ │ └── thomaskioko/ │ │ │ │ │ └── tvmaniac/ │ │ │ │ │ └── datastore/ │ │ │ │ │ └── implementation/ │ │ │ │ │ ├── DataStoreHelper.kt │ │ │ │ │ └── DefaultDatastoreRepository.kt │ │ │ │ ├── commonTest/ │ │ │ │ │ └── kotlin/ │ │ │ │ │ └── com/ │ │ │ │ │ └── thomaskioko/ │ │ │ │ │ └── tvmaniac/ │ │ │ │ │ └── datastore/ │ │ │ │ │ └── implemetation/ │ │ │ │ │ └── DatastoreRepositoryTest.kt │ │ │ │ └── iosMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── datastore/ │ │ │ │ └── implementation/ │ │ │ │ └── DataStorePlatformBindingContainer.kt │ │ │ └── test.preferences_pb │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── datastore/ │ │ └── testing/ │ │ └── FakeDatastoreRepository.kt │ ├── episode/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── episodes/ │ │ │ └── api/ │ │ │ ├── EpisodeRepository.kt │ │ │ ├── EpisodeWatchesDataSource.kt │ │ │ ├── EpisodesDao.kt │ │ │ ├── NextEpisodeDao.kt │ │ │ ├── WatchedEpisodeDao.kt │ │ │ ├── WatchedEpisodeEntry.kt │ │ │ ├── WatchedEpisodeSyncRepository.kt │ │ │ └── model/ │ │ │ ├── EpisodeExtensions.kt │ │ │ ├── EpisodeWatchParams.kt │ │ │ ├── LastWatchedEpisode.kt │ │ │ ├── SeasonWatchProgress.kt │ │ │ ├── ShowWatchProgress.kt │ │ │ ├── UnwatchedEpisode.kt │ │ │ ├── UpcomingEpisode.kt │ │ │ ├── WatchProgress.kt │ │ │ └── WatchedEpisode.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── episodes/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultEpisodeRepository.kt │ │ │ │ ├── DefaultWatchedEpisodeSyncRepository.kt │ │ │ │ ├── EpisodeWatchesLastRequestStore.kt │ │ │ │ ├── TraktEpisodeWatchesDataSource.kt │ │ │ │ ├── UpcomingEpisodesStore.kt │ │ │ │ ├── dao/ │ │ │ │ │ ├── DefaultEpisodesDao.kt │ │ │ │ │ ├── DefaultNextEpisodeDao.kt │ │ │ │ │ └── DefaultWatchedEpisodeDao.kt │ │ │ │ └── model/ │ │ │ │ └── NextEpisodeKey.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── episodes/ │ │ │ └── implementation/ │ │ │ ├── DefaultEpisodeRepositoryTest.kt │ │ │ ├── DefaultEpisodesDaoTest.kt │ │ │ ├── DefaultNextEpisodeDaoTest.kt │ │ │ ├── DefaultWatchedEpisodeDaoTest.kt │ │ │ ├── EpisodesCacheTest.kt │ │ │ └── MockData.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── episodes/ │ │ └── testing/ │ │ ├── FakeEpisodeRepository.kt │ │ ├── FakeEpisodeWatchesDataSource.kt │ │ └── FakeWatchedEpisodeSyncRepository.kt │ ├── featuredshows/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── featuredshows/ │ │ │ └── api/ │ │ │ ├── FeaturedShowsDao.kt │ │ │ ├── FeaturedShowsRepository.kt │ │ │ └── interactor/ │ │ │ └── FeaturedShowsInteractor.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── data/ │ │ │ │ └── featuredshows/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultFeaturedShowsDao.kt │ │ │ │ ├── DefaultFeaturedShowsRepository.kt │ │ │ │ └── FeaturedShowsStore.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── featuredshows/ │ │ │ └── implementation/ │ │ │ └── DefaultFeaturedShowsDaoTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── featuredshows/ │ │ └── testing/ │ │ └── FakeFeaturedShowsRepository.kt │ ├── followedshows/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── followedshows/ │ │ │ └── api/ │ │ │ ├── FollowedShowEntry.kt │ │ │ ├── FollowedShowsDao.kt │ │ │ ├── FollowedShowsRepository.kt │ │ │ └── PendingAction.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── followedshows/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultFollowedShowsDao.kt │ │ │ │ └── DefaultFollowedShowsRepository.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── followedshows/ │ │ │ └── implementation/ │ │ │ ├── DefaultFollowedShowsDaoTest.kt │ │ │ └── DefaultFollowedShowsRepositoryTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── followedshows/ │ │ └── testing/ │ │ ├── FakeFollowedShowsDao.kt │ │ └── FakeFollowedShowsRepository.kt │ ├── genre/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── genre/ │ │ │ ├── GenreDao.kt │ │ │ ├── GenreRepository.kt │ │ │ ├── ShowGenresEntity.kt │ │ │ ├── TraktGenreDao.kt │ │ │ └── model/ │ │ │ ├── GenreShowCategory.kt │ │ │ ├── GenreShowsStoreKey.kt │ │ │ ├── GenreWithShowsEntity.kt │ │ │ └── TraktGenreEntity.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── genre/ │ │ │ ├── DefaultGenreDao.kt │ │ │ ├── DefaultGenreRepository.kt │ │ │ ├── DefaultTraktGenreDao.kt │ │ │ ├── GenrePosterStore.kt │ │ │ ├── GenreShowsStore.kt │ │ │ ├── GenreStore.kt │ │ │ ├── ShowsByGenreIdStore.kt │ │ │ └── TraktGenresStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── genre/ │ │ └── FakeGenreRepository.kt │ ├── library/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── library/ │ │ │ ├── LibraryDao.kt │ │ │ ├── LibraryRepository.kt │ │ │ └── model/ │ │ │ ├── LibraryItem.kt │ │ │ ├── LibrarySortOption.kt │ │ │ └── WatchProvider.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── library/ │ │ │ └── implementation/ │ │ │ ├── DefaultLibraryDao.kt │ │ │ ├── DefaultLibraryRepository.kt │ │ │ └── LibraryStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── library/ │ │ └── testing/ │ │ └── FakeLibraryRepository.kt │ ├── popularshows/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── popularshows/ │ │ │ └── api/ │ │ │ ├── PopularShowsDao.kt │ │ │ ├── PopularShowsInteractor.kt │ │ │ └── PopularShowsRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── data/ │ │ │ │ └── popularshows/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultPopularShowsDao.kt │ │ │ │ ├── DefaultPopularShowsRepository.kt │ │ │ │ └── PopularShowsStore.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── popularshows/ │ │ │ └── implementation/ │ │ │ └── DefaultPopularShowsDaoTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── popularshows/ │ │ └── testing/ │ │ └── FakePopularShowsRepository.kt │ ├── recommendedshows/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── recommendedshows/ │ │ │ └── api/ │ │ │ ├── RecommendedShowsDao.kt │ │ │ ├── RecommendedShowsParams.kt │ │ │ └── RecommendedShowsRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── recommendedshows/ │ │ │ └── implementation/ │ │ │ ├── DefaultRecommendedShowsDao.kt │ │ │ ├── DefaultRecommendedShowsRepository.kt │ │ │ ├── RecommendedShowResult.kt │ │ │ └── RecommendedShowsStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── recommendedshows/ │ │ └── testing/ │ │ └── FakeRecommendedShowsRepository.kt │ ├── request-manager/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── resourcemanager/ │ │ │ └── api/ │ │ │ ├── RequestManagerRepository.kt │ │ │ └── RequestTypeConfig.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── resourcemanager/ │ │ │ │ └── implementation/ │ │ │ │ └── DefaultRequestManagerRepository.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── resourcemanager/ │ │ │ └── implementation/ │ │ │ ├── CacheValidationTest.kt │ │ │ └── DefaultRequestManagerRepositoryTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── requestmanager/ │ │ └── testing/ │ │ └── FakeRequestManagerRepository.kt │ ├── search/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── search/ │ │ │ └── api/ │ │ │ └── SearchRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── search/ │ │ │ └── implementation/ │ │ │ ├── DefaultSearchRepository.kt │ │ │ ├── SearchShowResult.kt │ │ │ └── SearchShowStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── search/ │ │ └── testing/ │ │ └── FakeSearchRepository.kt │ ├── seasondetails/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── seasondetails/ │ │ │ └── api/ │ │ │ ├── SeasonDetailsDao.kt │ │ │ ├── SeasonDetailsParam.kt │ │ │ ├── SeasonDetailsRepository.kt │ │ │ └── model/ │ │ │ ├── ContinueTrackingResult.kt │ │ │ ├── EpisodeDetails.kt │ │ │ └── SeasonDetailsWithEpisodes.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── seasondetails/ │ │ │ └── implementation/ │ │ │ ├── DefaultSeasonDetailsDao.kt │ │ │ ├── DefaultSeasonDetailsRepository.kt │ │ │ ├── SeasonDetailsResponse.kt │ │ │ └── SeasonDetailsStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── seasondetails/ │ │ └── testing/ │ │ └── FakeSeasonDetailsRepository.kt │ ├── seasons/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── seasons/ │ │ │ └── api/ │ │ │ ├── FollowedShowSeason.kt │ │ │ ├── SeasonsDao.kt │ │ │ ├── SeasonsEpisodesSyncRepository.kt │ │ │ └── SeasonsRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── seasons/ │ │ │ └── implementation/ │ │ │ ├── DefaultSeasonsDao.kt │ │ │ ├── DefaultSeasonsEpisodesSyncRepository.kt │ │ │ ├── DefaultSeasonsRepository.kt │ │ │ └── SeasonsWithEpisodesStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── seasons/ │ │ └── testing/ │ │ └── FakeSeasonsRepository.kt │ ├── showdetails/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── showdetails/ │ │ │ └── api/ │ │ │ ├── ShowDetailsDao.kt │ │ │ └── ShowDetailsRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── showdetails/ │ │ │ └── implementation/ │ │ │ ├── DefaultShowDetailsDao.kt │ │ │ ├── DefaultShowDetailsRepository.kt │ │ │ ├── ShowDetailsResponse.kt │ │ │ └── ShowDetailsStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── showdetails/ │ │ └── testing/ │ │ └── FakeShowDetailsRepository.kt │ ├── shows/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── shows/ │ │ │ │ └── api/ │ │ │ │ ├── MergeShowUtil.kt │ │ │ │ ├── TvShowsDao.kt │ │ │ │ └── model/ │ │ │ │ ├── Category.kt │ │ │ │ ├── ShowDefaults.kt │ │ │ │ └── ShowEntity.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── shows/ │ │ │ └── api/ │ │ │ ├── MockData.kt │ │ │ └── TvShowCacheTest.kt │ │ └── implementation/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── shows/ │ │ └── implementation/ │ │ └── DefaultTvShowsDao.kt │ ├── similar/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── similar/ │ │ │ └── api/ │ │ │ ├── SimilarShowsDao.kt │ │ │ └── SimilarShowsRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── similar/ │ │ │ └── implementation/ │ │ │ ├── DefaultSimilarShowsDao.kt │ │ │ ├── DefaultSimilarShowsRepository.kt │ │ │ ├── SimilarParams.kt │ │ │ ├── SimilarShowResult.kt │ │ │ └── SimilarShowStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── similar/ │ │ └── testing/ │ │ └── FakeSimilarShowsRepository.kt │ ├── sync-activity/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── syncactivity/ │ │ │ └── api/ │ │ │ ├── TraktActivityDao.kt │ │ │ ├── TraktActivityRepository.kt │ │ │ └── model/ │ │ │ ├── ActivityType.kt │ │ │ └── TraktLastActivity.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── syncactivity/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultTraktActivityDao.kt │ │ │ │ ├── DefaultTraktActivityRepository.kt │ │ │ │ └── TraktActivityStore.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── syncactivity/ │ │ │ └── implementation/ │ │ │ └── DefaultTraktActivityDaoTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── syncactivity/ │ │ └── testing/ │ │ ├── FakeTraktActivityDao.kt │ │ └── FakeTraktActivityRepository.kt │ ├── topratedshows/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── topratedshows/ │ │ │ └── data/ │ │ │ └── api/ │ │ │ ├── TopRatedShowsDao.kt │ │ │ ├── TopRatedShowsInteractor.kt │ │ │ └── TopRatedShowsRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── toprated/ │ │ │ │ └── data/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultTopRatedShowsDao.kt │ │ │ │ ├── DefaultTopRatedShowsRepository.kt │ │ │ │ ├── TopRatedShowWithImages.kt │ │ │ │ └── TopRatedShowsStore.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── toprated/ │ │ │ └── data/ │ │ │ └── implementation/ │ │ │ └── DefaultTopRatedShowsDaoTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── topratedshows/ │ │ └── testing/ │ │ └── FakeTopRatedShowsRepository.kt │ ├── trailers/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com.thomaskioko.tvmaniac.data.trailers.implementation/ │ │ │ ├── TrailerDao.kt │ │ │ └── TrailerRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── trailers/ │ │ │ └── implementation/ │ │ │ ├── DefaultTrailerDao.kt │ │ │ ├── DefaultTrailerRepository.kt │ │ │ └── TrailerStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── trailers/ │ │ └── testing/ │ │ ├── FakeTrailerRepository.kt │ │ └── MockData.kt │ ├── traktauth/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── traktauth/ │ │ │ └── api/ │ │ │ ├── AuthError.kt │ │ │ ├── AuthState.kt │ │ │ ├── AuthStore.kt │ │ │ ├── RefreshTokenResult.kt │ │ │ ├── TokenRefreshResult.kt │ │ │ ├── TraktAuthManager.kt │ │ │ ├── TraktAuthRepository.kt │ │ │ ├── TraktAuthState.kt │ │ │ └── TraktRefreshTokenAction.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── traktauth/ │ │ │ │ └── implementation/ │ │ │ │ ├── AndroidAuthStore.kt │ │ │ │ ├── AndroidTraktAuthManager.kt │ │ │ │ ├── TraktActivityResultContract.kt │ │ │ │ └── di/ │ │ │ │ └── TraktAuthAndroidBindingContainer.kt │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── traktauth/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultTraktAuthRepository.kt │ │ │ │ ├── DefaultTraktRefreshTokenAction.kt │ │ │ │ ├── TokenRefreshInitializer.kt │ │ │ │ ├── TokenRefreshWorker.kt │ │ │ │ └── di/ │ │ │ │ └── TokenRefreshInitializerBindingContainer.kt │ │ │ └── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── traktauth/ │ │ │ └── implementation/ │ │ │ ├── DefaultIOSTraktAuthManager.kt │ │ │ └── IosAuthStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── traktauth/ │ │ └── testing/ │ │ ├── FakeAuthStore.kt │ │ ├── FakeTraktAuthManager.kt │ │ ├── FakeTraktAuthRepository.kt │ │ └── FakeTraktRefreshTokenAction.kt │ ├── traktlists/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── traktlists/ │ │ │ └── api/ │ │ │ ├── TraktList.kt │ │ │ ├── TraktListDao.kt │ │ │ ├── TraktListEntity.kt │ │ │ ├── TraktListRepository.kt │ │ │ ├── TraktListShowDao.kt │ │ │ └── TraktListShowEntry.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── traktlists/ │ │ │ └── implementation/ │ │ │ ├── CreateTraktListStore.kt │ │ │ ├── DefaultTraktListDao.kt │ │ │ ├── DefaultTraktListRepository.kt │ │ │ ├── DefaultTraktListShowDao.kt │ │ │ └── TraktListsStore.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── traktlists/ │ │ └── testing/ │ │ └── FakeTraktListRepository.kt │ ├── trendingshows/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── discover/ │ │ │ └── api/ │ │ │ ├── TrendingShowsDao.kt │ │ │ ├── TrendingShowsInteractor.kt │ │ │ ├── TrendingShowsParams.kt │ │ │ └── TrendingShowsRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── discover/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultTrendingShowsDao.kt │ │ │ │ ├── DefaultTrendingShowsRepository.kt │ │ │ │ ├── TrendingShowWithImages.kt │ │ │ │ └── TrendingShowsStore.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── discover/ │ │ │ └── implementation/ │ │ │ └── DefaultTrendingShowsDaoTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── trendingshows/ │ │ └── testing/ │ │ └── FakeTrendingShowsRepository.kt │ ├── upcomingshows/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── upcomingshows/ │ │ │ └── api/ │ │ │ ├── UpcomingShowsDao.kt │ │ │ ├── UpcomingShowsInteractor.kt │ │ │ └── UpcomingShowsRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── data/ │ │ │ │ └── upcomingshows/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultUpcomingShowsDao.kt │ │ │ │ ├── DefaultUpcomingShowsRepository.kt │ │ │ │ ├── UpcomingShowsStore.kt │ │ │ │ └── model/ │ │ │ │ ├── UpcomingParams.kt │ │ │ │ └── UpcomingShowResult.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── upcomingshows/ │ │ │ └── implementation/ │ │ │ └── DefaultUpcomingShowsDaoTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── upcomingshows/ │ │ └── testing/ │ │ └── FakeUpcomingShowsRepository.kt │ ├── upnext/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── upnext/ │ │ │ └── api/ │ │ │ ├── UpNextDao.kt │ │ │ ├── UpNextRepository.kt │ │ │ └── model/ │ │ │ └── NextEpisodeWithShow.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── upnext/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultUpNextDao.kt │ │ │ │ ├── DefaultUpNextRepository.kt │ │ │ │ └── ShowUpNextStore.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── upnext/ │ │ │ └── implementation/ │ │ │ ├── DefaultUpNextDaoTest.kt │ │ │ └── DefaultUpNextRepositoryTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── upnext/ │ │ └── testing/ │ │ ├── FakeUpNextDao.kt │ │ └── FakeUpNextRepository.kt │ ├── user/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── user/ │ │ │ └── api/ │ │ │ ├── UserDao.kt │ │ │ ├── UserRepository.kt │ │ │ ├── UserStatsDao.kt │ │ │ └── model/ │ │ │ ├── UserProfile.kt │ │ │ ├── UserProfileStats.kt │ │ │ └── UserWatchTime.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── data/ │ │ │ │ └── user/ │ │ │ │ └── implementation/ │ │ │ │ ├── DefaultUserDao.kt │ │ │ │ ├── DefaultUserRepository.kt │ │ │ │ ├── DefaultUserStatsDao.kt │ │ │ │ ├── UserStatsStore.kt │ │ │ │ └── UserStore.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── data/ │ │ │ └── user/ │ │ │ └── implementation/ │ │ │ ├── DefaultUserDaoTest.kt │ │ │ └── DefaultUserStatsDaoTest.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── user/ │ │ └── testing/ │ │ └── FakeUserRepository.kt │ ├── watchlist/ │ │ ├── api/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── shows/ │ │ │ └── api/ │ │ │ ├── WatchlistDao.kt │ │ │ └── WatchlistRepository.kt │ │ ├── implementation/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── watchlist/ │ │ │ └── implementation/ │ │ │ ├── DefaultWatchlistDao.kt │ │ │ └── DefaultWatchlistRepository.kt │ │ └── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── watchlist/ │ │ └── testing/ │ │ └── FakeWatchlistRepository.kt │ └── watchproviders/ │ ├── api/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── watchproviders/ │ │ └── api/ │ │ ├── WatchProviderDao.kt │ │ └── WatchProviderRepository.kt │ ├── implementation/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── data/ │ │ └── watchproviders/ │ │ └── implementation/ │ │ ├── DefaultWatchProviderDao.kt │ │ ├── DefaultWatchProviderRepository.kt │ │ └── WatchProvidersStore.kt │ └── testing/ │ ├── build.gradle.kts │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── data/ │ └── watchproviders/ │ └── testing/ │ └── FakeWatchProviderRepository.kt ├── docs/ │ ├── architecture/ │ │ ├── README.md │ │ ├── data-layer.md │ │ ├── dependency-injection.md │ │ ├── integration-testing.md │ │ ├── journey-tests.md │ │ ├── modularization.md │ │ ├── navigation-codegen.md │ │ ├── navigation.md │ │ ├── presentation-layer.md │ │ └── scopes.md │ ├── privacy_policy.md │ ├── setup.md │ └── terms_conditions.md ├── domain/ │ ├── calendar/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── domain/ │ │ │ └── calendar/ │ │ │ ├── CalendarEpisodeFormatter.kt │ │ │ ├── CalendarWeekCalculator.kt │ │ │ ├── FetchCalendarInteractor.kt │ │ │ ├── ObserveCalendarInteractor.kt │ │ │ └── model/ │ │ │ ├── DateLabel.kt │ │ │ ├── GroupedCalendarEntry.kt │ │ │ └── GroupedEpisodeEntry.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── calendar/ │ │ ├── CalendarWeekCalculatorTest.kt │ │ └── ObserveCalendarInteractorTest.kt │ ├── discover/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── domain/ │ │ │ └── discover/ │ │ │ └── DiscoverShowsInteractor.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── discover/ │ │ └── DiscoverShowsInteractorTest.kt │ ├── episode/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── domain/ │ │ │ └── episode/ │ │ │ ├── MarkEpisodeUnwatchedInteractor.kt │ │ │ ├── MarkEpisodeWatchedInteractor.kt │ │ │ ├── ObserveEpisodeByIdInteractor.kt │ │ │ └── ObserveShowWatchProgressInteractor.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── episode/ │ │ └── MarkEpisodeWatchedInteractorTest.kt │ ├── followedshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── followedshows/ │ │ └── UnfollowShowInteractor.kt │ ├── genre/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── genre/ │ │ ├── FetchGenreContentInteractor.kt │ │ └── GenreShowsInteractor.kt │ ├── library/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── library/ │ │ ├── LibrarySyncWorker.kt │ │ ├── ObserveLibraryInteractor.kt │ │ ├── SyncLibraryInteractor.kt │ │ ├── SyncTasksInitializer.kt │ │ └── di/ │ │ └── SyncTasksInitializerBindingContainer.kt │ ├── logout/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── logout/ │ │ └── LogoutInteractor.kt │ ├── notifications/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── domain/ │ │ │ └── notifications/ │ │ │ ├── EpisodeNotificationWorker.kt │ │ │ ├── NotificationTasksInitializer.kt │ │ │ ├── di/ │ │ │ │ └── NotificationTasksInitializerBindingContainer.kt │ │ │ └── interactor/ │ │ │ ├── RefreshUpcomingSeasonDetailsInteractor.kt │ │ │ ├── ScheduleDebugEpisodeNotificationInteractor.kt │ │ │ ├── ScheduleEpisodeNotificationsInteractor.kt │ │ │ ├── SyncTraktCalendarInteractor.kt │ │ │ └── ToggleEpisodeNotificationsInteractor.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── notifications/ │ │ └── interactor/ │ │ └── ScheduleEpisodeNotificationsInteractorTest.kt │ ├── recommendedshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── recommendedshows/ │ │ └── RecommendedShowsInteractor.kt │ ├── seasondetails/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── seasondetails/ │ │ ├── FetchPreviousSeasonsInteractor.kt │ │ ├── MarkSeasonUnwatchedInteractor.kt │ │ ├── MarkSeasonWatchedInteractor.kt │ │ ├── ObservableSeasonDetailsInteractor.kt │ │ ├── ObserveSeasonWatchProgressInteractor.kt │ │ ├── ObserveUnwatchedInPreviousSeasonsInteractor.kt │ │ ├── SeasonDetailsInteractor.kt │ │ └── model/ │ │ ├── SeasonCast.kt │ │ ├── SeasonDetailsResult.kt │ │ └── SeasonImages.kt │ ├── settings/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── settings/ │ │ └── ObserveSettingsPreferencesInteractor.kt │ ├── showdetails/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── showdetails/ │ │ ├── FollowShowInteractor.kt │ │ ├── Mapper.kt │ │ ├── ObservableShowDetailsInteractor.kt │ │ ├── ShowContentSyncInteractor.kt │ │ ├── ShowDetailsInteractor.kt │ │ └── model/ │ │ └── ShowDetails.kt │ ├── similarshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── similarshows/ │ │ └── SimilarShowsInteractor.kt │ ├── theme/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── theme/ │ │ ├── ImageQuality.kt │ │ └── Theme.kt │ ├── traktlists/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── traktlists/ │ │ ├── CreateTraktListInteractor.kt │ │ ├── ObserveTraktListsInteractor.kt │ │ ├── SyncTraktListsInteractor.kt │ │ └── ToggleShowInListInteractor.kt │ ├── upnext/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── domain/ │ │ │ └── upnext/ │ │ │ ├── ObserveUpNextInteractor.kt │ │ │ ├── RefreshUpNextInteractor.kt │ │ │ ├── UpNextSyncWorker.kt │ │ │ ├── UpNextTasksInitializer.kt │ │ │ ├── di/ │ │ │ │ └── UpNextTasksInitializerBindingContainer.kt │ │ │ └── model/ │ │ │ ├── UpNextResult.kt │ │ │ └── UpNextSortOption.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── upnext/ │ │ └── ObserveUpNextInteractorTest.kt │ ├── user/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── user/ │ │ ├── ObserveUserProfileInteractor.kt │ │ ├── UpdateUserProfileData.kt │ │ └── model/ │ │ ├── UserProfile.kt │ │ └── UserStats.kt │ ├── watchlist/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── domain/ │ │ │ └── watchlist/ │ │ │ ├── ObservableWatchlistInteractor.kt │ │ │ ├── ObserveUpNextSectionsInteractor.kt │ │ │ ├── ObserveWatchlistSectionsInteractor.kt │ │ │ ├── UpNextSectionsMapper.kt │ │ │ ├── WatchlistSyncInteractor.kt │ │ │ └── model/ │ │ │ ├── EpisodeBadge.kt │ │ │ ├── UpNextSections.kt │ │ │ └── WatchlistSections.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── domain/ │ │ └── watchlist/ │ │ ├── ObservableWatchlistInteractorTest.kt │ │ ├── ObserveUpNextSectionsInteractorTest.kt │ │ ├── ObserveWatchlistSectionsInteractorTest.kt │ │ └── UpNextSectionsMapperTest.kt │ └── watchproviders/ │ ├── build.gradle.kts │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── domain/ │ └── watchproviders/ │ └── WatchProvidersInteractor.kt ├── fastlane/ │ ├── Appfile │ ├── Fastfile │ ├── Matchfile │ ├── Pluginfile │ └── README.md ├── features/ │ ├── calendar/ │ │ ├── nav/ │ │ │ └── build.gradle.kts │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presentation/ │ │ │ │ └── calendar/ │ │ │ │ ├── CalendarAction.kt │ │ │ │ ├── CalendarPresenter.kt │ │ │ │ ├── CalendarState.kt │ │ │ │ ├── CalendarStateMapper.kt │ │ │ │ └── model/ │ │ │ │ ├── CalendarDateGroup.kt │ │ │ │ └── CalendarEpisodeItem.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presentation/ │ │ │ └── calendar/ │ │ │ └── CalendarPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── ui/ │ │ │ └── calendar/ │ │ │ └── CalendarScreen.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── ui/ │ │ └── calendar/ │ │ └── roborrazi/ │ │ └── CalendarScreenshotTest.kt │ ├── debug/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── debug/ │ │ │ └── nav/ │ │ │ └── DebugRoute.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── debug/ │ │ │ │ └── presenter/ │ │ │ │ ├── DebugActions.kt │ │ │ │ ├── DebugPresenter.kt │ │ │ │ └── DebugState.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── debug/ │ │ │ └── presenter/ │ │ │ └── DebugPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── debug/ │ │ └── ui/ │ │ └── DebugMenuScreen.kt │ ├── discover/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── discover/ │ │ │ └── nav/ │ │ │ └── DiscoverNavigator.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── discover/ │ │ │ │ └── presenter/ │ │ │ │ ├── DiscoverShowsAction.kt │ │ │ │ ├── DiscoverShowsMapper.kt │ │ │ │ ├── DiscoverShowsPresenter.kt │ │ │ │ ├── DiscoverViewState.kt │ │ │ │ ├── di/ │ │ │ │ │ └── DefaultDiscoverNavigator.kt │ │ │ │ └── model/ │ │ │ │ ├── DiscoverShow.kt │ │ │ │ └── NextEpisodeUiModel.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── discover/ │ │ │ └── presenter/ │ │ │ └── DiscoverShowsPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── discover/ │ │ │ └── ui/ │ │ │ ├── DiscoverPreviewParameterProvider.kt │ │ │ ├── DiscoverScreen.kt │ │ │ └── component/ │ │ │ ├── CircularIndicator.kt │ │ │ ├── DiscoverHeaderContent.kt │ │ │ ├── HorizontalRowContent.kt │ │ │ ├── NextEpisodeCard.kt │ │ │ └── NextEpisodesSection.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── discover/ │ │ └── roborrazi/ │ │ └── DiscoverScreenshotTest.kt │ ├── episode-sheet/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── espisodedetails/ │ │ │ └── nav/ │ │ │ └── model/ │ │ │ ├── EpisodeSheetConfig.kt │ │ │ ├── ScreenSource.kt │ │ │ └── SheetNavigatorExt.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presentation/ │ │ │ │ └── episodedetail/ │ │ │ │ ├── EpisodeSheetAction.kt │ │ │ │ ├── EpisodeSheetMapper.kt │ │ │ │ ├── EpisodeSheetPresenter.kt │ │ │ │ └── EpisodeSheetState.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presentation/ │ │ │ └── episodedetail/ │ │ │ └── EpisodeSheetPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── episodedetail/ │ │ │ └── ui/ │ │ │ ├── EpisodeDetailBottomSheet.kt │ │ │ └── EpisodeSheet.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── episodedetail/ │ │ └── roborrazi/ │ │ └── EpisodeSheetScreenshotTest.kt │ ├── genre-shows/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── genreshows/ │ │ │ └── nav/ │ │ │ ├── GenreShowsDestination.kt │ │ │ └── GenreShowsRoute.kt │ │ └── presenter/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── genreshows/ │ │ └── presenter/ │ │ └── di/ │ │ └── GenreShowsNavDestinationBinding.kt │ ├── home/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── home/ │ │ │ └── nav/ │ │ │ ├── HomeRoute.kt │ │ │ ├── HomeTabNavigator.kt │ │ │ ├── TabChild.kt │ │ │ ├── TabDestination.kt │ │ │ └── di/ │ │ │ ├── TabDestinationMultibindings.kt │ │ │ └── model/ │ │ │ └── HomeConfig.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presenter/ │ │ │ │ └── home/ │ │ │ │ ├── HomePresenter.kt │ │ │ │ └── di/ │ │ │ │ └── DefaultHomeTabNavigator.kt │ │ │ ├── commonTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presenter/ │ │ │ │ └── home/ │ │ │ │ └── HomePresenterTest.kt │ │ │ ├── iosTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presenter/ │ │ │ │ └── home/ │ │ │ │ └── HomePresenterIosTest.kt │ │ │ └── jvmTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presenter/ │ │ │ └── home/ │ │ │ └── HomePresenterJvmTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── home/ │ │ └── ui/ │ │ └── HomeScreen.kt │ ├── library/ │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presentation/ │ │ │ └── library/ │ │ │ ├── LibraryAction.kt │ │ │ ├── LibraryPresenter.kt │ │ │ ├── LibraryState.kt │ │ │ └── model/ │ │ │ ├── LibraryShowItem.kt │ │ │ ├── LibrarySortOption.kt │ │ │ └── ShowStatus.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── ui/ │ │ └── library/ │ │ ├── LibraryListItem.kt │ │ ├── LibraryScreen.kt │ │ ├── LibrarySearchbar.kt │ │ ├── SortOptionsContent.kt │ │ └── preview/ │ │ ├── LibraryListItemPreviewParameterProvider.kt │ │ └── LibraryStatePreviewParameterProvider.kt │ ├── more-shows/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── moreshows/ │ │ │ └── nav/ │ │ │ └── MoreShowsRoute.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── moreshows/ │ │ │ └── presentation/ │ │ │ ├── MoreShowsAction.kt │ │ │ ├── MoreShowsPresenter.kt │ │ │ ├── MoreShowsState.kt │ │ │ └── TvShow.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── moreshows/ │ │ │ └── ui/ │ │ │ ├── MoreShowsPreviewParameterProvider.kt │ │ │ └── MoreShowsScreen.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── moreshows/ │ │ └── roborrazi/ │ │ └── MoreShowsScreenTest.kt │ ├── profile/ │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── profile/ │ │ │ │ └── presenter/ │ │ │ │ ├── ProfileAction.kt │ │ │ │ ├── ProfilePresenter.kt │ │ │ │ └── model/ │ │ │ │ ├── ProfileInfo.kt │ │ │ │ ├── ProfileState.kt │ │ │ │ └── ProfileStats.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presenter/ │ │ │ └── profile/ │ │ │ └── ProfilePresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── profile/ │ │ │ └── ui/ │ │ │ ├── ProfilePreviewParameterProvider.kt │ │ │ ├── ProfileScreen.kt │ │ │ ├── StatsCardItem.kt │ │ │ └── UnauthenticatedContent.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── profile/ │ │ └── roborazzi/ │ │ └── ProfileScreenTest.kt │ ├── progress/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── progress/ │ │ │ └── nav/ │ │ │ └── scope/ │ │ │ └── ProgressChildScope.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presentation/ │ │ │ └── progress/ │ │ │ ├── ProgressAction.kt │ │ │ ├── ProgressChildGraph.kt │ │ │ ├── ProgressPresenter.kt │ │ │ └── ProgressState.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── ui/ │ │ │ └── progress/ │ │ │ └── ProgressScreen.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── ui/ │ │ └── progress/ │ │ └── roborrazi/ │ │ └── ProgressScreenshotTest.kt │ ├── root/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── root/ │ │ │ ├── model/ │ │ │ │ ├── DeepLinkDestination.kt │ │ │ │ ├── NotificationPermissionState.kt │ │ │ │ └── ThemeState.kt │ │ │ └── nav/ │ │ │ └── NotificationRationale.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presenter/ │ │ │ │ └── root/ │ │ │ │ ├── DefaultRootPresenter.kt │ │ │ │ ├── RootPresenter.kt │ │ │ │ └── di/ │ │ │ │ ├── DefaultNotificationRationale.kt │ │ │ │ ├── DefaultSheetNavigator.kt │ │ │ │ └── RootPresenterBindingContainer.kt │ │ │ ├── commonTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presenter/ │ │ │ │ └── root/ │ │ │ │ └── DefaultRootPresenterTest.kt │ │ │ ├── iosTest/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presenter/ │ │ │ │ └── root/ │ │ │ │ └── DefaultRootPresenterIosTest.kt │ │ │ └── jvmTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presenter/ │ │ │ └── root/ │ │ │ └── DefaultRootPresenterJvmTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── app/ │ │ └── ui/ │ │ └── RootScreen.kt │ ├── search/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── search/ │ │ │ └── nav/ │ │ │ └── SearchRoute.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── search/ │ │ │ │ └── presenter/ │ │ │ │ ├── Mapper.kt │ │ │ │ ├── SearchShowAction.kt │ │ │ │ ├── SearchShowState.kt │ │ │ │ ├── SearchShowsPresenter.kt │ │ │ │ └── model/ │ │ │ │ ├── CategoryItem.kt │ │ │ │ ├── GenreRowModel.kt │ │ │ │ ├── ShowGenre.kt │ │ │ │ └── ShowItem.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presenter/ │ │ │ └── search/ │ │ │ └── SearchShowsPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── search/ │ │ │ └── ui/ │ │ │ ├── SearchPreviewParameterProvider.kt │ │ │ ├── SearchScreen.kt │ │ │ └── components/ │ │ │ ├── HorizontalShowContentRow.kt │ │ │ └── SearchResultItem.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── search/ │ │ └── roborrazi/ │ │ └── SearchScreenTest.kt │ ├── season-details/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── seasondetails/ │ │ │ └── nav/ │ │ │ ├── SeasonDetailsRoute.kt │ │ │ └── SeasonDetailsUiParam.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── seasondetails/ │ │ │ │ └── presenter/ │ │ │ │ ├── Mapper.kt │ │ │ │ ├── SeasonDetailsAction.kt │ │ │ │ ├── SeasonDetailsModel.kt │ │ │ │ ├── SeasonDetailsPresenter.kt │ │ │ │ └── model/ │ │ │ │ ├── Cast.kt │ │ │ │ ├── EpisodeDetailsModel.kt │ │ │ │ └── SeasonImagesModel.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── seasondetails/ │ │ │ └── presenter/ │ │ │ ├── SeasonPresenterTest.kt │ │ │ └── data/ │ │ │ └── MockData.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── seasondetails/ │ │ │ └── ui/ │ │ │ ├── SeasonDetailsScreen.kt │ │ │ ├── SeasonPreviewParameterProvider.kt │ │ │ └── components/ │ │ │ ├── CollapsableContent.kt │ │ │ └── EpisodeItem.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── seasondetails/ │ │ └── roborrazi/ │ │ └── SeasonScreenshotTest.kt │ ├── settings/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── settings/ │ │ │ └── nav/ │ │ │ └── SettingsRoute.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── settings/ │ │ │ │ └── presenter/ │ │ │ │ ├── SettingsActions.kt │ │ │ │ ├── SettingsPresenter.kt │ │ │ │ ├── SettingsState.kt │ │ │ │ └── ThemeModel.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presenter/ │ │ │ └── settings/ │ │ │ └── SettingsPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── settings/ │ │ │ │ └── ui/ │ │ │ │ ├── AboutSheetContent.kt │ │ │ │ ├── SettingsPreviewParameterProvider.kt │ │ │ │ ├── SettingsScreen.kt │ │ │ │ ├── ThemePreviewSwatch.kt │ │ │ │ └── ThemeSelectorSection.kt │ │ │ └── res/ │ │ │ └── drawable/ │ │ │ └── ic_app_launcher.xml │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── seasondetails/ │ │ └── roborrazi/ │ │ └── SettingsScreenshotTest.kt │ ├── show-details/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── showdetails/ │ │ │ └── nav/ │ │ │ ├── ShowDetailsRoute.kt │ │ │ └── model/ │ │ │ ├── ShowDetailsParam.kt │ │ │ └── ShowSeasonDetailsParam.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presenter/ │ │ │ │ └── showdetails/ │ │ │ │ ├── ShowDetailsAction.kt │ │ │ │ ├── ShowDetailsContent.kt │ │ │ │ ├── ShowDetailsMapper.kt │ │ │ │ ├── ShowDetailsPresenter.kt │ │ │ │ └── model/ │ │ │ │ ├── CastModel.kt │ │ │ │ ├── ContinueTrackingEpisodeModel.kt │ │ │ │ ├── ProviderModel.kt │ │ │ │ ├── SeasonModel.kt │ │ │ │ ├── ShowDetailsModel.kt │ │ │ │ ├── ShowModel.kt │ │ │ │ ├── TrailerModel.kt │ │ │ │ └── TraktListModel.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presenter/ │ │ │ └── showdetails/ │ │ │ ├── MockData.kt │ │ │ └── ShowDetailsPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── showdetails/ │ │ │ └── ui/ │ │ │ ├── DetailPreviewParameterProvider.kt │ │ │ ├── ShowDetailScreen.kt │ │ │ └── components/ │ │ │ ├── ContinueTrackingCard.kt │ │ │ ├── ContinueTrackingSection.kt │ │ │ ├── SeasonChipItem.kt │ │ │ ├── ShowListSheetContent.kt │ │ │ └── WatchProgressSection.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── showdetails/ │ │ └── roborrazi/ │ │ ├── ShowDetailsScreenScreenshotTest.kt │ │ └── ShowListSheetScreenshotTest.kt │ ├── trailers/ │ │ ├── nav/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── trailers/ │ │ │ └── nav/ │ │ │ └── TrailersRoute.kt │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presenter/ │ │ │ │ └── trailers/ │ │ │ │ ├── Mapper.kt │ │ │ │ ├── TrailersAction.kt │ │ │ │ ├── TrailersPresenter.kt │ │ │ │ ├── TrailersState.kt │ │ │ │ └── model/ │ │ │ │ └── Trailer.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presenter/ │ │ │ └── trailers/ │ │ │ └── TrailersPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── trailers/ │ │ └── ui/ │ │ ├── TrailerPreviewParameterProvider.kt │ │ └── TrailersScreen.kt │ ├── upnext/ │ │ ├── presenter/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── thomaskioko/ │ │ │ │ └── tvmaniac/ │ │ │ │ └── presentation/ │ │ │ │ └── upnext/ │ │ │ │ ├── UpNextAction.kt │ │ │ │ ├── UpNextPresenter.kt │ │ │ │ ├── UpNextState.kt │ │ │ │ └── model/ │ │ │ │ └── UpNextEpisodeUiModel.kt │ │ │ └── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── presentation/ │ │ │ └── upnext/ │ │ │ └── UpNextPresenterTest.kt │ │ └── ui/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── ui/ │ │ │ └── upnext/ │ │ │ ├── UpNextListItem.kt │ │ │ ├── UpNextScreen.kt │ │ │ └── preview/ │ │ │ └── UpNextPreviewParameterProvider.kt │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── ui/ │ │ └── upnext/ │ │ └── roborrazi/ │ │ └── UpNextScreenshotTest.kt │ └── watchlist/ │ ├── presenter/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── watchlist/ │ │ │ └── presenter/ │ │ │ ├── Mapper.kt │ │ │ ├── WatchlistAction.kt │ │ │ ├── WatchlistPresenter.kt │ │ │ ├── WatchlistState.kt │ │ │ └── model/ │ │ │ ├── EpisodeBadge.kt │ │ │ ├── NextEpisodeItem.kt │ │ │ ├── SectionedEpisodes.kt │ │ │ ├── SectionedItems.kt │ │ │ ├── UpNextEpisodeItem.kt │ │ │ └── WatchlistItem.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ ├── domain/ │ │ │ └── watchlist/ │ │ │ ├── MockData.kt │ │ │ └── WatchlistPresenterTest.kt │ │ └── watchlist/ │ │ └── presenter/ │ │ └── FakeWatchlistPresenterBuilder.kt │ └── ui/ │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── ui/ │ │ └── library/ │ │ ├── WatchListUpNextListItem.kt │ │ ├── WatchlistListItem.kt │ │ ├── WatchlistPreviewParameterProvider.kt │ │ ├── WatchlistScreen.kt │ │ └── component/ │ │ └── Searchbar.kt │ └── test/ │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── watchlist/ │ └── roborrazi/ │ └── WatchlistScreenTest.kt ├── gradle/ │ ├── gradle-daemon-jvm.properties │ ├── libs.versions.toml │ ├── lint.xml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── i18n/ │ ├── api/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── i18n/ │ │ └── api/ │ │ └── Localizer.kt │ ├── generator/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ └── Resources.kt │ │ ├── commonMain/ │ │ │ └── moko-resources/ │ │ │ ├── base/ │ │ │ │ ├── plurals.xml │ │ │ │ └── strings.xml │ │ │ ├── de/ │ │ │ │ ├── plurals.xml │ │ │ │ └── strings.xml │ │ │ └── fr/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ └── generator/ │ │ │ └── ResourceTest.kt │ │ └── iosMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── i18n/ │ │ └── Resources.kt │ ├── implementation/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ ├── androidHostTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ └── util/ │ │ │ └── BaseResourceTests.kt │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ └── PlatformLocalizer.android.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ ├── LocalizedErrorToStringMapper.kt │ │ │ ├── MokoLocaleInitializer.kt │ │ │ ├── MokoResourcesLocalizer.kt │ │ │ ├── PlatformLocalizer.kt │ │ │ └── di/ │ │ │ └── MokoLocaleInitializerBindingContainer.kt │ │ ├── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ ├── LocalizedStringTest.kt │ │ │ ├── MokoLocalizerTest.kt │ │ │ └── util/ │ │ │ └── BaseResourceTests.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ └── PlatformLocalizer.ios.kt │ │ ├── iosTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ └── util/ │ │ │ └── BaseResourceTests.kt │ │ ├── jvmMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── i18n/ │ │ │ └── PlatformLocalizer.jvm.kt │ │ └── jvmTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── i18n/ │ │ └── util/ │ │ └── BaseResourceTests.kt │ └── testing/ │ ├── build.gradle.kts │ └── src/ │ ├── androidMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── i18n/ │ │ └── testing/ │ │ └── util/ │ │ ├── BaseLocalizerTest.android.kt │ │ └── StringDescExt.kt │ ├── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── i18n/ │ │ └── testing/ │ │ ├── FakeLocalizer.kt │ │ └── util/ │ │ ├── BaseLocalizerTest.kt │ │ └── StringDescExt.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── i18n/ │ │ └── testing/ │ │ └── util/ │ │ ├── BaseLocalizerTest.ios.kt │ │ └── StringDescExt.ios.kt │ └── jvmMain/ │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── i18n/ │ └── testing/ │ └── util/ │ ├── BaseLocalizerTest.jvm.kt │ └── StringDescExt.jvm.kt ├── ios/ │ ├── .gitignore │ ├── .swiftformat │ ├── Config/ │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Modules/ │ │ ├── CoreKit/ │ │ │ ├── Package.swift │ │ │ └── Sources/ │ │ │ └── CoreKit/ │ │ │ ├── CoreLogger.swift │ │ │ ├── DefaultDiagnosticLogger.swift │ │ │ ├── DiagnosticLogger.swift │ │ │ ├── FirebaseCrashlyticsBridge.swift │ │ │ ├── ImageCacheManager.swift │ │ │ ├── MemoryMonitor.swift │ │ │ └── SystemMemory.swift │ │ ├── SnapshotTestingLib/ │ │ │ ├── .gitignore │ │ │ ├── .swiftpm/ │ │ │ │ └── xcode/ │ │ │ │ └── package.xcworkspace/ │ │ │ │ └── xcshareddata/ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ ├── Package.swift │ │ │ └── Sources/ │ │ │ └── SnapshotTestingLib/ │ │ │ └── SnapshotTesting+Extensions.swift │ │ ├── SwiftUIComponents/ │ │ │ ├── .gitignore │ │ │ ├── .swiftpm/ │ │ │ │ └── xcode/ │ │ │ │ └── package.xcworkspace/ │ │ │ │ └── xcshareddata/ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ ├── Package.swift │ │ │ ├── Sources/ │ │ │ │ └── SwiftUIComponents/ │ │ │ │ ├── Components/ │ │ │ │ │ ├── BorderTextView.swift │ │ │ │ │ ├── BottomSheet/ │ │ │ │ │ │ └── EpisodeDetailSheetContent.swift │ │ │ │ │ ├── Buttons/ │ │ │ │ │ │ ├── CircularButton.swift │ │ │ │ │ │ ├── FilledImageButton.swift │ │ │ │ │ │ ├── OutlinedButton.swift │ │ │ │ │ │ ├── RoundedButton.swift │ │ │ │ │ │ └── TvManiacButton.swift │ │ │ │ │ ├── CarouselView.swift │ │ │ │ │ ├── CastListView.swift │ │ │ │ │ ├── ChevronTitle.swift │ │ │ │ │ ├── ChipView.swift │ │ │ │ │ ├── CircularIndicator.swift │ │ │ │ │ ├── ContinueTracking/ │ │ │ │ │ │ ├── ContinueTrackingCard.swift │ │ │ │ │ │ ├── ContinueTrackingSection.swift │ │ │ │ │ │ └── SwiftContinueTrackingEpisode.swift │ │ │ │ │ ├── EmptyUIView.swift │ │ │ │ │ ├── Episode/ │ │ │ │ │ │ ├── EpisodeCollapsible.swift │ │ │ │ │ │ ├── EpisodeItemView.swift │ │ │ │ │ │ └── EpisodeListView.swift │ │ │ │ │ ├── FilterChip.swift │ │ │ │ │ ├── FilterChipSection.swift │ │ │ │ │ ├── FlowLayout.swift │ │ │ │ │ ├── FullScreenView.swift │ │ │ │ │ ├── GlassButton.swift │ │ │ │ │ ├── GlassToolbar.swift │ │ │ │ │ ├── GridView.swift │ │ │ │ │ ├── HorizontalItemListView.swift │ │ │ │ │ ├── ImageGalleryContentView.swift │ │ │ │ │ ├── Images/ │ │ │ │ │ │ ├── AvatarView.swift │ │ │ │ │ │ ├── BackdropPosterCard.swift │ │ │ │ │ │ ├── CastCardView.swift │ │ │ │ │ │ ├── FeaturedContentPosterView.swift │ │ │ │ │ │ ├── HeaderCoverArtWorkView.swift │ │ │ │ │ │ ├── LazyResizableImage.swift │ │ │ │ │ │ ├── PosterCardView.swift │ │ │ │ │ │ ├── PosterItemView.swift │ │ │ │ │ │ ├── PosterPlaceholder.swift │ │ │ │ │ │ ├── ProviderItemView.swift │ │ │ │ │ │ └── TransparentImageBackground.swift │ │ │ │ │ ├── LibraryListItemView.swift │ │ │ │ │ ├── LoadingIndicatorView.swift │ │ │ │ │ ├── Models/ │ │ │ │ │ │ ├── DebugMenuItem.swift │ │ │ │ │ │ ├── SettingsModels.swift │ │ │ │ │ │ ├── ShowPosterImage.swift │ │ │ │ │ │ ├── SwiftCalendarDateGroup.swift │ │ │ │ │ │ ├── SwiftCast.swift │ │ │ │ │ │ ├── SwiftGenreRow.swift │ │ │ │ │ │ ├── SwiftGenres.swift │ │ │ │ │ │ ├── SwiftLibraryItem.swift │ │ │ │ │ │ ├── SwiftProfile.swift │ │ │ │ │ │ ├── SwiftProviders.swift │ │ │ │ │ │ ├── SwiftSearchShow.swift │ │ │ │ │ │ ├── SwiftSeason.swift │ │ │ │ │ │ ├── SwiftShow.swift │ │ │ │ │ │ ├── SwiftShowGenre.swift │ │ │ │ │ │ ├── SwiftTrailer.swift │ │ │ │ │ │ └── SwiftTraktListItem.swift │ │ │ │ │ ├── NavigationTopBar.swift │ │ │ │ │ ├── NextEpisode/ │ │ │ │ │ │ ├── NextEpisodeCard.swift │ │ │ │ │ │ ├── NextEpisodesSection.swift │ │ │ │ │ │ ├── SwiftNextEpisode.swift │ │ │ │ │ │ └── UpNextListItemView.swift │ │ │ │ │ ├── NotificationRationaleSheet.swift │ │ │ │ │ ├── OverviewBoxView.swift │ │ │ │ │ ├── ParallaxView.swift │ │ │ │ │ ├── ProviderListView.swift │ │ │ │ │ ├── ScanlineOverlay.swift │ │ │ │ │ ├── Search/ │ │ │ │ │ │ ├── SearchItemView.swift │ │ │ │ │ │ ├── SearchResultListView.swift │ │ │ │ │ │ └── ShowContent/ │ │ │ │ │ │ ├── HorizontalShowContentView.swift │ │ │ │ │ │ └── ShowContentItemView.swift │ │ │ │ │ ├── SeasonChipViewList.swift │ │ │ │ │ ├── SeasonProgress/ │ │ │ │ │ │ ├── SeasonProgressCard.swift │ │ │ │ │ │ ├── SeasonProgressSection.swift │ │ │ │ │ │ └── SegmentedProgressBar.swift │ │ │ │ │ ├── SectionHeaderView.swift │ │ │ │ │ ├── SelectionChip.swift │ │ │ │ │ ├── ShowDetails/ │ │ │ │ │ │ ├── HeaderView.swift │ │ │ │ │ │ ├── ShowHeaderInfoView.swift │ │ │ │ │ │ └── ShowInfoView.swift │ │ │ │ │ ├── SnapCarousel.swift │ │ │ │ │ ├── StatsCardItem.swift │ │ │ │ │ ├── TextTitlePill.swift │ │ │ │ │ ├── ThemeSelector/ │ │ │ │ │ │ ├── ThemePreviewSwatch.swift │ │ │ │ │ │ └── ThemeSelectorView.swift │ │ │ │ │ ├── ThemedProgressView.swift │ │ │ │ │ ├── Toast/ │ │ │ │ │ │ ├── Toast.swift │ │ │ │ │ │ ├── ToastManager.swift │ │ │ │ │ │ ├── ToastModifier.swift │ │ │ │ │ │ └── ToastView.swift │ │ │ │ │ ├── TopBar.swift │ │ │ │ │ ├── TrailerListView.swift │ │ │ │ │ ├── TransparentBlurView.swift │ │ │ │ │ ├── Watchlist/ │ │ │ │ │ │ ├── TraktListSelectorContent.swift │ │ │ │ │ │ └── WatchListItemView.swift │ │ │ │ │ └── YoutubeItemView.swift │ │ │ │ ├── Core/ │ │ │ │ │ ├── CenteredFullScreenView.swift │ │ │ │ │ ├── ImageConfiguration.swift │ │ │ │ │ ├── KeyboardHeightManager.swift │ │ │ │ │ └── ViewConstants.swift │ │ │ │ ├── Effects/ │ │ │ │ │ └── ButtonElevationEffect.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── Geometry+Extensions.swift │ │ │ │ │ ├── HorizontalAlignment.swift │ │ │ │ │ ├── PrintExtension.swift │ │ │ │ │ └── View+onSizeChange.swift │ │ │ │ ├── Screens/ │ │ │ │ │ ├── Calendar/ │ │ │ │ │ │ └── CalendarScreen.swift │ │ │ │ │ ├── Discover/ │ │ │ │ │ │ ├── DiscoverListContent.swift │ │ │ │ │ │ └── DiscoverScreen.swift │ │ │ │ │ ├── Library/ │ │ │ │ │ │ ├── LibraryScreen.swift │ │ │ │ │ │ └── MoreShowsScreen.swift │ │ │ │ │ ├── Profile/ │ │ │ │ │ │ ├── DebugScreen.swift │ │ │ │ │ │ ├── ProfileScreen.swift │ │ │ │ │ │ └── SettingsScreen.swift │ │ │ │ │ ├── Progress/ │ │ │ │ │ │ └── ProgressScreen.swift │ │ │ │ │ ├── Search/ │ │ │ │ │ │ ├── SearchScreen.swift │ │ │ │ │ │ └── SearchScreenPreviews.swift │ │ │ │ │ ├── ShowDetails/ │ │ │ │ │ │ ├── SeasonDetailsScreen.swift │ │ │ │ │ │ └── ShowDetailsScreen.swift │ │ │ │ │ └── Watchlist/ │ │ │ │ │ ├── WatchlistGridItem.swift │ │ │ │ │ └── WatchlistScreen.swift │ │ │ │ ├── Styles/ │ │ │ │ │ ├── RoundedProgressIndicatorStyle.swift │ │ │ │ │ └── TransparentGroupBox.swift │ │ │ │ ├── Theme/ │ │ │ │ │ ├── Colors/ │ │ │ │ │ │ ├── AmberColorScheme.swift │ │ │ │ │ │ ├── AquaColorScheme.swift │ │ │ │ │ │ ├── AutumnColorScheme.swift │ │ │ │ │ │ ├── ColorScheme.swift │ │ │ │ │ │ ├── ColorTokens.swift │ │ │ │ │ │ ├── CrimsonColorScheme.swift │ │ │ │ │ │ ├── DarkColorScheme.swift │ │ │ │ │ │ ├── LightColorScheme.swift │ │ │ │ │ │ ├── SnowColorScheme.swift │ │ │ │ │ │ └── TerminalColorScheme.swift │ │ │ │ │ ├── Environment/ │ │ │ │ │ │ ├── ThemeEnvironment.swift │ │ │ │ │ │ └── TvManiacTheme.swift │ │ │ │ │ ├── Preview/ │ │ │ │ │ │ └── ThemedPreview.swift │ │ │ │ │ ├── Shape/ │ │ │ │ │ │ └── ShapeTokens.swift │ │ │ │ │ ├── Spacing/ │ │ │ │ │ │ └── SpacingTokens.swift │ │ │ │ │ └── Typography/ │ │ │ │ │ └── TypographyScheme.swift │ │ │ │ ├── Utilities/ │ │ │ │ │ └── BindingFactories.swift │ │ │ │ └── ViewModifiers/ │ │ │ │ ├── SwipeBackGesture.swift │ │ │ │ └── TestTagModifier.swift │ │ │ └── Tests/ │ │ │ └── SwiftUIComponentsTests/ │ │ │ ├── BorderTextViewTest.swift │ │ │ ├── CalendarScreenTest.swift │ │ │ ├── CastCardViewTest.swift │ │ │ ├── CastListViewTest.swift │ │ │ ├── ChevronTitleTest.swift │ │ │ ├── ChipViewTest.swift │ │ │ ├── CircularButtonTest.swift │ │ │ ├── DebugScreenTest.swift │ │ │ ├── DiscoverScreenTest.swift │ │ │ ├── EpisodeCollapsibleTest.swift │ │ │ ├── EpisodeDetailSheetContentTest.swift │ │ │ ├── EpisodeItemViewTest.swift │ │ │ ├── EpisodeListViewTest.swift │ │ │ ├── FilledImageButtonTest.swift │ │ │ ├── FullScreenViewTest.swift │ │ │ ├── GridViewTest.swift │ │ │ ├── HeaderViewTest.swift │ │ │ ├── HorizontalItemListViewTest.swift │ │ │ ├── HorizontalShowContentViewTest.swift │ │ │ ├── LibraryScreenTest.swift │ │ │ ├── MoreShowsScreenTest.swift │ │ │ ├── NavigationTopBarTest.swift │ │ │ ├── NextEpisodesSectionTest.swift │ │ │ ├── NotificationRationaleSheetTest.swift │ │ │ ├── OutlinedButtonTest.swift │ │ │ ├── OverviewBoxViewTest.swift │ │ │ ├── PosterItemViewTest.swift │ │ │ ├── ProfileScreenTest.swift │ │ │ ├── ProgressScreenTest.swift │ │ │ ├── ProviderItemViewTest.swift │ │ │ ├── ProviderListViewTest.swift │ │ │ ├── SearchItemViewTest.swift │ │ │ ├── SearchScreenTest.swift │ │ │ ├── SeasonChipViewListTest.swift │ │ │ ├── SeasonDetailsScreenTest.swift │ │ │ ├── SettingsScreenTest.swift │ │ │ ├── ShowContentItemViewTest.swift │ │ │ ├── ShowDetailsScreenTest.swift │ │ │ ├── ShowInfoViewTest.swift │ │ │ ├── SnapshotTestCase.swift │ │ │ ├── ThemeSelectorViewTest.swift │ │ │ ├── ToastViewTest.swift │ │ │ ├── TopBarTest.swift │ │ │ ├── TrailerListViewTest.swift │ │ │ ├── TraktListSelectorContentTest.swift │ │ │ ├── WatchlistScreenTest.swift │ │ │ └── YoutubeItemViewTest.swift │ │ ├── TraktAuthKit/ │ │ │ ├── .gitignore │ │ │ ├── Package.swift │ │ │ └── Sources/ │ │ │ └── TraktAuthKit/ │ │ │ ├── AppAuthCoordinator.swift │ │ │ ├── TraktAuthConfiguration.swift │ │ │ ├── TraktAuthError.swift │ │ │ ├── TraktCredential.swift │ │ │ └── TraktOAuthClient.swift │ │ └── TvManiacKit/ │ │ ├── .gitignore │ │ ├── Package.swift │ │ └── Sources/ │ │ └── TvManiacKit/ │ │ ├── AppDelegate.swift │ │ ├── Architecture/ │ │ │ ├── ComponentHolder.swift │ │ │ ├── ObservableValue.swift │ │ │ └── StateValue.swift │ │ ├── AuthCoordinatorFactory.swift │ │ ├── Decompose/ │ │ │ └── DecomposeNavigationStack.swift │ │ ├── Extensions/ │ │ │ ├── Mapper+Extensions.swift │ │ │ ├── Moko+Extensions.swift │ │ │ └── View+Extensions.swift │ │ ├── KmpLoggerBridge.swift │ │ ├── Models/ │ │ │ └── SwiftImageQuality.swift │ │ ├── Modifiers/ │ │ │ ├── AppThemeModifier.swift │ │ │ └── DebugTapGesture.swift │ │ ├── Navigation/ │ │ │ ├── ScreenRegistry+Typed.swift │ │ │ └── ScreenRegistry.swift │ │ ├── NotificationDelegate.swift │ │ ├── SFSafariViewWrapper.swift │ │ ├── SettingsAppStorage.swift │ │ ├── Theme/ │ │ │ └── TvManiacTypographyScheme+Moko.swift │ │ ├── ThemeUtilities.swift │ │ ├── TraktAuthCoordinator.swift │ │ └── TvManiacKit.swift │ ├── ios/ │ │ ├── App/ │ │ │ ├── AppIcon.swift │ │ │ └── iOSApp.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── AppIconDebug.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Colors/ │ │ │ │ ├── Background.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── TabBackgroundColor.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── TextColor.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── accent.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── accentBlue.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── content_background.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── gradient_background.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── grey_200.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── grey_500.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── grey_900.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── text_color_bg.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── yellow_300.colorset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── yellow_500.colorset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── TvManiacIcon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── TvManiacIconDebug.imageset/ │ │ │ │ └── Contents.json │ │ │ └── trakt_logo.imageset/ │ │ │ └── Contents.json │ │ ├── Components/ │ │ │ └── ColorScheme.swift │ │ ├── Feature/ │ │ │ └── Grid/ │ │ │ └── ShowGridView.swift │ │ ├── Info.plist │ │ ├── PrivacyInfo.xcprivacy │ │ └── UI/ │ │ ├── Debug/ │ │ │ └── DebugMenuView.swift │ │ ├── EpisodeDetail/ │ │ │ └── EpisodeDetailSheetView.swift │ │ ├── MoreShows/ │ │ │ └── MoreShowsView.swift │ │ ├── Root/ │ │ │ ├── RootNavigationView.swift │ │ │ └── ScreenRegistryBootstrap.swift │ │ ├── SeasonDetails/ │ │ │ └── SeasonDetailsView.swift │ │ ├── Settings/ │ │ │ └── SettingsView.swift │ │ ├── ShowDetails/ │ │ │ └── ShowDetailsView.swift │ │ ├── SplashScreen/ │ │ │ └── SplashView.swift │ │ ├── Tabs/ │ │ │ ├── Components/ │ │ │ │ ├── SortOptionsSheet.swift │ │ │ │ ├── TabContentView.swift │ │ │ │ ├── UpNextPageContent.swift │ │ │ │ └── WatchlistListItem.swift │ │ │ ├── DiscoverTab.swift │ │ │ ├── LibraryTab.swift │ │ │ ├── ProfileTab.swift │ │ │ ├── ProgressTab.swift │ │ │ ├── SearchTab.swift │ │ │ ├── TabBarView.swift │ │ │ └── WatchlistTab.swift │ │ └── Watchlist/ │ │ └── WatchlistSelector.swift │ └── tv-maniac.xcodeproj/ │ ├── project.pbxproj │ ├── project.xcworkspace/ │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata/ │ └── xcschemes/ │ ├── SwiftUIComponents.xcscheme │ ├── TvManiacKit.xcscheme │ └── tv-maniac.xcscheme ├── ios-framework/ │ ├── build.gradle.kts │ └── src/ │ └── iosMain/ │ └── kotlin/ │ └── com.thomaskioko.tvmaniac.iosframework/ │ ├── IosApplicationGraph.kt │ └── IosViewPresenterGraph.kt ├── navigation/ │ ├── api/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── navigation/ │ │ ├── NavDestination.kt │ │ ├── NavRoute.kt │ │ ├── NavRouteBinding.kt │ │ ├── NavRouteSerializer.kt │ │ ├── NavigationResultRegistry.kt │ │ ├── NavigationResultRequest.kt │ │ ├── NavigationResults.kt │ │ ├── Navigator.kt │ │ ├── RootChild.kt │ │ ├── ScreenDestination.kt │ │ ├── SheetChild.kt │ │ ├── SheetChildFactory.kt │ │ ├── SheetConfig.kt │ │ ├── SheetConfigBinding.kt │ │ ├── SheetConfigSerializer.kt │ │ ├── SheetDestination.kt │ │ └── SheetNavigator.kt │ ├── implementation/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── navigation/ │ │ │ ├── DefaultNavRouteSerializer.kt │ │ │ ├── DefaultNavigationResultRegistry.kt │ │ │ ├── DefaultNavigator.kt │ │ │ ├── DefaultSheetConfigSerializer.kt │ │ │ └── di/ │ │ │ └── NavigationMultibindings.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── navigation/ │ │ ├── DefaultNavRouteSerializerTest.kt │ │ ├── DefaultNavigationResultRegistryTest.kt │ │ ├── DefaultNavigatorTest.kt │ │ ├── DefaultSheetConfigSerializerTest.kt │ │ └── FakeNavigator.kt │ ├── testing/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── thomaskioko/ │ │ │ └── tvmaniac/ │ │ │ └── navigation/ │ │ │ └── testing/ │ │ │ ├── FakeSheetNavigator.kt │ │ │ ├── NavEvent.kt │ │ │ ├── NavigatorTurbine.kt │ │ │ └── TestNavigator.kt │ │ └── commonTest/ │ │ └── kotlin/ │ │ └── com/ │ │ └── thomaskioko/ │ │ └── tvmaniac/ │ │ └── navigation/ │ │ └── testing/ │ │ └── NavigatorTest.kt │ └── ui/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── kotlin/ │ └── com/ │ └── thomaskioko/ │ └── tvmaniac/ │ └── navigation/ │ └── ui/ │ ├── ScreenContent.kt │ ├── SheetContent.kt │ └── di/ │ └── NavigationUiMultibindings.kt ├── release/ │ ├── RELEASE.md │ ├── app-release.aes │ ├── firebase-sa.aes │ └── play-service-account.aes ├── scripts/ │ ├── git-hooks/ │ │ └── pre-commit │ └── install-git-hooks.sh ├── settings.gradle.kts └── version.txt