Upgraded a bunch of dependencies (#2382)

diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index 217e5c5..f8467b4 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="KotlinJpsPluginSettings">
-    <option name="version" value="1.8.21" />
+    <option name="version" value="1.9.10" />
   </component>
 </project>
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index a26b100..c923c31 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,10 +2,10 @@
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
+  id "com.android.tools.build" apply false
   id 'net.ltgt.errorprone' apply false
   id "com.google.devtools.ksp" apply false
   id "org.ajoberstar.grgit" apply false
-  id "com.android.library" apply false
   id "org.jetbrains.kotlin.jvm" apply false
   id "com.vanniktech.maven.publish" apply false
   id "org.jetbrains.dokka" apply false
@@ -13,7 +13,7 @@
 
 allprojects {
   def compileJavaVersion = JavaVersion.VERSION_17
-  def targetJavaVersion = JavaVersion.VERSION_1_8
+  def targetJavaVersion = JavaVersion.VERSION_17
   pluginManager.withPlugin("java") {
     java {
       toolchain {
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 9fcf0d7..859b55b 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -4,6 +4,7 @@
 
 androidx-activity-compose = "androidx.activity:activity-compose:_"
 androidx-appcompat = "androidx.appcompat:appcompat:_"
+androidx-fragment = "androidx.fragment:fragment-ktx:_"
 androidx-browser = "androidx.browser:browser:_"
 androidx-cardview = "androidx.cardview:cardview:_"
 androidx-collection-ktx = "androidx.collection:collection:_"
diff --git a/issue-repro-compose/build.gradle b/issue-repro-compose/build.gradle
index 4f5a631..ff49721 100755
--- a/issue-repro-compose/build.gradle
+++ b/issue-repro-compose/build.gradle
@@ -7,11 +7,11 @@
 
 android {
     namespace 'com.airbnb.lottie.issues.compose'
-    compileSdk 33
+    compileSdk 34
     defaultConfig {
         applicationId "com.airbnb.lottie.issues.compose"
         minSdk 21
-        targetSdk 33
+        targetSdk 34
         versionCode 1
         versionName "1.0"
     }
diff --git a/issue-repro/build.gradle b/issue-repro/build.gradle
index 2ce7bf5..73c77a0 100755
--- a/issue-repro/build.gradle
+++ b/issue-repro/build.gradle
@@ -5,11 +5,11 @@
 
 android {
     namespace 'com.airbnb.lottie.issues'
-    compileSdk 33
+    compileSdk 34
     defaultConfig {
         applicationId "com.airbnb.lottie.issues"
         minSdk 16
-        targetSdk 33
+        targetSdk 34
         versionCode 1
         versionName "1.0"
     }
diff --git a/lottie-compose/build.gradle b/lottie-compose/build.gradle
index 0e8e427..099aa04 100644
--- a/lottie-compose/build.gradle
+++ b/lottie-compose/build.gradle
@@ -9,10 +9,10 @@
 
 android {
   namespace 'com.airbnb.lottie.compose'
-  compileSdk 33
+  compileSdk 34
   defaultConfig {
     minSdk 21
-    targetSdk 33
+    targetSdk 34
     testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   }
   buildTypes {
@@ -50,4 +50,4 @@
   testImplementation libs.junit4
   androidTestImplementation libs.androidx.test.junit
   androidTestImplementation libs.androidx.test.espresso
-}
\ No newline at end of file
+}
diff --git a/lottie/build.gradle b/lottie/build.gradle
index 596eb44..3c18376 100644
--- a/lottie/build.gradle
+++ b/lottie/build.gradle
@@ -10,10 +10,10 @@
 android {
   namespace 'com.airbnb.lottie'
   resourcePrefix 'lottie_'
-  compileSdk 33
+  compileSdk 34
   defaultConfig {
     minSdk 16
-    targetSdk 33
+    targetSdk 34
     testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   }
   lintOptions {
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
index 8234e74..d288528 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
@@ -33,7 +33,6 @@
 import androidx.annotation.RestrictTo;
 
 import com.airbnb.lottie.animation.LPaint;
-import com.airbnb.lottie.animation.keyframe.PathKeyframe;
 import com.airbnb.lottie.manager.FontAssetManager;
 import com.airbnb.lottie.manager.ImageAssetManager;
 import com.airbnb.lottie.model.Font;
@@ -336,7 +335,7 @@
    * Be wary if you are using many images, however. Lottie is designed to work with vector shapes
    * from After Effects. If your images look like they could be represented with vector shapes,
    * see if it is possible to convert them to shape layers and re-export your animation. Check
-   * the documentation at http://airbnb.io/lottie for more information about importing shapes from
+   * the documentation at <a href="http://airbnb.io/lottie">airbnb.io/lottie</a> for more information about importing shapes from
    * Sketch or Illustrator to avoid this.
    */
   public void setImagesAssetsFolder(@Nullable String imageAssetsFolder) {
@@ -460,7 +459,7 @@
    * <p/>
    * Sets the current value for {@link AsyncUpdates}. Refer to the docs for {@link AsyncUpdates} for more info.
    */
-  public void setAsyncUpdates(AsyncUpdates asyncUpdates) {
+  public void setAsyncUpdates(@Nullable AsyncUpdates asyncUpdates) {
     this.asyncUpdates = asyncUpdates;
   }
 
@@ -1318,7 +1317,7 @@
    * <p>
    * Internally, this will check if the {@link KeyPath} has already been resolved with
    * {@link #resolveKeyPath(KeyPath)} and will resolve it if it hasn't.
-   *
+   * <p>
    * Set the callback to null to clear it.
    */
   public <T> void addValueCallback(
diff --git a/sample-compose-benchmark/build.gradle b/sample-compose-benchmark/build.gradle
index a83accd..df2da67 100644
--- a/sample-compose-benchmark/build.gradle
+++ b/sample-compose-benchmark/build.gradle
@@ -5,7 +5,7 @@
 
 android {
   namespace 'com.airbnb.lottie.sample.compose.benchmark'
-  compileSdk 33
+  compileSdk 34
 
   kotlinOptions {
     freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
@@ -13,7 +13,7 @@
 
   defaultConfig {
     minSdk 30
-    targetSdk 33
+    targetSdk 34
 
     testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   }
diff --git a/sample-compose/build.gradle b/sample-compose/build.gradle
index abaacad..279dd7e 100644
--- a/sample-compose/build.gradle
+++ b/sample-compose/build.gradle
@@ -8,11 +8,11 @@
 
 android {
   namespace 'com.airbnb.lottie.sample.compose'
-  compileSdk 33
+  compileSdk 34
   defaultConfig {
     applicationId "com.airbnb.lottie.sample.compose"
     minSdk 21
-    targetSdk 33
+    targetSdk 34
     versionCode 1
     versionName VERSION_NAME
     testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/ViewPagerExample.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/ViewPagerExample.kt
index c05b47a..ab8dba3 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/ViewPagerExample.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/ViewPagerExample.kt
@@ -20,19 +20,16 @@
 @Composable
 fun ViewPagerExamplePage() {
     val colors = listOf(Color.Red, Color.Green, Color.Blue, Color.Magenta)
-    val pagerState = rememberPagerState()
+    val pagerState = rememberPagerState { colors.size }
     Box(
         modifier = Modifier
-            .fillMaxSize()
+            .fillMaxSize(),
     ) {
-        HorizontalPager(
-            colors.size,
-            state = pagerState
-        ) { page ->
+        HorizontalPager(pagerState) { page ->
             Box(
                 modifier = Modifier
                     .fillMaxSize()
-                    .background(colors[page])
+                    .background(colors[page]),
             )
         }
         WalkthroughAnimation(pagerState, colors.size)
@@ -47,6 +44,6 @@
         composition,
         { progress },
         modifier = Modifier
-            .fillMaxSize()
+            .fillMaxSize(),
     )
-}
\ No newline at end of file
+}
diff --git a/sample/build.gradle b/sample/build.gradle
index aee9b6d..54dc7b5 100644
--- a/sample/build.gradle
+++ b/sample/build.gradle
@@ -9,11 +9,11 @@
 
 android {
   namespace 'com.airbnb.lottie.samples'
-  compileSdk 33
+  compileSdk 34
   defaultConfig {
     applicationId "com.airbnb.lottie"
     minSdk 16
-    targetSdk 33
+    targetSdk 34
     versionCode 70
     versionName VERSION_NAME
     multiDexEnabled true
@@ -58,6 +58,7 @@
   implementation libs.androidx.multidex
 
   implementation libs.androidx.appcompat
+  implementation libs.androidx.fragment
   implementation libs.androidx.recyclerview
   implementation libs.androidx.paging.runtime.ktx
   implementation libs.androidx.viewmodel.ktx
@@ -69,7 +70,7 @@
 
   implementation libs.epoxy
   ksp libs.epoxy.processor
-  implementation libs.mvrx
+  implementation libs.mavericks
 
   implementation libs.kotlinx.coroutines.android
   implementation libs.qrcodereaderview
diff --git a/sample/src/main/assets/fonts/Comic Neue.ttf b/sample/src/main/assets/fonts/Comic Neue.ttf
new file mode 100755
index 0000000..ab3a417
--- /dev/null
+++ b/sample/src/main/assets/fonts/Comic Neue.ttf
Binary files differ
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/LottieApplication.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/LottieApplication.kt
index 9ea95a4..fcc7f4b 100644
--- a/sample/src/main/kotlin/com/airbnb/lottie/samples/LottieApplication.kt
+++ b/sample/src/main/kotlin/com/airbnb/lottie/samples/LottieApplication.kt
@@ -3,6 +3,7 @@
 import androidx.multidex.MultiDexApplication
 import com.airbnb.lottie.L
 import com.airbnb.lottie.samples.api.LottiefilesApi
+import com.airbnb.mvrx.Mavericks
 import com.google.gson.FieldNamingPolicy
 import com.google.gson.GsonBuilder
 import okhttp3.OkHttpClient
@@ -37,6 +38,7 @@
 
     override fun onCreate() {
         super.onCreate()
+        Mavericks.initialize(this)
         L.DBG = true
     }
-}
\ No newline at end of file
+}
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/LottiefilesFragment.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/LottiefilesFragment.kt
index 387ba18..c88d210 100644
--- a/sample/src/main/kotlin/com/airbnb/lottie/samples/LottiefilesFragment.kt
+++ b/sample/src/main/kotlin/com/airbnb/lottie/samples/LottiefilesFragment.kt
@@ -5,8 +5,8 @@
 import android.view.View
 import android.view.ViewGroup
 import androidx.core.view.isVisible
+import androidx.fragment.app.Fragment
 import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.viewModelScope
 import androidx.paging.Pager
 import androidx.paging.PagingConfig
 import androidx.paging.PagingDataAdapter
@@ -20,13 +20,14 @@
 import com.airbnb.lottie.samples.model.AnimationData
 import com.airbnb.lottie.samples.model.AnimationResponse
 import com.airbnb.lottie.samples.model.CompositionArgs
-import com.airbnb.lottie.samples.utils.MvRxViewModel
+import com.airbnb.lottie.samples.utils.BaseFragment
 import com.airbnb.lottie.samples.utils.hideKeyboard
 import com.airbnb.lottie.samples.utils.viewBinding
 import com.airbnb.lottie.samples.views.AnimationItemView
-import com.airbnb.mvrx.BaseMvRxFragment
-import com.airbnb.mvrx.MvRxState
-import com.airbnb.mvrx.MvRxViewModelFactory
+import com.airbnb.mvrx.MavericksState
+import com.airbnb.mvrx.MavericksView
+import com.airbnb.mvrx.MavericksViewModel
+import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.ViewModelContext
 import com.airbnb.mvrx.fragmentViewModel
 import com.airbnb.mvrx.withState
@@ -38,9 +39,9 @@
 data class LottiefilesState(
     val mode: LottiefilesMode = LottiefilesMode.Recent,
     val query: String = ""
-) : MvRxState
+) : MavericksState
 
-class LottiefilesViewModel(initialState: LottiefilesState, private val api: LottiefilesApi) : MvRxViewModel<LottiefilesState>(initialState) {
+class LottiefilesViewModel(initialState: LottiefilesState, private val api: LottiefilesApi) : MavericksViewModel<LottiefilesState>(initialState) {
 
     private var mode = initialState.mode
     private var query = initialState.query
@@ -51,7 +52,7 @@
     }.flow.cachedIn(viewModelScope)
 
     init {
-        selectSubscribe(LottiefilesState::mode, LottiefilesState::query) { mode, query ->
+        onEach(LottiefilesState::mode, LottiefilesState::query) { mode, query ->
             this.mode = mode
             this.query = query
             dataSource?.invalidate()
@@ -62,7 +63,7 @@
 
     fun setQuery(query: String) = setState { copy(query = query) }
 
-    companion object : MvRxViewModelFactory<LottiefilesViewModel, LottiefilesState> {
+    companion object : MavericksViewModelFactory<LottiefilesViewModel, LottiefilesState> {
         override fun create(viewModelContext: ViewModelContext, state: LottiefilesState): LottiefilesViewModel {
             val service = viewModelContext.app<LottieApplication>().lottiefilesService
             return LottiefilesViewModel(state, service)
@@ -109,7 +110,7 @@
     }
 }
 
-class LottiefilesFragment : BaseMvRxFragment(R.layout.lottiefiles_fragment) {
+class LottiefilesFragment : BaseFragment(R.layout.lottiefiles_fragment) {
     private val binding: LottiefilesFragmentBinding by viewBinding()
     private val viewModel: LottiefilesViewModel by fragmentViewModel()
 
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/PlayerFragment.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/PlayerFragment.kt
index ed279ae..f56c3d8 100644
--- a/sample/src/main/kotlin/com/airbnb/lottie/samples/PlayerFragment.kt
+++ b/sample/src/main/kotlin/com/airbnb/lottie/samples/PlayerFragment.kt
@@ -32,12 +32,12 @@
 import com.airbnb.lottie.model.KeyPath
 import com.airbnb.lottie.samples.databinding.PlayerFragmentBinding
 import com.airbnb.lottie.samples.model.CompositionArgs
+import com.airbnb.lottie.samples.utils.BaseFragment
 import com.airbnb.lottie.samples.utils.getParcelableCompat
 import com.airbnb.lottie.samples.utils.viewBinding
 import com.airbnb.lottie.samples.views.BottomSheetItemView
 import com.airbnb.lottie.samples.views.BottomSheetItemViewModel_
 import com.airbnb.lottie.samples.views.ControlBarItemToggleView
-import com.airbnb.mvrx.BaseMvRxFragment
 import com.airbnb.mvrx.fragmentViewModel
 import com.airbnb.mvrx.withState
 import com.github.mikephil.charting.components.LimitLine
@@ -50,7 +50,7 @@
 import kotlin.math.abs
 import kotlin.math.roundToInt
 
-class PlayerFragment : BaseMvRxFragment(R.layout.player_fragment) {
+class PlayerFragment : BaseFragment(R.layout.player_fragment) {
     private val binding: PlayerFragmentBinding by viewBinding()
     private val viewModel: PlayerViewModel by fragmentViewModel()
 
@@ -147,7 +147,7 @@
 
         binding.controlBarTrim.minFrameView.setOnClickListener { showMinFrameDialog() }
         binding.controlBarTrim.maxFrameView.setOnClickListener { showMaxFrameDialog() }
-        viewModel.selectSubscribe(PlayerState::minFrame, PlayerState::maxFrame) { minFrame, maxFrame ->
+        viewModel.onEach(PlayerState::minFrame, PlayerState::maxFrame) { minFrame, maxFrame ->
             binding.animationView.setMinAndMaxFrame(minFrame, maxFrame)
             // I think this is a lint bug. It complains about int being <ErrorType>
             //noinspection StringFormatMatches
@@ -157,7 +157,7 @@
         }
 
         viewModel.fetchAnimation(args)
-        viewModel.asyncSubscribe(PlayerState::composition, onFail = {
+        viewModel.onAsync(PlayerState::composition, onFail = {
             Snackbar.make(binding.coordinatorLayout, R.string.composition_load_error, Snackbar.LENGTH_LONG).show()
             Log.w(L.TAG, "Error loading composition.", it)
         }) {
@@ -166,7 +166,7 @@
         }
 
         binding.controlBar.borderToggle.setOnClickListener { viewModel.toggleBorderVisible() }
-        viewModel.selectSubscribe(PlayerState::borderVisible) {
+        viewModel.onEach(PlayerState::borderVisible) {
             binding.controlBar.borderToggle.isActivated = it
             binding.controlBar.borderToggle.setImageResource(
                 if (it) R.drawable.ic_border_on
@@ -191,12 +191,12 @@
             binding.controlBar.enableApplyingOpacityToLayers.isActivated = isApplyingOpacityToLayersEnabled
         }
 
-        viewModel.selectSubscribe(PlayerState::controlsVisible) { binding.controlBarPlayerControls.controlsContainer.animateVisible(it) }
+        viewModel.onEach(PlayerState::controlsVisible) { binding.controlBarPlayerControls.controlsContainer.animateVisible(it) }
 
-        viewModel.selectSubscribe(PlayerState::controlBarVisible) { binding.controlBar.root.animateVisible(it) }
+        viewModel.onEach(PlayerState::controlBarVisible) { binding.controlBar.root.animateVisible(it) }
 
         binding.controlBar.renderGraphToggle.setOnClickListener { viewModel.toggleRenderGraphVisible() }
-        viewModel.selectSubscribe(PlayerState::renderGraphVisible) {
+        viewModel.onEach(PlayerState::renderGraphVisible) {
             binding.controlBar.renderGraphToggle.isActivated = it
             binding.controlBarPlayerControls.renderTimesGraphContainer.animateVisible(it)
             binding.controlBarPlayerControls.renderTimesPerLayerButton.animateVisible(it)
@@ -204,38 +204,38 @@
         }
 
         binding.controlBar.masksAndMattesToggle.setOnClickListener { viewModel.toggleOutlineMasksAndMattes() }
-        viewModel.selectSubscribe(PlayerState::outlineMasksAndMattes) {
+        viewModel.onEach(PlayerState::outlineMasksAndMattes) {
             binding.controlBar.masksAndMattesToggle.isActivated = it
             binding.animationView.setOutlineMasksAndMattes(it)
         }
 
         binding.controlBar.backgroundColorToggle.setOnClickListener { viewModel.toggleBackgroundColorVisible() }
         binding.controlBarBackgroundColor.closeBackgroundColorButton.setOnClickListener { viewModel.setBackgroundColorVisible(false) }
-        viewModel.selectSubscribe(PlayerState::backgroundColorVisible) {
+        viewModel.onEach(PlayerState::backgroundColorVisible) {
             binding.controlBar.backgroundColorToggle.isActivated = it
             binding.controlBarBackgroundColor.backgroundColorContainer.animateVisible(it)
         }
 
         binding.controlBar.trimToggle.setOnClickListener { viewModel.toggleTrimVisible() }
         binding.controlBarTrim.closeTrimButton.setOnClickListener { viewModel.setTrimVisible(false) }
-        viewModel.selectSubscribe(PlayerState::trimVisible) {
+        viewModel.onEach(PlayerState::trimVisible) {
             binding.controlBar.trimToggle.isActivated = it
             binding.controlBarTrim.trimContainer.animateVisible(it)
         }
 
         binding.controlBar.mergePathsToggle.setOnClickListener { viewModel.toggleMergePaths() }
-        viewModel.selectSubscribe(PlayerState::useMergePaths) {
+        viewModel.onEach(PlayerState::useMergePaths) {
             binding.animationView.enableMergePathsForKitKatAndAbove(it)
             binding.controlBar.mergePathsToggle.isActivated = it
         }
 
         binding.controlBar.speedToggle.setOnClickListener { viewModel.toggleSpeedVisible() }
         binding.controlBarSpeed.closeSpeedButton.setOnClickListener { viewModel.setSpeedVisible(false) }
-        viewModel.selectSubscribe(PlayerState::speedVisible) {
+        viewModel.onEach(PlayerState::speedVisible) {
             binding.controlBar.speedToggle.isActivated = it
             binding.controlBarSpeed.speedContainer.isVisible = it
         }
-        viewModel.selectSubscribe(PlayerState::speed) {
+        viewModel.onEach(PlayerState::speed) {
             binding.animationView.speed = it
             binding.controlBarSpeed.speedButtonsContainer
                 .children
@@ -259,7 +259,7 @@
 
 
         binding.controlBarPlayerControls.loopButton.setOnClickListener { viewModel.toggleLoop() }
-        viewModel.selectSubscribe(PlayerState::repeatCount) {
+        viewModel.onEach(PlayerState::repeatCount) {
             binding.animationView.repeatCount = it
             binding.controlBarPlayerControls.loopButton.isActivated = binding.animationView.repeatCount == ValueAnimator.INFINITE
         }
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/PlayerViewModel.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/PlayerViewModel.kt
index 592573e..31a6972 100644
--- a/sample/src/main/kotlin/com/airbnb/lottie/samples/PlayerViewModel.kt
+++ b/sample/src/main/kotlin/com/airbnb/lottie/samples/PlayerViewModel.kt
@@ -7,11 +7,11 @@
 import com.airbnb.lottie.LottieCompositionFactory
 import com.airbnb.lottie.LottieTask
 import com.airbnb.lottie.samples.model.CompositionArgs
-import com.airbnb.lottie.samples.utils.MvRxViewModel
 import com.airbnb.mvrx.Async
 import com.airbnb.mvrx.Fail
-import com.airbnb.mvrx.MvRxState
-import com.airbnb.mvrx.MvRxViewModelFactory
+import com.airbnb.mvrx.MavericksState
+import com.airbnb.mvrx.MavericksViewModel
+import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
 import com.airbnb.mvrx.Uninitialized
 import com.airbnb.mvrx.ViewModelContext
@@ -34,12 +34,12 @@
     val maxFrame: Int = 0,
     val speed: Float = 1f,
     val repeatCount: Int = ValueAnimator.INFINITE
-) : MvRxState
+) : MavericksState
 
 class PlayerViewModel(
     initialState: PlayerState,
     private val application: Application
-) : MvRxViewModel<PlayerState>(initialState) {
+) : MavericksViewModel<PlayerState>(initialState) {
 
     fun fetchAnimation(args: CompositionArgs) {
         val url = args.url ?: args.animationDataV2?.file ?: args.animationData?.lottieLink
@@ -112,9 +112,9 @@
         )
     }
 
-    companion object : MvRxViewModelFactory<PlayerViewModel, PlayerState> {
+    companion object : MavericksViewModelFactory<PlayerViewModel, PlayerState> {
         override fun create(viewModelContext: ViewModelContext, state: PlayerState): PlayerViewModel {
             return PlayerViewModel(state, viewModelContext.app())
         }
     }
-}
\ No newline at end of file
+}
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/PreviewFragment.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/PreviewFragment.kt
index 96b4f09..ebeb2c9 100644
--- a/sample/src/main/kotlin/com/airbnb/lottie/samples/PreviewFragment.kt
+++ b/sample/src/main/kotlin/com/airbnb/lottie/samples/PreviewFragment.kt
@@ -115,4 +115,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/ShowcaseFragment.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/ShowcaseFragment.kt
index 8a58ccc..f404d7f 100644
--- a/sample/src/main/kotlin/com/airbnb/lottie/samples/ShowcaseFragment.kt
+++ b/sample/src/main/kotlin/com/airbnb/lottie/samples/ShowcaseFragment.kt
@@ -1,5 +1,6 @@
 package com.airbnb.lottie.samples
 
+import android.app.Activity
 import android.content.Intent
 import com.airbnb.epoxy.EpoxyController
 import com.airbnb.lottie.samples.api.LottiefilesApi
@@ -7,29 +8,29 @@
 import com.airbnb.lottie.samples.model.CompositionArgs
 import com.airbnb.lottie.samples.model.ShowcaseItem
 import com.airbnb.lottie.samples.utils.BaseEpoxyFragment
-import com.airbnb.lottie.samples.utils.MvRxViewModel
 import com.airbnb.lottie.samples.views.animationItemView
 import com.airbnb.lottie.samples.views.loadingView
 import com.airbnb.lottie.samples.views.marquee
 import com.airbnb.lottie.samples.views.showcaseCarousel
 import com.airbnb.mvrx.Async
-import com.airbnb.mvrx.MvRxState
-import com.airbnb.mvrx.MvRxViewModelFactory
+import com.airbnb.mvrx.MavericksState
+import com.airbnb.mvrx.MavericksViewModel
+import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Uninitialized
 import com.airbnb.mvrx.ViewModelContext
 import com.airbnb.mvrx.fragmentViewModel
 import com.airbnb.mvrx.withState
 
-data class ShowcaseState(val response: Async<AnimationResponseV2> = Uninitialized) : MvRxState
+data class ShowcaseState(val response: Async<AnimationResponseV2> = Uninitialized) : MavericksState
 
-class ShowcaseViewModel(initialState: ShowcaseState, api: LottiefilesApi) : MvRxViewModel<ShowcaseState>(initialState) {
+class ShowcaseViewModel(initialState: ShowcaseState, api: LottiefilesApi) : MavericksViewModel<ShowcaseState>(initialState) {
     init {
         suspend {
             api.getCollection()
         }.execute { copy(response = it) }
     }
 
-    companion object : MvRxViewModelFactory<ShowcaseViewModel, ShowcaseState> {
+    companion object : MavericksViewModelFactory<ShowcaseViewModel, ShowcaseState> {
         override fun create(viewModelContext: ViewModelContext, state: ShowcaseState): ShowcaseViewModel {
             val service = viewModelContext.app<LottieApplication>().lottiefilesService
             return ShowcaseViewModel(state, service)
@@ -39,22 +40,28 @@
 
 class ShowcaseFragment : BaseEpoxyFragment() {
 
+    private inline fun <reified A : Activity> startActivity() {
+        val intent = Intent(requireContext(), A::class.java)
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+        requireContext().startActivity(intent)
+    }
+
     private val showcaseItems = listOf(
         ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_dynamic_properties) {
-            it.startActivity(Intent(it, DynamicActivity::class.java))
+            startActivity<DynamicActivity>()
         },
         ShowcaseItem(R.drawable.gilbert_animated, R.string.showcase_item_animated_text) {
-            it.startActivity(Intent(it, TypographyDemoActivity::class.java))
+            startActivity<TypographyDemoActivity>()
         },
         ShowcaseItem(R.drawable.gilbert_animated, R.string.showcase_item_dynamic_text) {
-            it.startActivity(Intent(it, DynamicTextActivity::class.java))
+            startActivity<DynamicTextActivity>()
         },
         ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_bullseye) {
-            it.startActivity(Intent(it, BullseyeActivity::class.java))
+            startActivity<BullseyeActivity>()
         },
         ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_recycler_view) {
-            it.startActivity(Intent(it, WishListActivity::class.java))
-        }
+            startActivity<WishListActivity>()
+        },
     )
     private val viewModel: ShowcaseViewModel by fragmentViewModel()
 
@@ -82,9 +89,16 @@
                     title(it.title)
                     if (it.preview != null) previewUrl("https://assets9.lottiefiles.com/${it.preview}")
                     previewBackgroundColor(it.bgColorInt)
-                    onClickListener { _ -> activityContext.startActivity(PlayerActivity.intent(activityContext, CompositionArgs(animationDataV2 = it))) }
+                    onClickListener { _ ->
+                        activityContext.startActivity(
+                            PlayerActivity.intent(
+                                activityContext,
+                                CompositionArgs(animationDataV2 = it),
+                            ),
+                        )
+                    }
                 }
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/BaseEpoxyFragment.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/BaseEpoxyFragment.kt
index 805cf4c..8fa5469 100644
--- a/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/BaseEpoxyFragment.kt
+++ b/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/BaseEpoxyFragment.kt
@@ -6,8 +6,6 @@
 import com.airbnb.epoxy.EpoxyController
 import com.airbnb.lottie.samples.R
 import com.airbnb.lottie.samples.databinding.BaseFragmentBinding
-import com.airbnb.mvrx.BaseMvRxFragment
-
 
 private class BaseEpoxyController(
     private val buildModelsCallback: EpoxyController.() -> Unit
@@ -17,11 +15,11 @@
     }
 }
 
-abstract class BaseEpoxyFragment : BaseMvRxFragment(R.layout.base_fragment) {
+abstract class BaseEpoxyFragment : BaseFragment(R.layout.base_fragment) {
     protected val binding: BaseFragmentBinding by viewBinding()
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        binding.recyclerView.setController(BaseEpoxyController { buildModels() })
+        binding.recyclerView.setControllerAndBuildModels(BaseEpoxyController { buildModels() })
     }
 
     override fun invalidate() {
@@ -29,4 +27,4 @@
     }
 
     abstract fun EpoxyController.buildModels()
-}
\ No newline at end of file
+}
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/BaseFragment.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/BaseFragment.kt
new file mode 100644
index 0000000..d5c148d
--- /dev/null
+++ b/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/BaseFragment.kt
@@ -0,0 +1,7 @@
+package com.airbnb.lottie.samples.utils
+
+import androidx.annotation.LayoutRes
+import androidx.fragment.app.Fragment
+import com.airbnb.mvrx.MavericksView
+
+abstract class BaseFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayoutId), MavericksView
diff --git a/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/MvRxViewModel.kt b/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/MvRxViewModel.kt
deleted file mode 100644
index bcda8a8..0000000
--- a/sample/src/main/kotlin/com/airbnb/lottie/samples/utils/MvRxViewModel.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.airbnb.lottie.samples.utils
-
-import androidx.lifecycle.viewModelScope
-import com.airbnb.lottie.samples.BuildConfig
-import com.airbnb.mvrx.*
-import kotlinx.coroutines.*
-
-abstract class MvRxViewModel<S : MvRxState>(initialState: S) : BaseMvRxViewModel<S>(initialState, BuildConfig.DEBUG) {
-    /**
-     * This uses [Dispatchers.Main.immediate] by default to mimic [viewModelScope].
-     */
-    fun <T : Any?> (suspend () -> T).execute(
-        dispatcher: CoroutineDispatcher = Dispatchers.Main.immediate,
-        reducer: S.(Async<T>) -> S
-    ): Job {
-        setState { reducer(Loading()) }
-        return viewModelScope.launch(dispatcher) {
-            try {
-                val result = invoke()
-                setState { reducer(Success(result)) }
-            } catch (e: CancellationException) {
-                throw e
-            } catch (e: Exception) {
-                setState { reducer(Fail(e)) }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 4fd80ba..e7fc7f9 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -7,6 +7,9 @@
 
 plugins {
   id 'de.fayard.refreshVersions' version '0.51.0'
+////                         # available:'0.60.0'
+////                         # available:'0.60.1'
+////                         # available:'0.60.2'
 }
 
 dependencyResolutionManagement {
diff --git a/snapshot-tests/build.gradle b/snapshot-tests/build.gradle
index 7cfc9f0..ba1e5a0 100644
--- a/snapshot-tests/build.gradle
+++ b/snapshot-tests/build.gradle
@@ -7,11 +7,11 @@
 
 android {
   namespace 'com.airbnb.lottie.snapshots'
-  compileSdk 33
+  compileSdk 34
   defaultConfig {
     applicationId "com.airbnb.lottie.snapshots"
     minSdk 21
-    targetSdk 33
+    targetSdk 34
     versionCode 1
     versionName VERSION_NAME
     testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/versions.properties b/versions.properties
index 227d7ca..94dcf4d 100644
--- a/versions.properties
+++ b/versions.properties
@@ -8,26 +8,17 @@
 #### suppress inspection "UnusedProperty" for whole file
 
 ## unused
-plugin.android=8.0.2
-## # available=8.1.0-alpha01
-## # available=8.1.0-alpha02
-## # available=8.1.0-alpha03
-## # available=8.1.0-alpha04
-## # available=8.1.0-alpha05
-## # available=8.1.0-alpha06
-## # available=8.1.0-alpha07
-## # available=8.1.0-alpha08
-## # available=8.1.0-alpha09
-## # available=8.1.0-alpha10
-## # available=8.1.0-alpha11
-## # available=8.1.0-beta01
+plugin.android=8.1.1
 ## # available=8.2.0-alpha01
 ## # available=8.2.0-alpha02
 
-version.androidx.compose=2023.06.00
+version.androidx.compose=2023.08.00
 
-## unused
-version.androidx.compose..compose-bom=2023.06.00
+version.androidx.compose.ui=1.5.0
+##              # available=1.6.0-alpha01
+##              # available=1.6.0-alpha02
+##              # available=1.6.0-alpha03
+##              # available=1.6.0-alpha04
 
 version.coil-kt=2.4.0
 
@@ -35,9 +26,6 @@
 
 version.retrofit2=2.9.0
 
-## unused
-version.org.jacoco..org.jacoco.ant=0.8.10
-
 # Do not update to 2.0. It will pull in Kotlin as a transitive dependency into the lottie library.
  version.okio=1.17.5
 ### available=2.0.0-RC1
@@ -74,6 +62,8 @@
 ### available=3.1.0
 ### available=3.2.0
 ### available=3.3.0
+### available=3.4.0
+### available=3.5.0
 
 version.okhttp3=4.11.0
 ##  # available=5.0.0-alpha.1
@@ -89,60 +79,65 @@
 ##  # available=5.0.0-alpha.11
 
 version.mockito=5.3.1
+##  # available=5.4.0
+##  # available=5.5.0
 
-version.kotlinx.coroutines=1.7.1
+version.kotlinx.coroutines=1.6.4
 
-version.kotlin=1.8.21
-## # available=1.8.22
-## # available=1.9.0-Beta
+version.kotlin=1.9.10
 
 version.junit.junit=4.13.2
 
 version.io.jsonwebtoken..jjwt=0.9.1
 
-version.google.dagger=2.46.1
+version.google.dagger=2.48
 
 version.google.android.material=1.9.0
 ##                  # available=1.10.0-alpha01
 ##                  # available=1.10.0-alpha02
 ##                  # available=1.10.0-alpha03
+##                  # available=1.10.0-alpha04
+##                  # available=1.10.0-alpha05
+##                  # available=1.10.0-alpha06
+##                  # available=1.11.0-alpha01
+##                  # available=1.11.0-alpha02
 
 version.com.uber.nullaway..nullaway=0.10.10
+##                      # available=0.10.11
+##                      # available=0.10.12
+##                      # available=0.10.13
 
 version.com.nhaarman.mockitokotlin2..mockito-kotlin=2.2.0
 
 version.com.google.errorprone..error_prone_core=2.19.1
+##                                  # available=2.20.0
+##                                  # available=2.21.0
+##                                  # available=2.21.1
 
 version.com.google.code.gson..gson=2.10.1
 
-version.com.github.bumptech.glide..glide=4.15.1
+version.com.github.bumptech.glide..glide=4.16.0
 
 version.com.github.PhilJay..MPAndroidChart=3.1.0
 
 version.com.dlazaro66.qrcodereaderview..qrcodereaderview=2.0.2
 
 version.com.amazonaws..aws-android-sdk-s3=2.71.0
+##                            # available=2.72.0
+##                            # available=2.73.0
 
 version.com.amazonaws..aws-android-sdk-mobile-client=2.71.0
+##                                       # available=2.72.0
+##                                       # available=2.73.0
 
 version.com.amazonaws..aws-android-sdk-auth-userpools=2.71.0
+##                                        # available=2.72.0
+##                                        # available=2.73.0
 
-version.com.airbnb.android..mvrx=1.5.1
-##                   # available=2.0.0-alpha1
-##                   # available=2.0.0-alpha2
-##                   # available=2.0.0-alpha3
-##                   # available=2.0.0-alpha4
-##                   # available=2.0.0-alpha5
-##                   # available=2.0.0-alpha6
-##                   # available=2.0.0-alpha7
-##                   # available=2.0.0-alpha8
-##                   # available=2.0.0-beta1
-##                   # available=2.0.0-beta2
-##                   # available=2.0.0-beta3
 
-version.com.airbnb.android..mavericks-compose=3.0.3
+version.com.airbnb.android..mavericks-compose=3.0.6
 
-version.com.airbnb.android..mavericks=3.0.3
+version.com.airbnb.android..mavericks=3.0.6
 
 version.com.airbnb.android..epoxy-processor=5.1.3
 
@@ -152,6 +147,7 @@
 ##                    # available=2.3.0-alpha01
 ##                    # available=2.3.0-alpha02
 ##                    # available=2.3.0-alpha03
+##                    # available=2.3.0-alpha04
 
 version.androidx.test.rules=1.5.0
 ##              # available=1.6.0-alpha01
@@ -167,6 +163,7 @@
 
 version.androidx.recyclerview=1.3.0
 ##                # available=1.3.1-rc01
+##                # available=1.3.1
 
 version.androidx.profileinstaller=1.3.1
 
@@ -178,17 +175,20 @@
 ##          # available=3.2.0-alpha05
 ##          # available=3.2.0-alpha06
 ##          # available=3.2.0-beta01
+##          # available=3.2.0-rc01
+##          # available=3.2.0
 
 version.androidx.navigation=2.6.0
-##              # available=2.7.0-alpha01
-##              # available=2.7.0-beta01
 
 version.androidx.multidex=2.0.1
 
-version.androidx.lifecycle=2.6.1
+version.androidx.lifecycle=2.5.1
+##             # available=2.7.0-alpha01
 
-version.androidx.fragment=1.6.0
+version.androidx.fragment=1.6.1
 ##            # available=1.7.0-alpha01
+##            # available=1.7.0-alpha02
+##            # available=1.7.0-alpha03
 
 version.androidx.core=1.10.1
 ##        # available=1.11.0-alpha01
@@ -201,11 +201,10 @@
 ##        # available=1.12.0-alpha03
 ##        # available=1.12.0-alpha04
 ##        # available=1.12.0-alpha05
+##        # available=1.12.0-beta01
+##        # available=1.12.0-rc01
 
-version.androidx.constraintlayout=2.1.1
-##                    # available=2.1.2
-##                    # available=2.1.3
-##                    # available=2.1.4
+version.androidx.constraintlayout=2.1.4
 ##                    # available=2.2.0-alpha01
 ##                    # available=2.2.0-alpha02
 ##                    # available=2.2.0-alpha03
@@ -216,14 +215,8 @@
 ##                    # available=2.2.0-alpha08
 ##                    # available=2.2.0-alpha09
 ##                    # available=2.2.0-alpha10
-
-version.androidx.compose.ui=1.4.3
-##              # available=1.5.0-alpha01
-##              # available=1.5.0-alpha02
-##              # available=1.5.0-alpha03
-##              # available=1.5.0-alpha04
-##              # available=1.5.0-beta01
-##              # available=1.5.0-beta02
+##                    # available=2.2.0-alpha11
+##                    # available=2.2.0-alpha12
 
 ## unused
 version.androidx.compose.material=1.4.3
@@ -237,7 +230,7 @@
 ##                      # available=1.5.0-alpha02
 ##                      # available=1.5.0-alpha03
 
-version.androidx.compose.compiler=1.4.7
+version.androidx.compose.compiler=1.5.3
 
 version.androidx.collection=1.2.0
 ##              # available=1.3.0-dev01
@@ -245,12 +238,16 @@
 ##              # available=1.3.0-alpha02
 ##              # available=1.3.0-alpha03
 ##              # available=1.3.0-alpha04
+##              # available=1.3.0-beta01
 
 version.androidx.cardview=1.0.0
 
 version.androidx.browser=1.5.0
 ##           # available=1.6.0-alpha01
 ##           # available=1.6.0-alpha02
+##           # available=1.6.0-beta01
+##           # available=1.6.0-rc01
+##           # available=1.6.0
 
 version.androidx.benchmark=1.1.1
 ##             # available=1.2.0-alpha01
@@ -268,26 +265,36 @@
 ##             # available=1.2.0-alpha13
 ##             # available=1.2.0-alpha14
 ##             # available=1.2.0-alpha15
+##             # available=1.2.0-alpha16
+##             # available=1.2.0-beta01
+##             # available=1.2.0-beta02
+##             # available=1.2.0-beta03
+##             # available=1.2.0-beta04
+##             # available=1.2.0-beta05
 
 version.androidx.appcompat=1.6.1
 ##             # available=1.7.0-alpha01
 ##             # available=1.7.0-alpha02
+##             # available=1.7.0-alpha03
 
-version.androidx.activity=1.7.2
+version.androidx.activity=1.6.1
 ##            # available=1.8.0-alpha01
 ##            # available=1.8.0-alpha02
 ##            # available=1.8.0-alpha03
 ##            # available=1.8.0-alpha04
 ##            # available=1.8.0-alpha05
+##            # available=1.8.0-alpha06
+##            # available=1.8.0-alpha07
 
 plugin.net.ltgt.errorprone=3.1.0
 
-plugin.com.google.devtools.ksp=1.8.21-1.0.11
-##                 # available=1.8.22-1.0.11
-##                 # available=1.9.0-Beta-1.0.11
+plugin.com.google.devtools.ksp=1.9.10-1.0.13
 
 plugin.org.ajoberstar.grgit=5.2.0
 
 plugin.com.vanniktech.maven.publish=0.25.2
+##                      # available=0.25.3-rc1
+##                      # available=0.25.3
 
 plugin.org.jetbrains.dokka=1.8.20
+##             # available=1.9.0