From 34aa06b8db75976f06b134b4fdcdb7dc26e48e07 Mon Sep 17 00:00:00 2001 From: Gabriel Peal Date: Sun, 3 Sep 2023 18:07:28 -0500 Subject: [PATCH] Upgraded a bunch of dependencies (#2382) --- .idea/kotlinc.xml | 2 +- build.gradle | 4 +- gradle/libs.versions.toml | 1 + issue-repro-compose/build.gradle | 4 +- issue-repro/build.gradle | 4 +- lottie-compose/build.gradle | 6 +- lottie/build.gradle | 4 +- .../com/airbnb/lottie/LottieDrawable.java | 7 +- sample-compose-benchmark/build.gradle | 4 +- sample-compose/build.gradle | 4 +- .../compose/examples/ViewPagerExample.kt | 15 +-- sample/build.gradle | 7 +- sample/src/main/assets/fonts/Comic Neue.ttf | Bin 0 -> 82012 bytes .../lottie/samples/LottieApplication.kt | 4 +- .../lottie/samples/LottiefilesFragment.kt | 21 +-- .../airbnb/lottie/samples/PlayerFragment.kt | 30 ++--- .../airbnb/lottie/samples/PlayerViewModel.kt | 14 +- .../airbnb/lottie/samples/PreviewFragment.kt | 2 +- .../airbnb/lottie/samples/ShowcaseFragment.kt | 42 ++++-- .../lottie/samples/utils/BaseEpoxyFragment.kt | 8 +- .../lottie/samples/utils/BaseFragment.kt | 7 + .../lottie/samples/utils/MvRxViewModel.kt | 28 ---- settings.gradle | 3 + snapshot-tests/build.gradle | 4 +- versions.properties | 127 +++++++++--------- 25 files changed, 177 insertions(+), 175 deletions(-) create mode 100755 sample/src/main/assets/fonts/Comic Neue.ttf create mode 100644 sample/src/main/kotlin/com/airbnb/lottie/samples/utils/BaseFragment.kt delete mode 100644 sample/src/main/kotlin/com/airbnb/lottie/samples/utils/MvRxViewModel.kt diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 217e5c51fb..f8467b458e 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/build.gradle b/build.gradle index a26b100033..c923c313dd 100644 --- a/build.gradle +++ b/build.gradle @@ -2,10 +2,10 @@ import org.ajoberstar.grgit.Grgit 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 @@ plugins { 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 9fcf0d71b5..859b55b397 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 4f5a631ab4..ff4972132a 100755 --- a/issue-repro-compose/build.gradle +++ b/issue-repro-compose/build.gradle @@ -7,11 +7,11 @@ plugins { 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 2ce7bf5d32..73c77a0572 100755 --- a/issue-repro/build.gradle +++ b/issue-repro/build.gradle @@ -5,11 +5,11 @@ plugins { 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 0e8e4275ef..099aa04e1e 100644 --- a/lottie-compose/build.gradle +++ b/lottie-compose/build.gradle @@ -9,10 +9,10 @@ plugins { 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 @@ dependencies { 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 596eb4423a..3c183766e4 100644 --- a/lottie/build.gradle +++ b/lottie/build.gradle @@ -10,10 +10,10 @@ plugins { 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 8234e74190..d2885288dd 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 @@ public boolean getClipToCompositionBounds() { * 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 airbnb.io/lottie for more information about importing shapes from * Sketch or Illustrator to avoid this. */ public void setImagesAssetsFolder(@Nullable String imageAssetsFolder) { @@ -460,7 +459,7 @@ public boolean getAsyncUpdatesEnabled() { *

* 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 @@ public List resolveKeyPath(KeyPath keyPath) { *

* Internally, this will check if the {@link KeyPath} has already been resolved with * {@link #resolveKeyPath(KeyPath)} and will resolve it if it hasn't. - * + *

* Set the callback to null to clear it. */ public void addValueCallback( diff --git a/sample-compose-benchmark/build.gradle b/sample-compose-benchmark/build.gradle index a83accda65..df2da673d4 100644 --- a/sample-compose-benchmark/build.gradle +++ b/sample-compose-benchmark/build.gradle @@ -5,7 +5,7 @@ plugins { android { namespace 'com.airbnb.lottie.sample.compose.benchmark' - compileSdk 33 + compileSdk 34 kotlinOptions { freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" @@ -13,7 +13,7 @@ android { 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 abaacad636..279dd7e2b7 100644 --- a/sample-compose/build.gradle +++ b/sample-compose/build.gradle @@ -8,11 +8,11 @@ plugins { 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 c05b47a15b..ab8dba3487 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 @@ import com.airbnb.lottie.sample.compose.R @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 @@ private fun WalkthroughAnimation(pagerState: PagerState, size: Int) { composition, { progress }, modifier = Modifier - .fillMaxSize() + .fillMaxSize(), ) -} \ No newline at end of file +} diff --git a/sample/build.gradle b/sample/build.gradle index aee9b6d156..54dc7b5264 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -9,11 +9,11 @@ plugins { 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 @@ dependencies { 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 @@ dependencies { 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 0000000000000000000000000000000000000000..ab3a41764d7081c99c93791cc0a6c833d076d7d9 GIT binary patch literal 82012 zcmeFa34B{unKpjU)p8}>E9qYCwk%tVEibYyTe7V;kEJtZ8vA?Rb0x=iZo>5U zpXLAkep7g*t1DSL=RNOv&+|U-drkx<2tp7KcA;x*Y}@*q275|^zy@)*ZhYmcF}6); z#Oob+-7>yuxvf%W_V-@oqay|-Q`E@%HBuu>AAPhPY4>PtJHe&`Xr z#^-JKTzBn_H$B*0`%eN}dIW#}t?O>M^t$JseXv~X)AJ7mzs%q9;YCbH;!(tF#v1Wx=daAaq`xNd2wlP&L0mbu zZkyn{YVS?g2(|ok!t5-6pZ>-{6Qj(vI)4^X(g)cQ`*SjY)f?d+Zwomr$BLBJ|H5 z6_(CU3xjxm6!I(F`!(eEbYJk#9u(Bs#{><}f!POy#@UyIj#(Xlc~V%3`(u#t*{6jG zJgS+fcT4ycQSoK5;{gg$4Kb- z_M`arqxklt`1Ygt_M`arqxkm6FcL>G5=Sr+(-?`97>Sb@iD`_4j*-wY5=Su-M=%o8 z7>Sb@iK7^aBN&NkjKoQd#7T^Vj#eJUNSs7Vk76WrjKmR)#7h{7X^g~67>SoK5;{g= z8YA%%dUFILF^!SXggeT3^m4k=%h%A$*U-z8=;d+r@;G{V z61|*8FHcr_IgMUUqn9Vq%hxKsJdR$Ttn~6EdU+hZoJKE?qn9Vq%W3p-8ofM@UY5m>&1MfyVw|W4)p4r! zV0vB;rZGM9>XYe1!ggY`4_XSL zB`YBWWhI2Ftb~x3l@R)}5<+BFLMY8j2)S7ap*brdgl8p$`mBVIpp_6hv=Ty$RzfJ! zN(fn63876ZAp~kAgi5W1kgAmsdbJWlv{phW*GdTaS_z?HD~FjhiQjg?TOvsftdSu7L@SqVi)RzeYzl^}|uNNTb0$cmz?#X`}R zl^_Dc%5#PY^&D4FWVTo+QnM07Zxq2T79P=2RJT|VE3|OLQYZ?y5{k^NgrapTp$OheD5|#-iuA37qJJwPM!-sl zC9o1=4y=UO1S=ti!AgjASR@?vJjQV@Vcq#c@w$}|TVW-{U|0#U8dgF~hm{cfVI_pQ zt%Pv6l@N1cCB&v!2{9~ILad9G5EEl1#Lid=F*a60ERK~BvtuR1_E^b%7#AxcR>(?- zDY6n`kF4ZztO`~_?1hz3#A+oJVOa?=R8~T)m6Z^aWhKOJSqU*-Rzlo_l@K##CB&9l z2{C9^LadsV5YuKQUq*YZgcvz1A(qZch`F;8V)Lwo7{0|qaix_I3uq<83|a}Xg;qig zqLmP4?)hiBC-#md80 znNs2t7fS$Iuo7Zat%O)sDuV*%ty&3X5*7=w#a2R`td&p(!b&JBVI`EQuo7aV7Yk)G7RyiZ_f~?82fXPS0rWo@nGUfj15E8g6!@;D9;bf!=i*hiv6!d8&lzq06r|~^jLRo4ndGj9VY*FN!#XV>9K*!;E&J@a` zTgjK9M=SXX?pw)W+_w_S%3BF#>aFDK_#P|y20m{kl;yV)%KTf2RkTR=&hD`&mwSf5 zJ3U|}sQ#hq0xO}4gGGW8u>ZKY?kJGUneyfl%71R0_HpRiNiJXm1S{V0K(a4)eBL6Y*4^^yK$(uzYRPC}@{=3l0;#j6yabx8J&W2b{ z$1cR~oQ`8o$1TM0oQ`8G;uel@$OA0o&8x4iGELR$A8Y>Hn%P+i&0EPB?pw(??pq1f zz*q^@#aIbdB3X&m?5BHHv!Cvr9SNA#O^@R<^JV_(KmYnke9lUq!hI{DN+~O;&iKX8 zXZHYSn&soV=aNkN^#(gXKGu*e5 z#j~GYfBh_C6`RmKD>lQdv!q(fGv#cn{rB+M#qv|!vyz|TzJ;8@=~g*jD_*x!$%+|& z2Db}TusDXPzP8H9(mkt;Y_-EkrvIlhqPnlf3e7&wVBU8 zsf;l9Dp|4ZR#g#n&#Ee-y3fg~GUDv3z<+KP#MxH?%j$-+t^#ke`XBocJwm(CxnN&o zY;Ip8Hdx{lw5!ql&&Foh`>@;2E*=tTH|bjQnO!6l;4Ard#>yuJL7Kb5MH2rBBSNz2 z4e=MV*pq2{PWTCK+vqdwcjB}35&q|Nholbs81NtVxZ3ztonU84+*pZk!S7=q!>5EV z3bV}3G?rjZtd}ii!)zs+VCS(*+4bxW@$2Fb#UG15NqUl@WNorOnNDVt`Q*~%#mVPV z>83Y$pOV5Sg=d7XFp()N#u`}<>t{o3l#R1ZYzMoF-HLBH&c8)Ss>xWguJSGYr@v+P zXR}|OeR=lFvtOEhX?AM%bF-hE{n+fIvyaSvc=mm>56wO>d(X_$nYNkMnUfIWwh(m{IB{v@6835 z=3m;NUkCQ7O4v8!hJDC_B6zX;(T{y48g`ZhQ9TnDB0?1VW^1s|B#zNapxU=VND3(- zEo6X2nuM&-EVN+9TpRXowF@1vu{;n#H+I?-vCFkr=tJe-623QO0CCljFf1&?*p6bK z$_k9~Dq&0*7bdW0WsR^_SO=DNgRoK9By1M82wR11*vWFfuwB?8>=bqh7YMtB3x$h> zi-kSHUi9Z4;a=f>;hn;Jg%1iJ6+R(+9Hab%@VM|KY~~pOyHkZ{g+CTPBRnU3R`?Ua z5U@X0m=Y$17lqFYUl3lxH(W357cLbpXLZ6`gpUc=3I|z6xLLRY@7yOmjK>=wf^a~% zg+H4QR|;>##Z$ry!tKH(!qs!{TqV4nC4_yj*t>;45`dOih=o}Vt7Q=u6`sfE{uKLg z1eRtEELr)hTVaiHT;C-;AlxauOL&LyZs9$`gTf)<{lW)u|9!$oghzxAS3Z3m?3d=u zTbYB|86QLT8}U=nZ5K2>1f48_)_d?c1Pylz=y1C(1lQ{8Hto>Y+_F;_GRtDRGq+=C zC%wWyh+_&QynPYri6v)JHb$Na-UxJ9K+H{b?$b zx^2f#;@{pG$LDsOivRP@cqXMgay#^~TXym{cJ9RYIoiFucXjB_b|cLmz^^AC*u6Wh z3-}tT-Du>uM&@q0+5=j$Ki{Fd+mpA`j~v1GCv{uX>P%9%XV>V$rX7baJ+wDT7fa%) z)Xw-J{%VW)ihj^zwoZ+!Dg21sp8P)Vj?$jY>r!s_j%0E?Gq(3&az}FiKJzQ+b6)yo z{B-hAa{SQP-prxop$z}I4C+I7=p*09>=4v|KU$5p zomXia+J}$%+cU{yl^@R}cdXqSPw8yujzj3s>dc``^3du-nZ48!>JB|pdsG^R0ER)M z4$wtlQ3ue_%vfgc!9DYPLVp@;M<))wlhn3mf98;+CpYaFj3353q4r5(gpDj;&ep!D z!esd)efT`IJb7r#j?6x^KC?WICze?b&5vx^QN|o!amn&BOENs^$xHN_OY3+`@r~hj z9e1G@Jamw8V#hoDtRLPafETaA&--x|hTnj7m$aU~VyX}cYawSQmCi0>wqQzTaXe{( zn9A-@V=;B+9yQkT^wS#K@WkU!JolkzTg07OG^(9?MvKOl%`oq&KW7r#GV?loe#dShg^0=CU zm!sQ4-l$MQi!{+YCH0my)sc0!0n$A+Y%~s<&ruxuUUqI1f8vfrDs0;f;@$e_v zv=Rs?Gxdt5p*5ngiv3pjtysn{#4#(&c2U637pG)NknxK(1*X?g%M2G9<5CSDem~+m zVI)`%zaH%6Kc8Uc?=N_@N>yY{lNI$X)eBL52iW=6}4dq56_7P{OVfv4xu~@ zz34r~vPx~KEl#bn4XfVVq`h@wbz`(>tg@Y$>|Q#svN2kiQk?uPN6VVE^p=9Rypd=U zZ!vvcULQSX45HnGX1jx~6J=k}lbamz32u6HyK}lv)l11^no+=;g%Z74=%6C;ynHo~^o?fT&1mxiwUg+_1ag-(Z_JnS?2 zU9UUz=wW?@I%!|w3+5&r{LxE~XwhV3FpP_WI@wZ4;@wvM*iDamzdE_JKWct#fPV~M zva|-iH1KBs4k zhRbn6FBQriE*j^KHg~QZCL8k=jimjA-diY#lk`qF;Lc5@2HOJOoRM;#n5=6HxG+VB z^16J?D0ojyItsEYX9&s(nvxDY6;z|0<;pH!PoYpSnqf+NYC z33$V9bw}UluUw}_wC?kl`{i1j`(59wf@%!?%Q~YlBau}&UJ%swtsos&jY89dB%n}azE=3hGzd&{3G!N zU^YK+STnHJr-gC?<56zLgOPKbFvmbF8h*!#seGn646WyJDNFoPcAQ{(S6*kw3^(So zTQ$5;p#zr=)kxv86_>55(Sge*Ow?{Xd)->#d7D!b)kI^o-{@$?%WyiAZI0okVB``| zv)ZrcwaHXt6TC&g;g_|*B(pmNydd?)pxyxKlXMq~6#9CyXRM@YustrH?6=K)TvBD<&*r_wUZam~`V4)n>(obFZt?A2)#G%Yy4&mT zpZ6B6Q#R=D4RH(nb367*PXO_i(`3sn#c~^|uM6t)z=Vx4($Z?~sXL&L4%LvLhXGs; zsKyFhDxMR@8a%HU&;l>GJ&v}nK0ozU(ez%Zq$|x$P#@DUR7zb_-w@s;3mXfb7iY6YfSf5*ECw!48O%h zH1M^$+(14~Xkc?Kfi)Kka2DZ^PpWw6(y+a!)7Ctq$sX_aOFf|oemW3jXolu?#`@aQ zjrmf&L;P(-Q#McE-nM0Iq`$p28fA(qD{g0E%dQ6=xOe;7dW7Ok7-OGjE1~NlVL&K* z$*T_L^?1>+!LdfL8V~1n_c23-wwJ*QRZP&bq~+k!1j9Cnbw|?rVQ)cdWP=EAW%@Fy zZ&_u^`I(RTS)_qsMrP7^(dp-N5bMn_TgI|^mL2oUE@xenLyf48h`-M1lKsAv6m`3z z-lU{@WLKt6lQS;aqe@9wa01VMRg>o=P?*;w%Sd4>`7>$*QtKeA%;G?-aC*yJE$fc7L&!qcQ`FeEm z25RsPxVT>aRYbjvUR{P)*U`mwXy2~cClOAqM>L!h^iY0Ek_3ftW;Cxmj!k(upe#E) zWF!utA;LKTbW!LtTY;34kDS~tF{Z>+Z!l>0*qwH#)9&$(+nggxV?3k;Iz2JP=X8o* z(-y~t|IKbi*;P2@Vj%)X_wa<_)d#w+o&9DjVA?1r*gi^OQ?f)VRwj-tJR9ZuQiAd~{ycs@YRwO8gw! z8U;(hTWI)gC(1VR&S4vrz!AO)>Qy6vN#KM_COi*}9x&WCnhIe*E(Pb@RH!0*a;|-* zOI`JW%lF>>N0;rrr*GfdjW_RKz42zY^8G)2`JEs5>#x4^+9#*pe(h6Jq&r}0wnh9j z>~phF#-V6{?KZ5Qg|Y(;;?@}D3u-y)COeD<0e7RS9wRIapICNr^K^O1Jh>~GXPyCA z2|2Z}tzw)Nm>86t=^@u$F2$?5$9<|M|A;`}PS-|vjJ+0dz1ywHr=C+|xF>6(d>-N- z25v=QuYeQCgV!h{_{teUXpO=UqXic&cCyfxPMSdg0d>dt^Z_n!g5o5!Q);5-W18pq z${(zQ0^2)*l$x|jpFP!rWlS(y5V#pq%2aCw!usrz&n8irM^RocEp%|zT*p3uS%iIc zoA+(LQmzm6hEmy%-a3&jC7?6&V8d{4+vZs7x+U2)bsjCIik;s0#(m>;UAfv8Z#dT2 zKhc36s_|v}SLfnAHMvsPXj6?GM5KxSuAKcn`;qt@SfxEexsUqmrfyPy6SfmmQLV29 z_$NvRvn;PG$Bb^ci&`3$9C}-uqu$nr(AyE1siBb{wRH~=G>mEl9TS0as*(Ka96S`c z>2!)5o@3a|K310iK8^s1d||+6I>qL6Z+4|BYc6+UMa$rY*@0pNQ&L&7cg^tflH&6E zQ$uSvU)$HYWUy^?WwLX9mnt#)ZL;65CDR)w+D99_1kBfTHx0C4zysmzj*-p{HL<YOfb}egT8!(2wS zijRXwe5+7yrSX)|Y&g6OhSi&)=6N;Dtz_Pa(V%wbbMwH8p*PrKsV-f*n z3IV0-bv<-gD2Ku+L}+X>6i(7bCn7XvWIgCt9XjZhFz|vcJ8z)pTm&E55>P%TG03{5 z$|%DGnzJi3*{dwMVAX*QYc`I0WS=I+(KD9e#{HT$vSQaQhjy(wsM!#f`8T~~^Z0>L zPsqz8kDrwCT=uTZuK4iUw3Fg?^qshq21HsHRAz4mh|~pZo(govU9jW;`TqikNlDKM zJ*gTk7^pB@UlGqONi8ttQnCE;;a=q$TH2_t1`xmxI3Wb zpX--AMzd3L21Ai3#g5rb+UHnqd*I-e>o@GbdT{y8J9phw+CDP4d&}UKx?*zaiZy*> zy*9ZPK-M>T+lu_foA&G)+f%CFJFxZY1FL&ij*Tqc6l{#;SfI5xm>6#9=w)_SAc}yH zb3xGcb5)xPl3#FA&pQwjCbB^%Y$|bvO|_waa>b_F$fknMcp}2PnV_LT%$(Kqc)#8e zK=f^{1H)Lo>P5g|Th$j1vy$28dc0L#3&f#06FS4VdaBlB+7|o#oDH2}T@`c6apOWi zS70^xH2VU_3#%5O8$Fz#@}Fh}m19$Z3jK#ctpc1X4>)Oa`@_`Fg;XHN(G~EpqKbSH z)r%?wVz*SWkSLrFy!c(TCj#uYMu5ATs;#skV~rRQe(O)}1?x%ZqV3_ExIctiu0@)`cf*Zy^A^D(o{TnkYLO*IGE z92`Xl%dXR8EH_)c%FN3y7n;uEGvD{J?Yn@_vQ7rV^dwGHFc>*5<@0o)|Bwv)rJKn z5D5{INNQ7dE$Ypfb`|WYA|@MoUmzni7DRxPI|4p;=8x%Mc-6(1+!l&*jlA~*H*xfML(iIG;8$2$ou&%b{_JlVPu1{*qcCMBD zr;b+#y@H>f5KoB*(dRD+`UQDo6MDMo0xYw_rfpbemAo;8FlfXr;ZAcMeZDz^JL5b`VfsbfrLKj?T&r?W-iFIIm1D|2TDJ;%pGl-R;Z84x!n&cb z&ug||bKUr+3!o{zPcxcGdn*EEWy^M42}b7-e9u6?-mJag6l%2o6=12WzzjogE@90W z|4tjCJ%r~K>xF}LhC}tBT1@r;SS1`n>{}Sd=Q-?pGcxtj$Ip4qvuzJXYTt^Q^nE&gYX=S7d9+mq_hs)>PS9 zr)8Q&n_Y|dWyasWb>;i_t-5i%d5IhBj(7AM7%tdpVRlv=0=M4)zXF6r%%2`9mVE>f z9G-{|?%YAM3|Oy$w=ib!|s|x5c^$lqsMAG#(_!6^Mr2=22bF8-l{c~(olV4bJUVB^`yZfiFHuoQV z>WTx)j~*$EdFm#5A4!T=%UXSFG3C9m(DBwwu3S<-Ru~@XU)!Z5+7rM(1@vtd*5nps zY|B}~BXRUAo~2n7Zy=t77HGt6OmF4=LWW3>sD_Fjpi>5|&fu64sl*Ae>avD0qLB*5 zX{5ZkWy39LF6@nxJEyD?Q681au*ljAUp}~Pm;!P&ruFPP@1va)>l@#)+UR zo@Ff``eln>RYs8KQXHl4-8QthRClrL_sY&&o+G;)ojoabVY~vU5I`=@PrX8zZjKfo zqI%vHVrwdCAmrnW26QDzgJSR3V;aUnFcM+BR4M}jNa5g-MRT?ksc64>R8yMQU%Yiw zf9B5~Ev=07ceT9hv7xK(+f*aoq+mj22G(D{;uDW+j!yahd$!%arpXSSkD`%T@iS=M zcm-L{*^&%fQi5@^B_zCJ~JP2jkQ_et`sRIy*S8WhLICZ=eNr z;&n8%vi4hgnE9cZ&otXq7XKJE1rJx^YqC{72UWBy+15wx!b$SvR*>=5^zI@t4SG8w z&HlNT!g@hdQQn4<4#h&*?W0i64I-lK{U0*x=sF@g*I`wF$F2Rw(V@FlPWqVzmlw8qRHHxj+ zBF0#2;>#W`NEz8)&A~@}6ywXjK;w#tQ=1tF$5O{FP?`Dm&}(D@r`}8NvC*NKH*it0 zMRqg#5U2T4OS2gPnjS2aW%5lAnu`vc`U^am`YoV=N5FBlP?X$A zZNn5U$Eab%aWtS|rr!j%pu|7<%@o+4luB(()xqY}6kV!e*c|t!PWYTgSX%&jD?V}{MG=DcdaQ{>Z(=?#1q)ly#ygfRufjum-Q z@&;>6_*1DxUO_DC}y1Cp*2Iq5y~FRWey5SC_+ z%}m4Lt4klOENCdZ$Qg~ee9$WK-v+)V zpu6T=IT>hy$HPv^k%m4;iMeD03>gr=Jo7YT9{8c_Nq?t48^PM5G7LG^O9b*+v>}Ch zta1a5cd({dQp^`7#!#8x(l#J za>eUt0b=>l@6bd_@xzQ0-{539B+!qO+`ia;W5JRUPR~5HEA_h;L2n0pnsozCFQ&fCL z8|)yCNR0b_RE_ZQ=RGuQMk+9XGLZymklQdK=Gtla!CwK`z%*)Lz!E4QwA>7e7_C#} z9JqsIHtrfmnP2g{+3hp{px>pLdjZg7Q~S!P<6;dTgok8J5t~n)P$++Z7zwy#2imxR zlL!7cIe8)xDx5q3zH)9(-dQ0Hc*}T;=9m#U?ZMC8eC0zVz1MBK@clP!zwi+2fB45Q z-uv*6zi`hrk9_ftE1p2{9xw+U9B2<=jx{DLZ>~&OqOhW?i&k_m3?x|4y(T0C+0D^M z%nQxgp}BaKbK(m-&2pcZ;j2nENDhE#8fmnq@1-wpx%-X*($?0pUHI`PsP z^@{z=_Z6eBz<;r*KeM54Vm;Mk7H9uK{4nwc5ipupm@~+zh0ZFZE2XO_Q)226*?Z1t z!kVMX33B#C?m2O(6o}t6T0jU)+5#arCcf@8@lq{;SfyXjX;>7Ufy$y-QS9lgGA#&P z$E9ZSV@L}k)5kmIEFQW4)+YvgE>#fKOE+w~@U4#z-mzz7V53)+-O|M!efRCX{9~+y z0k~(wdwZ56UE{Z}Tl(Vt*M6j_$K}Vux2*k+m6w0w^RQ!cOwytbf7U8oBb4z^!BG8^ zIV=R)BMo&lED<|;+Q#QCRzkRJS_g^p;JK1U?na;+BZpg!WYQ525P(ZF0*I&uBZ9O9 z0rv(?_i*4|buy-V2HiF<^rM0ebUsMI9v{PoVdc}G|5E-f?KX79^T2yDL&U@`S$f04 z<&VC%!Cxm{Ri|9D|IkR?t=pYoJk)=5{}qjD4GXtUbgtXLXug6k5Nlw21E@bOqYw=( z$Edof;z@AXFsgO59OdjMCYwriRPBQFEiy!%RPE9kU0ChX$!jq5mI4*S=;?wngkDE! zW}~R3(=2Myz1s7xU|p`OgaH;%nF078?JN-d&uNvI41)?jp08Ft$U9IFJdDMQA{kOZ zGex=xd`UGhZQ`y6HE+ZfI5<$hw3zhNuU^u!ap| zM2sP*zd<>{Cm*jZlKS^vU!Xx*KhuBh6{Gb;9wRexDXB@?w$=gWqh+B3KJMU;2?N zsQAU#T!E1EJsWi851#s=*b4H&<~sF0tVmbVkeR<{+W~zwp!yy`hKXUhqj&j=_)%20 z3dab~S1N}T=uCr4MFkOGcK__3518<^9%-1wVLLwex=(i=erfP;Pp+qT42RPNaOTsc zDi`t6SJ(YgqM19(o=upY;%0*2$%^~{HYX-I6nAU+<3_$KBV|Vr+zLbf}vAC z6B`1W+u=O*P#`46PW^o_C|-(%n`0C4EznaMmQ_xYo@$F_H<^_mS^{+lrzRNgBwUz+ z7~RAZHq$=lwJFHUFsgt;dgJe2Xy>tM)t2;wHRtL995sm)Vr14)*%*vlNVW6Oq!+x>@= z;1M;~%=;-(@7(`8r}&_(`DSil5BXF@@|}9vhjqjAY4$1lceVg(#q~T-4t-DzYiQ0& zO_kjVpI?{f;eg?>V~osX6i?~UgyGX$V%2Cho$Ye5ug_e}kCC- z&b&!dpf8BLFyqR0jrwAz5?sNK65MKEC{~#tv;hB6U$EBAb%S?n4>D*4-V5c8htVsu zFZZ{ zwvi1{d`A~lX;vvOld1;8(+73P2>v4t$qWi&>&&sC?-HI6hf%ljZ>UL03A&u8`fwCt z^MRof8kd*Kcq%n2e2h-FIr~J|r+TkIY~*p@B8xxthW+)|jc9bS0P)(gi zxprqIbn2nRT9l*rAwD%t6c+@P@ge+d>fKscvtCu|*00)fuzzH9*;ad@y=z@-=+)Gk zjmuhFXI3eJWHf*4zTr!kvY~L-TKo%uCQd`$L>U$OO%z2_y@1Z!9tVt}_;X55M+vF% z5HDNpf+5v_vp_#6`0ydu(TwK=I)PY^fLWZn5bW2}n&AU^40mTn9|?d>b3VcPVH3cj zkzxVlJ61<$nBqV+xu<8x`Bz>uwgT~Lsej@*rKT&n;b5(JrwpEaHk-S5=Pe(ob9+>E zJpM{uU$J4!0F5t=!M9MCm;)j+>jkI-4pP2~3)O+iA*iTrV0t_61f|MR+bS3;$kMXV zkcR5HSLO}mu#wY9$j^dD;)zRh8AYy!V%9<|cGdEp6%CRaad#~1JTDZgY3gY5U(hT2 z!RFUq)aP(+zx#Oq@Zc5cMhV?=m$r5n^NoXzHSTd_vm~XtN4(v%A0(OB_rxz?44Q?T z%=iUdzL5Yhu~7#o_iy7R4>ru}D#=ZF8DJS8g=#n`s7Vp+=0Lf=x59D*Fi+Yd2}(E_ z-V_GMtdpta!!MV=Iy7L;ZrL`20-V zvTN(kQm~X8JHQ+h%eq!3z0)^8+VBn3T`8yT!lLQxSbOh9ZEFTM)c-Eqx(caT#6jrm zU$fuv^#~(H_GX|IxhzL%fS@J-8tQWcg+OLNU+d;kykIndlqov}nk1Dr6RdH-faZ!p ziPS5FqD^S8vv~U@+xJIizFN91xh~{HiL4ag-Er-qqKJQ)@`|Oh+6Hqztd#BGac@kmA%^RKo)x%tKGIBU?R; zN7hi9fvWE&+@L{OXiYsdTWrL#R^m(=CRmk314PkDpP7Ov9=c>nDIo)*U%R`1IZ|rk zs*Vj~qKNY3>k73i^258cqZ_aLKbL(hnZt_Tec5Gx+UwxkxVp5?_U=nsHjQ3({rgk5 z@-Z95y8AWwvNr4-EVqy+t3;e-51CXwIpG|i{3vJ#iKaK16aeN9Z8I=p=n2JI z^)2X_muFANd!aj8#d#rL3p)c;G3#R}dt2G71Bz9xzjk0^(8m0-2i17~XjsXf*Fm^m z*5cxA9JhRN`TkG+$rbgK)fRU)uDy1s(KE5KreWz*DDE?TvT!#r8}Tb(+YmN^sH8A5 zBAMvLdrW5qBfvYsv#J3sxMiCs!k3Q-W#?=(MX-?3Adp=JF}rb%mV<6{V&@Wx3&Dtr z`m2bVU@!2Nt-+(Xtrhu7xmEFV3?RPy zJnxl_m@O=a0nPApT8kEbWOmIk7qkpsVIBp{m=<9#y3B`*Dx7(MsDz}}{zyW$Ni-Ht zPpp_pFKr4q#2-4C=JBecg9SV?P=gw}x}mGy=Vf2jpbptRGo;p)2AZ0dH2R$4d%E1- zu$*&y1E$TvS$qe&X~jMQp2O4Yiae|>gTu!30=Ln6%*dESMJz@Jnbai8nLE4p*kEAhh^ zI%VdH`VWsQ*x2LRu~WR@wv@|_i2C-svbCQhM8w;D9v&Y=yA_HH_(;-XPbI~~p;Gle zNu{LtG;^5Fo<~0ee^evhLH2v<9*^G-e@SumN%)^0;qppc9WH>IwUhgy*+-tU4K?d^ z2=sgTZ*)N?Qb9+(1WNjiBwnG2jkbj$HE8tVIooAU$D~HIR*WE#V6;&hNLdIe$PUbz zS#hC!kHlQ^gTKPY3Jy282Cv+9peD1YwSOb}(U~sXNL}hkXZCe^MBIrp&<8-rAG)S{ zX!C)YAMoOn;`-uc>u0e*p%4Yv8`o(yzrc$*8#o5+(Mp^GZNJgOMYGd3zFbrpF4GG1 zjB3=Pdqhr?LDZs06_kcuUVAmH@63lqRIXn*Eba# zG$-=`X)tC}v&r*EdQfVQj@7cSP^+Kc@s_&6uFKZ9VfTY3x3Ay5>B5G$TzuNE-ubu!uQmxW8A!!g! z#e}5r?Bvnc+^}J5sB_n{r4!Kgl8KQg<(fjOYipD8jCcpR&6ZX6`?u$}Z!6S&3zoye z=~rr(^fxwUO#g{I{|fdpBAHtBl2XlqXXfN!w=6;#ijB zDupGyz}-OrFJ0uxf9jwH=sIbO)i)9i>;NfBC1OgzaQX0z<=KtCH`c?RgaB?V0DJJ4 zg$SpFP^96rbJ&D#_mwD~a27svTVs~;MNw8K`)-g}q2M^W_K+8Yx%J zLnG`%LzN171avrv&iOE^6dF-61BMG^FQsCt1TUOD4V+odkV#`>3s`xS??|-R(InT# z4&<_`Qroy}g)c;;TP^!CHFwV)UC9)@d`)s!a47aOASm9};_M9j5O8U)aF1E_#d+K? z%#LiXoDLHfO4m|jQSPN3GnzbLaGNw@aFOPq{fc-3ppdcJB??9tUd0N$1Wc?clpEVT#-ht%VZMM;BhAfo7RPURXol?5;#QgwIFcKu&D|=C|W{xJ6dlySB4@8 zEQfDp*T6u2eDlQ8@z%AQ>bySjlG5@}ODx)y?u`WZtlfO+U9uW%=@?8jwuNg(dfNK~ zgFT&aXgcwqL|CF!0p1;wO<+*-)t@CuojD6iq&CrbgWf8L+tz z2h|ca90yZ?i+wnu8hQ^%Hdn6U)#NpVfX$K#;F9_Ka2BKAfN~=y-7Uo5-hzR{j#YMC zQQu25?Y-oxXD*_FWKU2|km`EB0zWZ8S%w_h7$QM9Rg4+;8I54yK)E}Q=}QWH4ha;P z6LdmmiVF33HLq%PDko4w&KdUrC4t>w+-d(vEvR)~POax)f^HPT8v+0ct=YZ!Uv=M} zGhD~;|9U%3AuQv)CiLRbI%;hQfpkjC6&rTyXQ;vO`4`E=i5BZ{{ohlLT@;Z(f7NHkuTN>>SCJhKt^-2J)RL=?{>h=-BZNAD}M zjr+%DGskPof?a8+fHA6xa8@>Op&5U;mm*i@1(_ zpUOpDKX}Cj3qh1LccEjHU@rUl{Pim^7b1-3(dis=S4;9y z?3cy1@qk-@QVKygGe4py+a*WruoW#h^KrI6peio=sk=}N;dK6xy}OcQFu9xGVSVhZ ztd1Ji2OhI=zBZ2XQv9xgh=oFcKfoCSB&9&lIN8w5&&h?b%>er|f5zGg)XjVX$!(9s z-p5faRX|(^55w1K>^%f$JYZ`9ca6P$*oxqz_`W-@=Z;auMIC%bq)^ULk?Tl~=1!ri z49s{eK-lSIRyAN9LO3Wk4J5tmm~@`p_+7LsM#HmRh!(fvNchx z3B}TpOu+-EslH-&-<3$j(}~M#K>fKImh{!v)uj>xnGo%9EX@uGcd}o>FGLYV>Tb?X zpFX_=N&o8h1cXM_OG4gMFL&y?4c;q{I;8hhSd>PvMo?{(Yq%Wcv=HCeDCMiQeFS$9$=Tq{ zdpLWfM^PfickB|Ur`uFLN8q(sG#Y_vfsClc&z8f4Zt2$>HA8BqVTd*2MvnH}O$l`k z#U4UPvPouOL0!gKGmsdS;vu4znr+omZkSqzqrcu#rw!bAH0ZOfIdC5QH1^^!v2`!J zqm&u+Z0YjCB}(-d_KE(GUo1{E`g>O_@idkaUbb}CQ}J;RwyLcd2F>Q~cFf#tUyfNK z$!*289-m)cuN0T{*Ozu^?5@Dj@_uu@8<~Agd{#UrY-2-0c@?d>*d@vjThK@IbQFWW z1^d=Eqwmwk zi#fQyItTSy&i+>RCK=sw&gg?>pI=!}-}P&A+1%V|*Ebw?fJJ`Yu4fOw^zyM^eH|;O zJlT}V;w+TS>g2}F8-lqqUeYl@8K+MR^p|lDPr_tVcEd(mEZJmca}&SfsZ~2+q_zD< zGZkR8Qd<0ZS2UL&8pVhSMt&9UPW0=enz3vR=2R|FZtYkLE7iAXQ_bDQzV-MRYV-(o z)Z#9-So%4n0xZNbM`fH<@`KMaWYpooh$E%?PTHtOywBW>#1=JP@M)5A@JLk5-;Aj_ zqRJPzPvuv4*1DM28+9lf`meaibCS^GwCHmM6VdLrkri8l&WPe;o~C?rc=)1p>Td&RUD3%z8cR^ zs4)XGbJg!^(^`ry3N0|F3PL-3g?$_A%2J$721>~20W;gyLj&2C$9OjtP$FyQDf;Oq zO2fb*fGHWEJwiqSWUQk=Z#bxu(p{i)QD}2X0&gVv;W~*l-oUIH#9cc6#IRAETf$!5 zKubH#qC~)mqfkLGdQdfMw6x>her?hw#T)2dHDLJQ^Jp&)xPHLeW>jaQGKe%?Q8Nw+ zfa)v5lILY_Xx3~mI+Dr_@#-4#F*rhJ+86#Vo%$+Q}LWP z(%vyL($PK`a*ekY`dU`ILVjs=BC%QmppsU%^%UC1@u#Y5tf67d^~SD|kzLE+>oKj^ zuW{ZT`>BgLLRF1^134DoNJwjiYwL_u0C_0OQ#4xZHR0t&$jF; zY)f=~^jQG2fbCfxwcLC&S>MeBKW?I{oA~3!AGL`eL0V_y*(^WnBUvT+rvYq(>GMOc)#_l77$|7`q zUa*CitlEnEmcc7+fILS4TiITLQ*>zFM~PLJ;MtwkpmuO+*VyKXn%dK0ZQqKyur?f_ zz;-jeo@j8{J*aD`#laMvwf=i}use`RwnPx@w$wMYoi*T1C+qVFdRYSxf+GPn;z8O) zkvtArRDHzB-zJW*w~Bv+*d~lv6Kk{{Dpn2|L!tBBabw7dGk)Ay7^i&ES!2j8YhD4b zcxJqd4!3)rSMvSQ)&(@+_X8jz`r%ZNz-SKA3`VlKldFEuHt%jWZ0* z(kav~=@OP@Jmpbhg28Xh)8IF@z?MPA2XQAsHP}L;hRgxHJe~K06&UCJ@N#H)5MB-~ zq^M*YDIg+abNE26av%`6G}=*|Qeg&?2s6lP$oCT`54S$)lzldgI%uXm2n>f?;RpRB zfT3K3O7tKA79+<}J@iMc9QspX?@15MS>zV659_o?$IWcvo)_=A=f!OYK5*c`2YSbr zW}6hR$L$LDWc-fy_!1TS2E5MZ)m>xk`Y+vo|CjD(oev*8`0&B0rK@V?5O#5EiKtTF zl2W}Mr(A;bpm`&(^M&7wk6{FpI7N~WK24V(Cn|y-biW?E)`)yFGxZT@A;O0c+vN=j ziXb{l;Tvv(NPwZ&HB>7Ka=M;p>TPD(m5H~bL7vX@InWoLspm;l=cX0)16~H;VGB4Z zRw}M2WYVd;P0e)ou%C_J5cJIa3IIfAE}K&n*AJyj4KKL2neAUGtYdF5Y{5dsyFi}W zw4X{Sn9j43#l7rG_Y{hRG|!{&aU=A5^2oxM?vr)Wqm&Twyz_P!Dy^jtgnf%{@R+ql zxSc)4R^vpEE`h39fMm)l;X47vp|C7K8XxioFee{B*1|`pu7Jh^E+vzvS{{Hi=%Tlj zO1I!Zp4G@_QWBHRd{<_T5x-x41epZSUGVk)vFDxG7tEbzwEvrD&K^WOAsTr^d#5J| zFPuSl05pXNZ09>8h%0hm8!Fhpxku=}Z?+j%%UEGOkaX?E4|>D7t&}yXreE%KHyq7sb&B%n^HaDHYX;X zeY`iU9<+IVju=jR6mAuFu(yftM*NAhX=H8}=GinzHB(^?&Za@JQ1vLNdHW{P*;{?` z_h`uRAl^V1I9;GJProbtMm)lO9hgU%m?H@;&R?0HDtEGOx3COO);zdu%E4c8rkqYG zo1|09xaQ`cK-Sf*675YBv*Ly(_K%P6k9Ul;w~vUi{Sy=WCmtE@Xdl7Z#_$(Q!KK~7 zzJl7v4yuhIc9Ci^;8;-x#j!j#UL|;tlfcHXvW=(yO*$0kQN%eNiaHb8KNjXxX_)F8 z;>0D7#EC&bLfs79I30?COPHevq-*lJ98++*l&=(2xV2RET#dYr{~AjEUxNdf)T?D5 zLY7}beey3ct6F4rAHBB^6@ltibaj=A{XF=HLJDU1{}+XSvMt3)Tl>x0IOrCx&jDvx z&+BCBfhPGOT#;kCfZ7tw0aVM=IS4etUA!wU+GIwHg%=LdNTPg3k86{%qo$s#y&f59 z!&O7BUpvi`qL#*7^00@JPVh1dvB@ns)uG0Y<@weN9(VcuuI~+RY-y}(O=uoq@c-kM zLQQ=gZGAOM2EDS|7hScXP}3Y~NCwDUcz<3LPTGbs&+kR`3?<4Hbfpy+v?{`K$`W4{ zCDdb6m24C4LSAdd)|e$ZYX`5t93iQjLyl=O*con8@m0Tvv{^yXO#z&>t*3A1b2HC^LRM_H9u`~~Y8^Xua`OphyS}*@$r@E| zX_@)L%m?uSK0gb>_l4V76ZoypdF<94X8!jbG&XmD#lJ2%x8PH=CAJY2KP@YTj;=FyJ_nQ z4nv2!u`dui*uZxfnMRl-wu}d$^e7e*KFRr35)N!I(_O`a9~lG=bUp=i7l?!siI7i| zfQ+3s$?mY(u&-bAF|oV1HyiKy0Ls!riIxQ747bbg4k=zqve{UuwRc@_lIu=jUlN|S z4Pp2Dm_TW7Y?z_b#!%ypE=3&Fa4bi3<{12xn~La0+;oD|>Ep+YdQ2%dHVn~zHd+BI z6CNdvX5CpD9%+E#kTEctt6Xl6&yjTdeC}JKK6i^fA;~WBy8+i)G;ii>KDVqyamd|l zgT(Rl1uTr(VB#%DXk=+G1r=L!5M8Mkz}ivW0|xvwS1)kJxoj1dnyZfEWpiSzBndga#9rPpj7X&amUG`zP7lg&7T%!W9-Upq zzJdHn3#wms3FUS;!Ks2IGy$C;B&Rym%AS7AX>(_PwFV{z?Zi}mBtafUn^g7EiX_LB z-kqzLIBRD8TOu7?+M4dXkV*-bF z$V4InL3BzNboNt9O7PVb7MmX0`jnEOsgToVLWl7L zOXoVeuZp8UprsV=5gk%TvJQunlIEcPBOxN02D@af#@&$uq+Z8 zvgmx6b^XTjP68>*2&DYsF(5xixi*wg%y((cohVK+Gi~P{lKpCWNw`V#*}YC6w|d&k z?zd$o>YGF69VIC{aY9euImhYmeTji^DCh{fW%~vVwgcL8&;EF%OaIuEITD?S%2cM!BghX9)GIN&(?ikI5GT<}I8F zIaP0;KSH_o>P#@N7L8G=GDdl-Gxc>?j8MnFV_fF(m9~;?9%XqBukpbOiy3-lSF&<> zcE=(9)Z{p4x}jU6!gp5nOXt<4ff|NxMNA)$P$HvoCzveE7p(Q|5JGm z>GZs6^g^Yn!c?n?@mhNcEw!RjpVB7tb#2#Em=4LqMh%YIsGWZ}5~f4)%;}J+sJfR( zP+vMr8J9EWL%QEsQovBO;sE+TJReX@(M*V?vY5|DMCZ^vPE@*iYj5X@Exq{_ZJn7! zsl6fFb9UX+8B4$GUOAX6EFWyEt#8KBejUIwh1pZKAE5rcfEuE|GI!I^X)Y-M89znW zQ5+eVjCK35D=0}hOccbmA2T{AbAaPDDD#`5IC>=2L|GPo&PF>&-@_X z6NP5id!TC>1wS1Q6#Uo@BUe1xY3o30QdTF6au2vPJf7y#%6OAflh51aj?Q8a%>hbJ z+T_k6UC}HMj1;P@!9M}7!&TV`2 zIqdMUD`ikN>dfo>s8jq4DR=>nH{AJqnT<7mA2EAjw#3hZS|fbb)cDk(>DUKbNtJ^m z!1P%npip{Og_HA-h(ht&RLT5{QYWnsr5;)e*7C_vIWPhqWvbn@{iU4fSlW#>r2X`P zQtPlfEJc|8LJ%iPwXT?e85^i4#{ppcSgFAhF57VkuHLHYEBcK%JPW0HgIeXVDSVI@ zE^`&Gq9>^rMTa!KrH1@+2@M z&=!sdj&oad3>b1~NK9iXNrArn1H)po3eC>eCwq0yA=6<7WoLBkwZ$`zVldOzy3n^Q za_etDYwzfvCFv?of%`&np5BJ(hJ5mx=-s`Kh#dh2sygiDRn6 zoP0>K{{dZCPrb7#Lt8ZK&QQf~&zN%=oZYw^xR2^^-&Q#x8%H+sbH|M)9NH7J1#tE_ z{fkf7MT(*tMs+vH5#e9oAiUjFD90m&R^lk7DgWQ{zC2E{syzFgTU~oqSKaD;uip2q zdS9pa>6z)-7notTo`qQ$W|)-`BOs6g4FZB9UqD%05|wD(nnGOoj6o9>Bbo%}hl0kB zpg}amC^04<)AK#=IrmoI+PZrNWB&MNe%1HZdhdD9d(L^!yF5>>2ovQ}EJfdj5?B>& zK#Rze?;z7m)LB~K@zQ)$x>BtId`%=WVw{rotCu$*j6w(odQb(meKAaiO4Yqg^|Wlg zZtJSXryc?b$-!K;ChgEd4MejUv+Wcx|`QL{-|or;|z2dcib*8 zA?IGDg67z|-(cAVJ(y&VB%yDiY%SU#EvyFGIj{zR7J`2z8k8>%2kFJ(aWcE6%w`vI zm$gysz()m{mDY~acJK%xU5^B^9Pb+FT}`8qM6e4RYhOD=6o=!b4O8M)Ehq`FSV;pb zC8C#v6<&BFod)%5?b3G80-7x)IGFPKg4<^~)_@&`d7XU5wKTI6TOUzW$%K|1+D}Lj zS1>EZJjX~(BG^`{G&}FK#wmWI!PHstG z;>>NdWtV8nD7aRWbqV<#(Hc2CYeWF81~U_alhI=NV!uGF?q5b@cFf#rszV*ZKpm1b z@y$2|_m{ygGmdxbhLDi~koaOtd%QHXesZ`}B77-kvXoo+r3}(!F)eX?Cd+PUkzomc zmelJuABBrXaQxEtN|f#dGnjUOoehoFO@EhO|<` zar1#^lk&cE=J|OR9?EG}zoY??m`ax{jh^_0kF!1OEZ@S9upq2&DtjsIAff;#!hk-? z$!0!*x=}6@TJpT~jz|R~Xf_QHv6zc|#E?=#vV<5)B0Alj^{ z)plpGef117W*swY9J#*x-HtVr#G~byTx~CQ+E=f3AY;QZvs&g6lfM51xQqV`pBQB^ z9net(8z{bnNmNdtz)g$`HdyXCrVBxz^||Ss$lTSvb>cDO^b26N1|iSkhEAOEJ4zC~jAKy-fuL zSW|n?=T6TIRM~w+mc~_GA#Sf}+VTFYT8DRhu%ViIrf3zo=j^t%O?R$+@a48qZ;{Qm zX2+d}R`8edzC8C>!&hz|JPxmizUMoFb)yChVPIZLMsDj7!#4rBtru;cM{bK$){4Bv zD@JciTu#!Xxjh-TtSkZAjX!H%Y2+UF2-cbZ;r7NaKk3{1ow#LaDec{0UYU&c-h%e_ zr|w_r)=lVNN_UUz-!?=dt{k0D1cE4VtovbTyrysS`><-|m_tBIf$-z&?M5{L5mbN645?6@%G6A5yCJW znU|E-0spC1>4TYBM&tgPJimm=6T5 zo#j5%EY>F@+o8e&$O=nBwlk;9Qj9P)(%m=B>YWz$?sl_E%Q*|!T7>yp4z|4rC{-kC za-@th8d3feRr7MNq0&(9Xn-9B5S+6E13Vn?Q_&;k-U$k>0L|P4PYZ4dl!XG@-`EDg z$BKFxAbCoF3y>5b)w6~$YAJEYH-7l^*wpb;1HRnM&Zgb_NAJ0%&{e3MM#`XjgSUFq z%{xQ+{0yEw9jIQ>J~2Z%ouiljnZK;uf|xC=0OC>;g~UkgfF4qHol#)X0SmoDGQ@)J zB+_iBynXi-95}Dl3{haQhjkLL@D2Er=AEUb_#&@+3t~|Z2a+=6rgVh6D){VH` zMGA2BT)z6=k?o_XxGvydpV+l~e6%C`+Oc(~^K%g?RJRQFU&SpXG5~0dG_;J4w#*I5 zlvEL?{Vg!wejza4+9=C|_^O0l5>VdY0MY%y@hES!{1VDr6ew@y^}=Ml0-U$R6=(t6 zx9#R7=t4RWIQ~8JxI?u zm1wP8{cFuAlMr|~gjC#^q0kx)iH~VyBiE8B)jUkX&8RvBPiiJ8fh${b4YSSAQ`9=MWkkKe(`d<@9Xk}2fZgnW$q7m%OUhID~$Q7>iGFYD5yWQ=B+ zE&xjk8jF<)QEi}fMr*~(l9>ed)6+IJueb_q-!$NB(+WxJ28fkbD=1Qvl~hFabp?#G zr$i33SjBA%2yA&$s6V~P9!(7M)7ZxZ;N`zYgryfd-+T28i^>j7#gA@G+Q4|$Xim=M3w6Gon)TF z?K=RKYNa7v+ZSG@KFvHnds$Nl)fH;aF1$?W)e=A|FNea&DPSH6stG252@16vl0+q$ z74VOuYB+T6n#S$^u>xst@+HjirnNCW9trdkM~z@$hS7{Tv3SdtDes6hRuS+=L=ZF_z0k5lytX7C{x=WVX7}L5%V{%tn`~O)vhT+7xe9 zEz+h#X3HvVo1A9D%G9P;MVq=8?nTIm z!v{qBny_2?drU~C*n?Yf?Qe-% zs3l!Heq5NZZ8Z;q!PvFU6;c;}7cAIY^KS^Pa$L{3n1P#6Tee>PWya`$G3{k^Q9tm(DlShI|*@LlC_Cjc7 zMQhl7fgsY(+X8L`uDMi7j;a}X2G<1QBYHqvcqiN(>PZlg8iA)pG6|s-dg(;#1h~IR zLhYnjoWDg6bb6#n9mOwCayrIMj@(Z?b1NQae2VaIf{8|CUtwhEGAs1gP3 ziI!xrBC3FsQw%Eo$WEahd5xTHv?g+|ppZMHK8-rqk_vylz*MXWgo9{DC-OQqhK&ee zC@MfT4@3e*l=TcgUM(ADv#?frYH9_YilA|AffELn3&9yk`^9FU92lvbwSZZC@ZA*y zRsA^`4tHk8HO?XwYB(H@#{F3UXd9{i=-JujJ3B@~tF8%N_kqZ%_gVW!v#Y%x2g(C` zoq1k|%WunQ>~lHY*0P*Gdwl<&?p@tC@$OB7|Gxi2B!jao?oh$oO$^>{a|XQNUIvqLQ2ZE+^YyVHTI zCK@ZrV5@t~Q|QkUkXQNpOfxBsEwM+y{lEAJyZ`tJIQjl}nWy2T`_D|WK?qy!rrkNp4M>F`vgWmXey3 zpD?Y*`s7*BCb4fzYSR_Oy=Ch$oQ=4503#bzRK%SK_#E2A1rYN7g41Wo0UNT|V#EYt zj(MloO^P8doS2dk}~Ek<+WhU8yP;t zYQ1>OJDtc(>!T^zGFeEY3AS01G;|yp15O4yG{jEvQ~U(*zw=?6Ofb~NNBuU|hzvEC zKyjdDvskFi9mFDnz^_{Pa^;Be3N`8WIW0KJ|c_#6GG&qbGhg#HSO_;)LDK%yEE>kWE~ zOiDSSQf)s0MsSLmVcVzUic=7r0Jqz5GzGyOmaKd|2o4M^&^`lToQnH%WGLK^P!WIaq#i=Jw#DMK-UKO?yM{kuX0Ez>w#wH{}6Yj9SD zDxk&SuoqQpxica!u6c!6a;L1-S3Ofc!4&~#^Xro`43J+yn8>huDZc=y#4%K4L|>9o zk%`8^r>9aF2~#ni!C2|B1)r4MKkykh|FW2C;@A^ z=A360K(OO~iZ8)3Kyb7FI+=0nRjpgrw;Oy3&lh(0RO);Q7G3t_SE~XJ?Y@}wL8BOM z>4=ud5m1K_fHfW{OWC1lQ0OuxR7ZRw@0`%8iBJS~O0-eFNo&84$OJ&(i5Nr)pzL7A zWA_fvi&&=S0Uk|#W-`1?r>T4HK!P2X7WevGf{%>iu!N~_1h!2VqA~ZRuXb&3)oNkm z=y)&$``HLV2m~2Q!lwv1ii_Wf)z4Gh z^l1_I>!y5_`S^8Q)HKwp)j@1^0!FnCFggGuGW1616bfRKxqkU!9dOcpd(5 z=hw7mluI|ET)L@Q*5&fpnW#-~A{DnB%h-n=N!d5lHvazb5_5oOT zVXD%l>5^6lk>(@F*Rv=R7z2xxwYtQP(Nim-EKoJAS4VqXoga5(XW3t}6ldk+RTh?) zSpD9q!lr@M8!xQ{#jA=^X}vHSh(;d%Xdvt2-41&oJ2Oy|T@VE2p(DG5_ce}p|6A`f zfdExXV-rHP(LMZk;CieDrUekNM1DjY@*|2`qX8+^0L?!vK!MY0u8V<6+iFTD#E7T@^kZ^f;_bszrM zIuN*x(As6~`MaBjW_yZvfk)YGJM*Nn%e)Xv9f4orJFp!ZVbK8*yq{R8Te(O)_C5UX;u}h1 zf%^Iu^z{(CcCo%57VS*v>t*P3>g%VduUkYegk3 z7mEfiR6_owvdS>#jZ9uKKZw466@5RlI1}k;tnbH+zP|z{($v1jrS$)}(c;*?W>F=0 zInf;{=0wtiGeQqgm9P*@0Y||c>H9)@(B4Puty?{BEeR0=z&lg~>@tWng%%63NT9ra z5k+_+CJsYB3oAlI-_3zvK!E(r>%kBHuzHZHsY}s=4M`1NOb?VXUFqlBjM{b7kG4S% z0-`d1C5s^N+lUGuNhGYHlvH4CqWi&P5k~ndd7D8fCqOlc%K{0`2o^|7kjqCaS;< zdI<{?E=o$tYk*?DvRGfD;26O8|&!)u<*uZ>epe305nG4_H%?q=-;=3z=95 zbH&pI0!LI(8|aQ2yR2$#a8?oTbC2NDZb9zD7U?MwG#It5(NZaa(ps8KB&4&Ef+ z$Zh<=A1Y@qMY9&k11pPJ$A)o~HWTcoBpX5Cx+oFs8G6A9iWQWqi^Tqr9G03N7!$#U zZW^UQ?5TtPa3y9m!XB%`Q*zj>F5w@+xkBTCs7yI1Af>>vD5!;?>!k|C zxoQALC|nX0%r;1h1m1E=GkkE>hj)w}87T94a_n7?^la~|^OyC_4s3aMjx(!m19zi( zc>QQ|Ky_PP`48T3?#~`Egc_4FU$yzM>srS81MbYM_ce`gm@aMEwV`v*CLZv6b8K0v zEyv@}*!SLVDy_-e5yW`~FFf)eh!=j0ox2=n_;DfYr7^=#K+JVuhL2iGTRMgzMA+{U zdoR!`Antd_5T8=8OQVf1G{hMjjf)Y<^Q1)2`Px*%n>sF|&f%hth=+Xa7J!{gh$$F& znmr$tdj%5L+<_`S5p&j|ZykUAwTC6(oxLTT*FrUN`S6#4T*6`bPvyMbk(VEH$L3Or zd}$qoCyifBv1+wQC^LBcx>TzucuOf9a2BilOSI?`5$@b_HQ#?nk|Y4*LG*}o-yQlb z9WUNXpXQ@Opb7v7d=fMjY_?HgGW|8iZUbA!cIe!20dRbiNjI8;3FQVCK8pdZ8X+Z$Jy6(u4`$m*y2-9WwZ-%?6o;4roqBKghno z%4{QGIgG<}&G(lc8<-xnfH2XeDsEq1j;CgGGx7`|l6pfDu_0EZ+$2cwzB0D&lb=6S zO4$j@)~Z#*v%qUG?%%t+sUW7EPxrS3^SJ8 z?@|^G=zz$_1&BmRxg(Jg{Q?=$4=8v|ctc={ov*5Ip*=9u0z^y5;3%D6g=rc>g(u|x1wp5` zq^UT!s>H{?8`GnXWxMMJ+mzWvNx+o7^jq)(oW(p-iJAQ{>=3fb@;fB6d;s|vz&+CJ zR4O8ES1`X4Hg+d|Ygs?C+(QCZPn9k41_8QKw> zF^b*(?CZMS1_5asOWMa(STnqu{Ec`xn92Y%C0d z=vYG^haG-`K#2l8g!cCV!s%xL;Pewa9n&%>;!#e6+$>KT%kdlZ&AL$cByYkCOp;Z6 zsrK9ey@J54!1tWie!`7;K2t;k<0A!d%;v@D zgCJN*BKbzUM5=vZTw?^oCN(BfD4J17%|OMZuGxn0=Wkk2c*%P$@vftL9TxYx1Df4# z++YU>2R9I4e^V=NaA58qh|Gw)g19-MH`yD1jGwqt?Uq{0PG^IjHY`@1S2!YDPO!0&7wp+ z;&~~A8Ghc?(Aq=xqF>cA!L@G64L3}m#WTX=C#A)*zaKF-cnLY)!|@H5_Fx0%EFB9m zsXrwIfbQZp`je^+%>9Y6a@qZvVz-tC%I%`x1oO7w~@>a*mzggyQx}@@#j0ay1JuGwQ(?1_yO7AuL*7$=~STPZgoRa z^Ow-ipHJGZ>bO|fU~QE7`#m&sra-KdghIJ8f-WdM{;5wQ8H9mTx7&1%L2l$ozYuHx z2BZCkqf%5b=xlbc6d!jz6kAlf48FSboWqyi)bngmT5yuMuZ@F&II?*_h093SWRh$9?V zb+@g&?w+n2HZ4Eied?+m@8<&#zC1oSi+A(YxA2(zcl=R3_paUXrQ44FuLE~a9eU!+ zdYuRu?q5U3RvT6W)RtAyY5;;>WZi_-P^7McnqEg)5j{vogD5Qm1Og6kW09aOBle4w zOb5m*u|f#XfrYr`+EvXa_=|gxA@K#~v6WRfc3>148>2j9t7y$7Hx1^DTx5!X2dj2o z2s)$Ce1Z6TXM1MzN)GoWSBQUPyzJ26#^b%~2PXGz92(!lj~KP#uk8Q$M9;vo_}cJu z!_&9zT)qFci7nT?cdcF%F0q^|un#B|DGx2%|)T_ANbgg{}UGT}o2 zfF7BS5eG4Qj5t7KB}7t1!Ju4MgGfqps9Hea&*c_FF@TRzriNX>BbeVm$PFS;bPQh= z<`V)6qJ6}$MFIsSPA8*f!=68X`kB@nn=F3hrQdaTx9SGJ^5ONZ_tUW|HvRRNyCbWZ=Q_2sBxXR(bBjgYrWG1%^k}&O_N(4)) zbQcV9;=s)0L`53&9n9NDtiKY?LUNw5)&zCR=Sewe&Q3-;LnFB*7uLTA-Wt4?0jCoXKDH4Dfd?ziK9){sF7YMrVH*aF2J&f=(3ZC(WX~ zRdAmVmQ*$5fcrcx?>TXv|Jp1>v0s(?c?Y8CkN}s8&udhO1SF-yS(^oLLELmR(QcKrYDR|q0D!u~Vy#bj(uwsC|x?%*T z?m*()d`$}7U!jh;0+^f~Z9TmkHltIRwrUC+f`NW?Sg#u1(5E?iFpY1fqQoe(VA`gh zYYbe$w9S#BumI@}Vfxh8EO~&eI?&@x2k#79;mr#Ut10wq zuk6(+(i=84gkJ4UTpzZ~k2lR&AEwZ&z`>|+G2wL zbe1lXf#I!(b|nK!a!AO9FvwTQck>*%^`CL8-%5@RDIcH@xYdiFr9g_ZS$+HY z6agZtdF&+>z)!eV6!$8qqvjUC|0RlDD6chKtv7c7hOvNuF;WXfdV`2_C$~B~ z;5i9Gn={m|GuWk{_V{m0Za06)>fF4PMVanpkB%OiHqX{x~UJqpBmidfYh- z=j3W~PHsq7YEJaRbr}8gRpcA-3RRJ7&OwOD1BwsI_h|{BsDET~H5o#6K{y{8m#-AN z4yRGnuMLw~G&m_k$X%VN>eDyMwwz*+PArBqkwU6VE+ubEA>=EoB~PrzB;UBy#V2)q zf2_ty+6Y|rZurRuTM5l11-gHSut5oI9bqIBLTxr=orvz=2ZZ(WmA(d1LYNHjuMHC5 zdNU>{8mkl+piC=r>jZ@394=vsD&RG&K6Yf$Sm2Nl&y&JZ>6P~JBxKqp>FoW9Ahi~$ zv%vM0*a%-p)LLCvfsLT8f&kaIYRgD~3nC*-OJPpWBO{CnWP~;H^);>0F?lwx)5*vP zYo;OPP~oykq0nOxX#ymIwtf{}9K#qOIbXgyrxy8=HF|S$4_ui-Cjkc=`g{`l+|8zl z*&tD$d3brMiF7({B8`HLrDqx0itm7rB|h?>6v*J@!dDdcxAz?OIyusx)C^DMuinm7 z?lL>e;v$7hQq<)ppILnLkj6XBvp-N?fX=RB*ASmz8l;)+OP^GCBuuIjtLF=aq0xyI zGh2;GRci!5$2*4QSXib@*1*p6BEB+B+?ZbIz>L6pzs^#lV@4pVgk&danTMSnX@Dbi z)QA)?5kV?67I^426n9+`lZXi&!gQLNPvnsVpop}TB75V3A{0c-n6etN1Ii_;k-0>g zYWum2N@v(G_kj)_xkF5Ifnrm{icv(&iN{*TiZQ8kX_HcnI5D%J&B4Dpw~K6M{(NSZ zW3G=sPEY1S-mK@${aKpnRyqS-Paw>-p&PDDS3s8z%4%zt7+-tNG;OmjfIrnwmMBALXN8M`NC@*%|`F*qz zP~9&3+zpr*RAtDdQqoT$B`%}mlHT^mPs7T=~xuCOo%GAvz$=rnMwt%?*MOTrO zlGgchV={gKGOk8`f3l2`gBUFpfGHfv58>hqwDklJsRq&@rd^KQO}D*($Um*$b}DJl zgSHxaOuV?ndn9t=67(2ACkXN`S&y+^CKiG&Al*Mo+FYfQvt?ua2FoFJ1XwN5YpT&{ zA-xvp<0xH`Iq*WSTU&|f6xIBB3+lBTiiTRJXu$%4-WT(f8;+wQyGvK_T$`@nsp5~E z?Nhq=y}18uAYz97tx=1ed4c=qzy>HslH9qy%nlvNr8ZaynwbFk6H{y}DaSVXHk7|i zcARiFtF-b5fYXwLSs?=ajK+u;f5IxV!pUIEmDkOb*Uh8rD#-QL7%+wD$|;Qd*<_nt zc{E|u!`XAn2yYOW$1My{$JADk_v!~8c2ihc$2Haung>^JYd5L;bGl9&P{f$l*n{v% z?||kOVSgDe0Cu8uE&Is>!u%Ns8!$hRQUuO5yAbsXi!$P+RBz^mKZsDTah1GIJ=rw5 zZt%fbo5SwTkFO5gx4JLG>vXB{<$#z6rj-uEAiv9h zxInq<_viXW-Qs`$=U1>FDPG)<7r3wJW#X!)2M=eqQq=(jL0*{og>VIykGp9RnL|nV ze@cIuihiDEKe7Zb<9DY09_2Cm`o-P&9a?Pg1i#azRIxu%o)^BQaCU3dWoI5jq|PHl zIU3O2fkHh*UO1{|L}&F3+k`{R$01OP7@G>ObuWoBF<)Bk)cqlts5q-vI@vACk7L)g z&tKDeA?lLXw2EXKD;#xHsiP}MeA;<^vO7junbPsX*|tlMu`qnja&4m?Xohv&!R=%{dvvXx9_J}JX zp!>0Rro7@x%AOZl#X0321{6P_>Ov@Lh0PpWtVB5ptx`}|swTrirOzCs${4*wzl--o zQHhZlDRXzKO)ebs`AWia$oFRk*d^nPbK|T=Eza>}6=TkhKhoSX!De_X*HE{U$2f+Z z#&LOv8$Q30l=wxhe8L%ZqO8O9@ZC-|*YWXR7TX`D0xZ{^?{T0s$$mfCSF|?F z@R0epS>kW&rbsR!y3o#sICqz$GK+rx;|^pF-uD2mM%(DwD8)dWAq}x)tqlb45wC4Tcs?!g z8X*H*7*+!u0EiM|K`@z70d2A;n24YLgACLF8rOi$i`-J9qTc!n4xZ zI6m98eH>t=PH+3n$c+U66i_`c*fai-jz4mJaB`&GlYzx}bor4_XM{X{UhYwgYf&Ux zwq{druN`p3uG(8Bkmp-k&GC1~@qDY_9k7=@v6mKa#2EPZl*5QIWF7xJG)TC{p0>XBBEN2T{gR7@37F_lDw%yFdtMr*`pL|Sws z(&e>Wf~C-9qzA+x8_I4*v#scP-E1cFUrLR5mdQ31B}Um^=UYy%*E#DAcn>(e+@`Fx z`hC{6L2IVpI?BCHzqMt+=2fk2eYQ-eS9!$c@jz~m(sv&9e#T-u@6EjZ4sYhu7ONxE zcl+($%-i1U1%e6b68(7#oKF^@!A0<-F~Z?G=iv;ordxz98+TCUPp=3pk# z_Z9YyzO9emy305C@2t!Mz7WPXKhF7;$&TAsvH2Rz?4e@`+Z&k7}I%mIN5WTzrnX`Oh&X@Z0<>JfeRE8R4khiqGq^SDM&L<#ou) zir*W8Jim?Kd5hho1hE_XFQ~yuj^s|S;k~o$H|V=Bferar=)Yg${4Mqn9;1-` zBzsbP=96IdV6aW;`^zEgQ6XoNb;2XVkJm`{BzMz8$em=bKa_h}WlZiQd(#8=vPV28 z*_$6Ed+H-E+6y_SdRRvAI>{dLHa{SDA0Afr#--OexO(`j_)H#ti{zg0z&#F$*C2b6 zzwsd1Qy+;V+AaFpIHJwsx`{{9!E)RSwYM2Zk_p|LaU{K@=cJp^57JGcAJ9$cM*(!y zg`vI~V?yPqnH4gl`zD>GBgqZ-pRp49e?8g)-6j2r9ihjhOQg>!kI-?UXLS5iw2$OX zZB9HIdQY+?{Wl$imsU!b`II%6FBpj*Gd;}QLF8pmhwKsFWWqVZ5R zu@z{?H2XU1VxMF6VvhI_yPDt0He%k`#=CHDufV3kclo=Z%kRScf!|d=fD>kh7{>p}xpINnX)h}lrT)lhs7uS@od1!6t+OMuVvhMBmH?RNohCkZy z+l{ww{I5-iH~Tl=x20uE^s1Jt9=Y0c^*6R&yY-E2C$|0Wnwzh=uswVGsqN40=-zQ| z$FFxD-T9MU`*yvyd*|-o&EB>rbI+}N1AFh;*T3(_`|rPYSJbLr7-eXVRpxm(ihUjts@uSC|KjAnrapHy(Up(=<)c;TVPu86r zIl1rTT_>MC`Sz*qQ;(chP9Hpd-|1hS{?(b%Gc)-A=8Y$Ayr0%iUX7XoV)vp|l;e?$ z*BC!1USTW;^N9s?S1_Q($|=t|d|t-u3Vap0`e%serb0i@z}Y7K+zP+y8U5UbHT6FI z+>T#)LO*xF-|`9l+==tA>E~{EHeb=tJ*<~|^m8ve!YB0eOxDT6`nezDAzs=gPuFAGN$1;@}{ro%3qimDsKd`Vutl7A=vqL~(4WjCJKd`d) z<9H0b8P~H}b_6YM!5y}N#clxqQ++zfHsCu4@XaIm#)&kaG5_WkeEtMGiK`xCM{(Wx zYs~+?aW8a-C-A$6a0R;3G4Khz3*S14>ajx$zIPCrEvMKGSQ}gM|3>k@1?@E2dsJ_& z@mjji8&^M(aBbszGeUa%#Xaq3`*4@1alTKqF^D@jh_fK}a4Xmhj%#s8^w}U{qSX3R zIE(*<7QB)up?35FJ>u{2BwBL|d@UW;qYr0kFQ9=i&6vdL^LEVH)Z%N=Q=|tZc{)3R$4OI5 zH=@SrH16^Q{_n@<DRDNewmn!<`TjhyRh20aDt;HlyFJ zVpk)Zd>bOV+kt+wlkH-=vAQZ?YQ6)^kN+E$qUYE>>`#zc^J(@8Zb8=N583VP0rqQH zavxwHK}E{fk&FIs>|^XRm^=Q0eVcs~Yv~^J^nH-D}x-h(LdlJ63dANO;W z2Y43G<~cl<=ka`$^cBMT`6ph)i+Kqzp39icoT0%R(UIL}Tws+5cfLV~+d@e8)Y!m-q30U_cD=AyB|A z<0E{OkMVJiOgwg;eF5C$-(XR&WBfI{lYN#?vahngv)?u=4))Pw2aX-xf1Q0+9^K=651rV1`ub~+>_6+?JAZDQ*gJdT*iqX)d6?LH z;@Ipd`=tKm{qks=l<)2r2lw*%ue%SJ&ZkZ12TkWIP3MQ_&uufadrzO*Z#yCnGx8co zrZU- z&WH3Tc094=$R}_k>R)!@RmVA{QL{{)!PlL5>e?H7>JCnRnK^E`#A2^_@B#P9*i$c_ Wde$0Gw}!KkfWr7yKiqjYWB(6gmLJ#v literal 0 HcmV?d00001 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 9ea95a429d..fcc7f4b779 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 @@ package com.airbnb.lottie.samples 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 @@ class LottieApplication : MultiDexApplication() { 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 387ba18213..c88d210430 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.os.Bundle 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.databinding.LottiefilesFragmentBinding 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 @@ import kotlinx.coroutines.launch data class LottiefilesState( val mode: LottiefilesMode = LottiefilesMode.Recent, val query: String = "" -) : MvRxState +) : MavericksState -class LottiefilesViewModel(initialState: LottiefilesState, private val api: LottiefilesApi) : MvRxViewModel(initialState) { +class LottiefilesViewModel(initialState: LottiefilesState, private val api: LottiefilesApi) : MavericksViewModel(initialState) { private var mode = initialState.mode private var query = initialState.query @@ -51,7 +52,7 @@ class LottiefilesViewModel(initialState: LottiefilesState, private val api: Lott }.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 @@ class LottiefilesViewModel(initialState: LottiefilesState, private val api: Lott fun setQuery(query: String) = setState { copy(query = query) } - companion object : MvRxViewModelFactory { + companion object : MavericksViewModelFactory { override fun create(viewModelContext: ViewModelContext, state: LottiefilesState): LottiefilesViewModel { val service = viewModelContext.app().lottiefilesService return LottiefilesViewModel(state, service) @@ -109,7 +110,7 @@ class LottiefilesDataSource( } } -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 ed279ae974..f56c3d8eae 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.RenderMode 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 com.google.android.material.snackbar.Snackbar 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 @@ class PlayerFragment : BaseMvRxFragment(R.layout.player_fragment) { 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 //noinspection StringFormatMatches @@ -157,7 +157,7 @@ class PlayerFragment : BaseMvRxFragment(R.layout.player_fragment) { } 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 @@ class PlayerFragment : BaseMvRxFragment(R.layout.player_fragment) { } 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 @@ class PlayerFragment : BaseMvRxFragment(R.layout.player_fragment) { 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 @@ class PlayerFragment : BaseMvRxFragment(R.layout.player_fragment) { } 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 @@ class PlayerFragment : BaseMvRxFragment(R.layout.player_fragment) { 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 592573e807..31a69720f3 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.LottieComposition 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 @@ data class PlayerState( val maxFrame: Int = 0, val speed: Float = 1f, val repeatCount: Int = ValueAnimator.INFINITE -) : MvRxState +) : MavericksState class PlayerViewModel( initialState: PlayerState, private val application: Application -) : MvRxViewModel(initialState) { +) : MavericksViewModel(initialState) { fun fetchAnimation(args: CompositionArgs) { val url = args.url ?: args.animationDataV2?.file ?: args.animationData?.lottieLink @@ -112,9 +112,9 @@ class PlayerViewModel( ) } - companion object : MvRxViewModelFactory { + companion object : MavericksViewModelFactory { 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 96b4f0934a..ebeb2c99d4 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 @@ class PreviewFragment : BaseEpoxyFragment() { } } } -} \ 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 8a58ccc41f..f404d7f771 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.AnimationResponseV2 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 = Uninitialized) : MvRxState +data class ShowcaseState(val response: Async = Uninitialized) : MavericksState -class ShowcaseViewModel(initialState: ShowcaseState, api: LottiefilesApi) : MvRxViewModel(initialState) { +class ShowcaseViewModel(initialState: ShowcaseState, api: LottiefilesApi) : MavericksViewModel(initialState) { init { suspend { api.getCollection() }.execute { copy(response = it) } } - companion object : MvRxViewModelFactory { + companion object : MavericksViewModelFactory { override fun create(viewModelContext: ViewModelContext, state: ShowcaseState): ShowcaseViewModel { val service = viewModelContext.app().lottiefilesService return ShowcaseViewModel(state, service) @@ -39,22 +40,28 @@ class ShowcaseViewModel(initialState: ShowcaseState, api: LottiefilesApi) : MvRx class ShowcaseFragment : BaseEpoxyFragment() { + private inline fun 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() }, ShowcaseItem(R.drawable.gilbert_animated, R.string.showcase_item_animated_text) { - it.startActivity(Intent(it, TypographyDemoActivity::class.java)) + startActivity() }, ShowcaseItem(R.drawable.gilbert_animated, R.string.showcase_item_dynamic_text) { - it.startActivity(Intent(it, DynamicTextActivity::class.java)) + startActivity() }, ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_bullseye) { - it.startActivity(Intent(it, BullseyeActivity::class.java)) + startActivity() }, ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_recycler_view) { - it.startActivity(Intent(it, WishListActivity::class.java)) - } + startActivity() + }, ) private val viewModel: ShowcaseViewModel by fragmentViewModel() @@ -82,9 +89,16 @@ class ShowcaseFragment : BaseEpoxyFragment() { 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 805cf4cd0a..8fa5469398 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.AsyncEpoxyController 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 @@ private class BaseEpoxyController( } } -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 class BaseEpoxyFragment : BaseMvRxFragment(R.layout.base_fragment) { } 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 0000000000..d5c148df10 --- /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 bcda8a88f8..0000000000 --- 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(initialState: S) : BaseMvRxViewModel(initialState, BuildConfig.DEBUG) { - /** - * This uses [Dispatchers.Main.immediate] by default to mimic [viewModelScope]. - */ - fun (suspend () -> T).execute( - dispatcher: CoroutineDispatcher = Dispatchers.Main.immediate, - reducer: S.(Async) -> 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 4fd80ba2de..e7fc7f90b0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,6 +7,9 @@ pluginManagement { 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 7cfc9f0947..ba1e5a0648 100644 --- a/snapshot-tests/build.gradle +++ b/snapshot-tests/build.gradle @@ -7,11 +7,11 @@ plugins { 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 227d7cae10..94dcf4ddea 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.robolectric=4.10.3 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 @@ version.org.jacoco..org.jacoco.ant=0.8.10 ### 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 @@ version.okhttp3=4.11.0 ## # 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 @@ version.androidx.test.uiautomator=2.2.0 ## # 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.test.core=1.5.0 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 @@ version.androidx.paging=3.1.1 ## # 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 @@ version.androidx.core=1.10.1 ## # 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 @@ version.androidx.constraintlayout=2.1.1 ## # 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 @@ version.androidx.compose.foundation=1.4.3 ## # 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 @@ version.androidx.collection=1.2.0 ## # 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 @@ version.androidx.benchmark=1.1.1 ## # 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