gitextract_ozggl_4v/ ├── .claude/ │ └── skills/ │ └── jetpack-compose-audit/ │ ├── README.md │ ├── SKILL.md │ ├── references/ │ │ ├── canonical-sources.md │ │ ├── diagnostics.md │ │ ├── report-template.md │ │ ├── scoring.md │ │ └── search-playbook.md │ └── scripts/ │ └── compose-reports.init.gradle ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ └── workflows/ │ ├── android.yml │ ├── baseline-profiles.yml │ └── native-packs.yml ├── .gitignore ├── .gitmodules ├── .idea/ │ ├── .gitignore │ ├── .name │ ├── AndroidProjectSystem.xml │ ├── compiler.xml │ ├── deploymentTargetSelector.xml │ ├── deviceManager.xml │ ├── gradle.xml │ ├── misc.xml │ ├── runConfigurations/ │ │ ├── BaselineProfile_Smartphone.xml │ │ ├── BaselineProfile_TV.xml │ │ └── M3UAndroid___benchmark_Pixel5Api31BenchmarkAndroidTest_.xml │ ├── runConfigurations.xml │ └── vcs.xml ├── AGENTS.md ├── CODE_OF_CONDUCT.md ├── COMPOSE-AUDIT-REPORT.md ├── LICENSE ├── MATERIAL-3-AUDIT-REPORT.md ├── README.md ├── app/ │ ├── AGENTS.md │ ├── extension/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── m3u/ │ │ │ └── extension/ │ │ │ ├── MainActivity.kt │ │ │ └── ui/ │ │ │ └── theme/ │ │ │ ├── Color.kt │ │ │ ├── Theme.kt │ │ │ └── Type.kt │ │ └── res/ │ │ ├── mipmap-anydpi-v26/ │ │ │ └── ic_launcher.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ ├── smartphone/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── m3u/ │ │ │ └── testing/ │ │ │ └── MockServerSmokeTest.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── generated/ │ │ │ │ └── baselineProfiles/ │ │ │ │ ├── baseline-prof.txt │ │ │ │ └── startup-prof.txt │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── m3u/ │ │ │ │ └── smartphone/ │ │ │ │ ├── AppModule.kt │ │ │ │ ├── AppPublisher.kt │ │ │ │ ├── M3UApplication.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── TimeUtils.kt │ │ │ │ ├── benchmark/ │ │ │ │ │ └── DebugBenchmarkSettings.kt │ │ │ │ ├── glance/ │ │ │ │ │ ├── FavouriteWidget.kt │ │ │ │ │ └── GlanceReceiver.kt │ │ │ │ ├── startup/ │ │ │ │ │ └── ComposeInitializer.kt │ │ │ │ └── ui/ │ │ │ │ ├── App.kt │ │ │ │ ├── AppViewModel.kt │ │ │ │ ├── business/ │ │ │ │ │ ├── channel/ │ │ │ │ │ │ ├── ChannelMask.kt │ │ │ │ │ │ ├── ChannelMaskUtils.kt │ │ │ │ │ │ ├── ChannelScreen.kt │ │ │ │ │ │ ├── MaskGesture.kt │ │ │ │ │ │ ├── PlayerActivity.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── DlnaDeviceItem.kt │ │ │ │ │ │ ├── DlnaDevicesBottomSheet.kt │ │ │ │ │ │ ├── FormatItem.kt │ │ │ │ │ │ ├── FormatsBottomSheet.kt │ │ │ │ │ │ ├── MaskGestureValuePanel.kt │ │ │ │ │ │ ├── MaskValueButton.kt │ │ │ │ │ │ ├── PlayerMask.kt │ │ │ │ │ │ ├── PlayerPanel.kt │ │ │ │ │ │ ├── ProgrammeGuide.kt │ │ │ │ │ │ └── VerticalGestureArea.kt │ │ │ │ │ ├── configuration/ │ │ │ │ │ │ ├── PlaylistConfigurationNavigation.kt │ │ │ │ │ │ ├── PlaylistConfigurationScreen.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── AutoSyncProgrammesButton.kt │ │ │ │ │ │ ├── EpgManifestGallery.kt │ │ │ │ │ │ ├── SyncProgrammesButton.kt │ │ │ │ │ │ └── XtreamPanel.kt │ │ │ │ │ ├── extension/ │ │ │ │ │ │ └── ExtensionScreen.kt │ │ │ │ │ ├── favourite/ │ │ │ │ │ │ ├── FavouriteScreen.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── FavoriteGallery.kt │ │ │ │ │ │ └── FavoriteItem.kt │ │ │ │ │ ├── foryou/ │ │ │ │ │ │ ├── ForyouScreen.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── HeadlineBackground.kt │ │ │ │ │ │ ├── Loading.kt │ │ │ │ │ │ ├── PlaylistGallery.kt │ │ │ │ │ │ ├── PlaylistItem.kt │ │ │ │ │ │ └── recommend/ │ │ │ │ │ │ ├── RecommendGallery.kt │ │ │ │ │ │ └── RecommendItem.kt │ │ │ │ │ ├── playlist/ │ │ │ │ │ │ ├── PlaylistNavigation.kt │ │ │ │ │ │ ├── PlaylistScreen.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── ChannelGallery.kt │ │ │ │ │ │ ├── ChannelItem.kt │ │ │ │ │ │ └── PlaylistTabRow.kt │ │ │ │ │ └── setting/ │ │ │ │ │ ├── SettingScreen.kt │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── CanvasBottomSheet.kt │ │ │ │ │ │ ├── CheckBoxSharedPreference.kt │ │ │ │ │ │ ├── DataSourceSelection.kt │ │ │ │ │ │ ├── EpgPlaylistItem.kt │ │ │ │ │ │ ├── HiddenChannelItem.kt │ │ │ │ │ │ ├── HiddenPlaylistItem.kt │ │ │ │ │ │ ├── LocalStorageButton.kt │ │ │ │ │ │ ├── LocalStorageSwitch.kt │ │ │ │ │ │ └── RemoteControlSubscribeSwitch.kt │ │ │ │ │ └── fragments/ │ │ │ │ │ ├── AppearanceFragment.kt │ │ │ │ │ ├── CodecPackFragment.kt │ │ │ │ │ ├── OptionalFragment.kt │ │ │ │ │ ├── SubscriptionsFragment.kt │ │ │ │ │ └── preferences/ │ │ │ │ │ ├── OtherPreferences.kt │ │ │ │ │ ├── PreferencesFragment.kt │ │ │ │ │ └── RegularPreferences.kt │ │ │ │ ├── common/ │ │ │ │ │ ├── AppNavHost.kt │ │ │ │ │ ├── RootGraph.kt │ │ │ │ │ ├── SmartphoneViewModel.kt │ │ │ │ │ ├── connect/ │ │ │ │ │ │ ├── CodeRow.kt │ │ │ │ │ │ ├── DPadContent.kt │ │ │ │ │ │ ├── PrepareContent.kt │ │ │ │ │ │ ├── RemoteControlSheet.kt │ │ │ │ │ │ ├── RemoteDirectionController.kt │ │ │ │ │ │ └── VirtualNumberKeyboard.kt │ │ │ │ │ ├── helper/ │ │ │ │ │ │ ├── Element.kt │ │ │ │ │ │ ├── Helper.kt │ │ │ │ │ │ └── Metadata.kt │ │ │ │ │ └── internal/ │ │ │ │ │ ├── Events.kt │ │ │ │ │ └── Toolkit.kt │ │ │ │ └── material/ │ │ │ │ ├── M3UHapticFeedback.kt │ │ │ │ ├── RecomposeHighlighter.kt │ │ │ │ ├── brush/ │ │ │ │ │ └── Scrim.kt │ │ │ │ ├── components/ │ │ │ │ │ ├── Backgrounds.kt │ │ │ │ │ ├── Badges.kt │ │ │ │ │ ├── BottomSheet.kt │ │ │ │ │ ├── Brushes.kt │ │ │ │ │ ├── Destination.kt │ │ │ │ │ ├── EpisodesBottomSheet.kt │ │ │ │ │ ├── EventHandler.kt │ │ │ │ │ ├── FontFamilies.kt │ │ │ │ │ ├── HorizontalPagerIndicator.kt │ │ │ │ │ ├── Images.kt │ │ │ │ │ ├── Layouts.kt │ │ │ │ │ ├── Lotties.kt │ │ │ │ │ ├── MediaSheet.kt │ │ │ │ │ ├── MonoText.kt │ │ │ │ │ ├── Player.kt │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ ├── PullPanelLayout.kt │ │ │ │ │ ├── Selections.kt │ │ │ │ │ ├── SnackHost.kt │ │ │ │ │ ├── SortBottomSheet.kt │ │ │ │ │ ├── TextFields.kt │ │ │ │ │ ├── ThemeSelection.kt │ │ │ │ │ └── mask/ │ │ │ │ │ ├── Mask.kt │ │ │ │ │ ├── MaskButton.kt │ │ │ │ │ ├── MaskCircleButton.kt │ │ │ │ │ ├── MaskDefaults.kt │ │ │ │ │ ├── MaskInterceptor.kt │ │ │ │ │ ├── MaskPanel.kt │ │ │ │ │ └── MaskState.kt │ │ │ │ ├── effects/ │ │ │ │ │ └── BackStack.kt │ │ │ │ ├── ktx/ │ │ │ │ │ ├── Blurs.kt │ │ │ │ │ ├── Colors.kt │ │ │ │ │ ├── Effects.kt │ │ │ │ │ ├── Interaction.kt │ │ │ │ │ ├── InterceptEvent.kt │ │ │ │ │ ├── LifecycleEffect.kt │ │ │ │ │ ├── Modifier.kt │ │ │ │ │ ├── PaddingValues.kt │ │ │ │ │ ├── Pager.kt │ │ │ │ │ ├── Permissions.kt │ │ │ │ │ ├── ScrollableState.kt │ │ │ │ │ └── Unspecified.kt │ │ │ │ ├── model/ │ │ │ │ │ ├── Duration.kt │ │ │ │ │ ├── GradientColors.kt │ │ │ │ │ ├── LocalHazeState.kt │ │ │ │ │ ├── Spacing.kt │ │ │ │ │ └── Theme.kt │ │ │ │ ├── texture/ │ │ │ │ │ ├── TextureContainer.kt │ │ │ │ │ └── Textures.kt │ │ │ │ └── transformation/ │ │ │ │ ├── BlurTransformation.kt │ │ │ │ └── ColorCombineTransformation.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ ├── baseline_history_toggle_off_24.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ ├── ic_splash.xml │ │ │ │ ├── round_calendar_month_24.xml │ │ │ │ └── round_space_dashboard_24.xml │ │ │ ├── font/ │ │ │ │ └── google_sans.xml │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ └── ic_launcher.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ ├── stings.xml │ │ │ │ └── themes.xml │ │ │ ├── values-night/ │ │ │ │ └── colors.xml │ │ │ ├── values-v27/ │ │ │ │ └── themes.xml │ │ │ ├── values-v29/ │ │ │ │ └── themes.xml │ │ │ ├── xml/ │ │ │ │ ├── backup_rules.xml │ │ │ │ ├── data_extraction_rules.xml │ │ │ │ ├── filepaths.xml │ │ │ │ ├── shortcuts.xml │ │ │ │ └── widget_info.xml │ │ │ └── xml-v31/ │ │ │ └── widget_info.xml │ │ ├── release/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── m3u/ │ │ │ └── smartphone/ │ │ │ └── startup/ │ │ │ └── CodecNativeInitializer.kt │ │ └── snapshotChannel/ │ │ └── res/ │ │ └── values/ │ │ ├── colors.xml │ │ └── stings.xml │ └── tv/ │ ├── .gitignore │ ├── AGENTS.md │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── testing/ │ │ └── MockServerSmokeTest.kt │ └── main/ │ ├── AndroidManifest.xml │ ├── generated/ │ │ └── baselineProfiles/ │ │ ├── baseline-prof.txt │ │ └── startup-prof.txt │ ├── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── tv/ │ │ ├── App.kt │ │ ├── AppModule.kt │ │ ├── AppPublisher.kt │ │ ├── M3UApplication.kt │ │ ├── MainActivity.kt │ │ ├── TvComponents.kt │ │ ├── TvHomeViewModel.kt │ │ ├── TvPlayerScreen.kt │ │ ├── TvScreens.kt │ │ ├── TvStyle.kt │ │ └── startup/ │ │ └── ComposeInitializer.kt │ └── res/ │ └── values/ │ ├── stings.xml │ └── themes.xml ├── baselineprofile/ │ ├── smartphone/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── baselineprofile/ │ │ ├── BaselineProfileGenerator.kt │ │ └── StartupBenchmarks.kt │ └── tv/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── m3u/ │ └── baselineprofile/ │ ├── BaselineProfileGenerator.kt │ └── StartupBenchmarks.kt ├── build.gradle.kts ├── business/ │ ├── AGENTS.md │ ├── channel/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── business/ │ │ └── channel/ │ │ ├── ChannelViewModel.kt │ │ ├── CwPositionConsumer.kt │ │ └── PlayerState.kt │ ├── extension/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── business/ │ │ └── extension/ │ │ └── ExtensionViewModel.kt │ ├── favorite/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── m3u/ │ │ │ └── business/ │ │ │ └── favorite/ │ │ │ └── FavouriteViewModel.kt │ │ └── res/ │ │ └── drawable/ │ │ └── round_play_arrow_24.xml │ ├── foryou/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── m3u/ │ │ │ └── business/ │ │ │ └── foryou/ │ │ │ ├── ForyouViewModel.kt │ │ │ └── Recommend.kt │ │ └── res/ │ │ └── raw/ │ │ ├── empty.json │ │ └── loading.json │ ├── playlist/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── m3u/ │ │ │ └── business/ │ │ │ └── playlist/ │ │ │ ├── PlaylistMessage.kt │ │ │ ├── PlaylistNavigation.kt │ │ │ └── PlaylistViewModel.kt │ │ └── res/ │ │ └── drawable/ │ │ └── round_play_arrow_24.xml │ ├── playlist-configuration/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── business/ │ │ └── playlist/ │ │ └── configuration/ │ │ ├── PlaylistConfigurationNavigation.kt │ │ └── PlaylistConfigurationViewModel.kt │ └── setting/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── business/ │ │ └── setting/ │ │ ├── BackingUpAndRestoringState.kt │ │ ├── CodecPackState.kt │ │ ├── SettingMessage.kt │ │ ├── SettingProperties.kt │ │ └── SettingViewModel.kt │ └── res/ │ └── drawable/ │ └── telegram.xml ├── compose_compiler_config.conf ├── core/ │ ├── .gitignore │ ├── AGENTS.md │ ├── README.md │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── extension/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── m3u/ │ │ │ └── core/ │ │ │ └── extension/ │ │ │ ├── OnRemoteCall.kt │ │ │ ├── OnRemoteCallImpl.kt │ │ │ ├── RemoteService.kt │ │ │ ├── RemoteServiceDependencies.kt │ │ │ ├── RemoteServiceDependenciesImpl.kt │ │ │ ├── Utils.kt │ │ │ └── business/ │ │ │ ├── InfoModule.kt │ │ │ ├── RemoteModule.kt │ │ │ └── SubscribeModule.kt │ │ └── resources/ │ │ └── META-INF/ │ │ └── services/ │ │ ├── com.m3u.core.extension.OnRemoteCall │ │ └── com.m3u.core.extension.RemoteServiceDependencies │ ├── foundation/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── core/ │ │ └── foundation/ │ │ ├── Contracts.kt │ │ ├── architecture/ │ │ │ ├── FileProvider.kt │ │ │ ├── Publisher.kt │ │ │ └── preferences/ │ │ │ ├── ClipMode.kt │ │ │ ├── ConnectTimeout.kt │ │ │ ├── PlaylistStrategy.kt │ │ │ ├── Preferences.kt │ │ │ ├── ReconnectMode.kt │ │ │ └── UnseensMilliseconds.kt │ │ ├── components/ │ │ │ ├── AbsoluteSmoothCornerShape.kt │ │ │ ├── CircularProgressIndicator.kt │ │ │ └── SmoothCorner.kt │ │ ├── ktx/ │ │ │ └── NotNulls.kt │ │ ├── suggest/ │ │ │ └── Suggester.kt │ │ ├── ui/ │ │ │ ├── Composable.kt │ │ │ ├── SugarColors.kt │ │ │ └── ThenIf.kt │ │ ├── unit/ │ │ │ └── DataUnit.kt │ │ ├── util/ │ │ │ ├── Files.kt │ │ │ ├── basic/ │ │ │ │ ├── Graphics.kt │ │ │ │ ├── LetIf.kt │ │ │ │ └── Strings.kt │ │ │ ├── collections/ │ │ │ │ ├── ForEachNotNull.kt │ │ │ │ └── IndexOf.kt │ │ │ ├── compose/ │ │ │ │ └── ObservableState.kt │ │ │ ├── context/ │ │ │ │ ├── Configuration.kt │ │ │ │ ├── SharedPreferences.kt │ │ │ │ └── Toasts.kt │ │ │ └── coroutine/ │ │ │ └── Flows.kt │ │ └── wrapper/ │ │ ├── Event.kt │ │ ├── Message.kt │ │ ├── Resource.kt │ │ └── Sort.kt │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ └── AndroidManifest.xml ├── data/ │ ├── .gitignore │ ├── AGENTS.md │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ ├── schemas/ │ │ └── com.m3u.data.database.M3UDatabase/ │ │ ├── 1.json │ │ ├── 10.json │ │ ├── 11.json │ │ ├── 12.json │ │ ├── 13.json │ │ ├── 14.json │ │ ├── 15.json │ │ ├── 16.json │ │ ├── 17.json │ │ ├── 18.json │ │ ├── 19.json │ │ ├── 2.json │ │ ├── 20.json │ │ ├── 21.json │ │ ├── 3.json │ │ ├── 4.json │ │ ├── 5.json │ │ ├── 6.json │ │ ├── 7.json │ │ ├── 8.json │ │ └── 9.json │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── data/ │ │ ├── Certs.kt │ │ ├── SSLs.kt │ │ ├── api/ │ │ │ ├── ApiModule.kt │ │ │ ├── BaseUrls.kt │ │ │ ├── TvApiDelegate.kt │ │ │ └── dto/ │ │ │ └── github/ │ │ │ ├── Asset.kt │ │ │ ├── File.kt │ │ │ ├── Leaf.kt │ │ │ ├── Links.kt │ │ │ ├── Release.kt │ │ │ ├── Tree.kt │ │ │ └── User.kt │ │ ├── codec/ │ │ │ ├── CodecNativeLoader.kt │ │ │ ├── CodecPackConfig.kt │ │ │ ├── CodecPackManifest.kt │ │ │ └── CodecPackRepository.kt │ │ ├── database/ │ │ │ ├── Converters.kt │ │ │ ├── DatabaseMigrations.kt │ │ │ ├── DatabaseModule.kt │ │ │ ├── M3UDatabase.kt │ │ │ ├── dao/ │ │ │ │ ├── ChannelDao.kt │ │ │ │ ├── ColorSchemeDao.kt │ │ │ │ ├── EpisodeDao.kt │ │ │ │ ├── PlaylistDao.kt │ │ │ │ └── ProgrammeDao.kt │ │ │ ├── example/ │ │ │ │ └── ColorSchemeExample.kt │ │ │ └── model/ │ │ │ ├── AdjacentChannels.kt │ │ │ ├── Channel.kt │ │ │ ├── ColorScheme.kt │ │ │ ├── Episode.kt │ │ │ ├── Playlist.kt │ │ │ └── Programme.kt │ │ ├── model/ │ │ │ └── ChannelSet.kt │ │ ├── parser/ │ │ │ ├── ParserModule.kt │ │ │ ├── ParserUtils.kt │ │ │ ├── epg/ │ │ │ │ ├── EpgData.kt │ │ │ │ ├── EpgParser.kt │ │ │ │ └── EpgParserImpl.kt │ │ │ ├── m3u/ │ │ │ │ ├── M3UData.kt │ │ │ │ ├── M3UParser.kt │ │ │ │ └── M3UParserImpl.kt │ │ │ └── xtream/ │ │ │ ├── XtreamCategory.kt │ │ │ ├── XtreamChannelInfo.kt │ │ │ ├── XtreamData.kt │ │ │ ├── XtreamInfo.kt │ │ │ ├── XtreamOutput.kt │ │ │ ├── XtreamParser.kt │ │ │ └── XtreamParserImpl.kt │ │ ├── repository/ │ │ │ ├── BackupOrRestoreContracts.kt │ │ │ ├── CoroutineCache.kt │ │ │ ├── RepositoryModule.kt │ │ │ ├── channel/ │ │ │ │ ├── ChannelRepository.kt │ │ │ │ └── ChannelRepositoryImpl.kt │ │ │ ├── media/ │ │ │ │ ├── MediaRepository.kt │ │ │ │ └── MediaRepositoryImpl.kt │ │ │ ├── playlist/ │ │ │ │ ├── PlaylistRepository.kt │ │ │ │ └── PlaylistRepositoryImpl.kt │ │ │ ├── programme/ │ │ │ │ ├── ProgrammeRepository.kt │ │ │ │ └── ProgrammeRepositoryImpl.kt │ │ │ └── tv/ │ │ │ ├── TvRepository.kt │ │ │ └── TvRepositoryImpl.kt │ │ ├── service/ │ │ │ ├── DPadReactionService.kt │ │ │ ├── Messager.kt │ │ │ ├── PlayerManager.kt │ │ │ ├── ServicesModule.kt │ │ │ └── internal/ │ │ │ ├── ChannelPreferenceProvider.kt │ │ │ ├── Codecs.kt │ │ │ ├── ContinueWatchingCondition.kt │ │ │ ├── DPadReactionServiceImpl.kt │ │ │ ├── FileProviderImpl.kt │ │ │ ├── KodiAdaptions.kt │ │ │ ├── MessagerImpl.kt │ │ │ ├── PlayerManagerImpl.kt │ │ │ └── Utils.kt │ │ ├── tv/ │ │ │ ├── Utils.kt │ │ │ ├── http/ │ │ │ │ ├── HttpServer.kt │ │ │ │ ├── HttpServerImpl.kt │ │ │ │ └── endpoint/ │ │ │ │ ├── DefRep.kt │ │ │ │ ├── Endpoint.kt │ │ │ │ ├── Playlists.kt │ │ │ │ ├── Remotes.kt │ │ │ │ └── SayHellos.kt │ │ │ ├── model/ │ │ │ │ ├── RemoteDirection.kt │ │ │ │ └── TvInfo.kt │ │ │ └── nsd/ │ │ │ ├── NsdDeviceManager.kt │ │ │ ├── NsdDeviceManagerImpl.kt │ │ │ └── NsdResolveListener.kt │ │ └── worker/ │ │ ├── BackupWorker.kt │ │ ├── ProgrammeReminder.kt │ │ ├── RestoreWorker.kt │ │ └── SubscriptionWorker.kt │ └── res/ │ └── drawable/ │ ├── baseline_notifications_none_24.xml │ ├── round_cancel_24.xml │ ├── round_file_download_24.xml │ └── round_refresh_24.xml ├── docs/ │ └── native-load-yaml.md ├── fastlane/ │ └── metadata/ │ └── android/ │ ├── en-US/ │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ └── title.txt │ └── es-ES/ │ ├── full_description.txt │ └── short_description.txt ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── i18n/ │ ├── .gitignore │ ├── AGENTS.md │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── res/ │ ├── values/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-de-rDE/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-es-rES/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-es-rMX/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-fr-rFR/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-id-rID/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-it-rIT/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-pt-rBR/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-ro-rRO/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-sv-rSE/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ ├── values-tr-rTR/ │ │ ├── app.xml │ │ ├── data.xml │ │ ├── feat_about.xml │ │ ├── feat_console.xml │ │ ├── feat_favourite.xml │ │ ├── feat_foryou.xml │ │ ├── feat_playlist.xml │ │ ├── feat_playlist_configuration.xml │ │ ├── feat_setting.xml │ │ ├── feat_stream.xml │ │ └── ui.xml │ └── values-zh-rCN/ │ ├── app.xml │ ├── data.xml │ ├── feat_about.xml │ ├── feat_console.xml │ ├── feat_favourite.xml │ ├── feat_foryou.xml │ ├── feat_playlist.xml │ ├── feat_playlist_configuration.xml │ ├── feat_setting.xml │ ├── feat_stream.xml │ └── ui.xml ├── jitpack.yml ├── lint/ │ ├── annotation/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── annotation/ │ │ ├── Exclude.kt │ │ └── Likable.kt │ └── processor/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── m3u/ │ │ └── processor/ │ │ └── likable/ │ │ ├── LikableSymbolProcessor.kt │ │ └── LikableSymbolProcessorProvider.kt │ └── resources/ │ └── META-INF/ │ └── services/ │ └── com.google.devtools.ksp.processing.SymbolProcessorProvider ├── lint.xml ├── native-load.yml ├── native-packs/ │ └── nextlib-0.8.5/ │ └── m3u-codec-nextlib-0.8.5.json ├── renovate.json ├── settings.gradle.kts └── testing/ ├── AGENTS.md ├── device-benchmark/ │ ├── README.md │ ├── build.gradle.kts │ ├── mobly/ │ │ └── remote_control_subscribe_test.py │ ├── mobly_config.yml │ └── requirements.txt └── mock-server/ ├── README.md ├── build.gradle.kts └── src/ └── main/ └── kotlin/ └── com/ └── m3u/ └── testing/ └── mockserver/ └── Main.kt