From ed22282d759e1729bb413e4e80ce23c019aaf758 Mon Sep 17 00:00:00 2001 From: Unity Technologies <@unity.com> Date: Wed, 8 Apr 2020 00:00:00 +0200 Subject: [PATCH] com.unity.recorder@2.2.0-preview.4 ## [2.2.0-preview.4] - 2020-04-08 ### Public API and bugfixes - Added public api's to allow loading previously saved recorder lists. - Fixed bug where the first few frames after going in play-mode were not recorded. - Fixed a bug where the texture sampling recorder that did not correctly support the physical cameras. - Fixed an issue when starting a record session from scripts. - Fixed movie recoder's default framerate value being not set in the API. Default value is now set at 30 FPS. --- CHANGELOG.md | 8 ++ Documentation~/Images/RecorderWindow.png | Bin 55799 -> 55360 bytes Documentation~/InclCaptureOptionsGameView.md | 5 +- Documentation~/RecorderGif.md | 6 - Documentation~/RecorderManage.md | 7 +- Documentation~/RecorderProperties.md | 4 +- Documentation~/RecordingPlayMode.md | 7 +- Documentation~/RecordingTimelineTrack.md | 6 +- Editor/Sources/BaseRenderTextureInput.cs | 4 +- Editor/Sources/BaseTextureRecorder.cs | 11 +- Editor/Sources/Helpers/UnityHelpers.cs | 12 ++ Editor/Sources/RecorderController.cs | 86 ++++++++------ .../RecorderControllerSettingsPreset.cs | 18 ++- Editor/Sources/RecorderWindow.cs | 66 +++++++---- .../Recorders/MovieRecorder/MovieRecorder.cs | 9 ++ .../MovieRecorder/MovieRecorderSettings.cs | 1 + .../_Inputs/Animation/AnimationInput.cs | 4 +- .../Recorders/_Inputs/Camera/CameraInput.cs | 6 +- .../_Inputs/Camera/CameraInputSettings.cs | 13 +++ .../RenderTextureSampler.cs | 1 - Editor/Sources/RecordingSession.cs | 9 +- Editor/Sources/SceneHook.cs | 22 +++- Editor/Sources/_FrameRequestComponent.cs | 105 ++++++++++++++++++ Editor/Sources/_FrameRequestComponent.cs.meta | 11 ++ Editor/Sources/_RecorderComponent.cs | 39 ++++--- Editor/Timeline/RecorderPlayableBehaviour.cs | 10 +- .../Timeline/_WaitForEndOfFrameComponent.cs | 14 +-- .../CaptureScreenShotExample.cs | 1 + .../MultipleRecordingsExample.cs | 1 + Tests/Editor/RecorderControllerTests.cs | 10 +- Tests/Runtime/RecorderControllerTests.cs | 11 +- Tests/Runtime/SceneHookTests.cs | 5 +- Tests/Runtime/TimelineRecorderTests.cs | 4 +- package.json | 7 +- 34 files changed, 377 insertions(+), 146 deletions(-) create mode 100644 Editor/Sources/_FrameRequestComponent.cs create mode 100644 Editor/Sources/_FrameRequestComponent.cs.meta diff --git a/CHANGELOG.md b/CHANGELOG.md index c191ee8..c15cb1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [2.2.0-preview.4] - 2020-04-08 +### Public API and bugfixes +- Added public api's to allow loading previously saved recorder lists. +- Fixed bug where the first few frames after going in play-mode were not recorded. +- Fixed a bug where the texture sampling recorder that did not correctly support the physical cameras. +- Fixed an issue when starting a record session from scripts. +- Fixed movie recoder's default framerate value being not set in the API. Default value is now set at 30 FPS. + ## [2.1.0-preview.1] - 2019-12-17 ### Public API and HDR recording - Added public APIs to be able to implement custom recorders. diff --git a/Documentation~/Images/RecorderWindow.png b/Documentation~/Images/RecorderWindow.png index 0101d4311e89a65f2d8d084b1005ce14788bc18f..b97f92c878d698e96bfa473ecc51ffcf424accc9 100644 GIT binary patch literal 55360 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 literal 55799 zcmbTdbzD^48}_R-L&wk|DBay4jevB6bV@fvDll|POE)OeCEeX1-K~HO-SBRn=lQ+o z&vQQKKOMKT*Iu*sTGw^m-#c7INfrY{0($Y{1;#r$DYX|b;0a#5fHOxy0zQd)-LUZD z#j6+Zq{KD6G7dA5z3_jn_N}qJd-W#QQ{^p#JPx=s1hFzF8?lNiIdZ-nYI@wtci5Vn zSMrLUK5!meBSO3Iin{g9TRCNqE1%VbOp9uoh4aft3hiq3F#)a`uCwF*m+Lq$Bwt+H zQ4+pjdr|Ir`?TxQ@MKi+ga_Xd}Z}lVehu?KW&GBCCkG&@0i;Blz?YG)b ze~cc!2R#2Jpzz|DA@AwrzWUGa;%w1I@gStI*x1l+lM9+)YzY*qVC;>P8{dI}fsQN@ zAE&#ch6+v+l%xpni$Bm6@#lXAt_jSQ>?)GvFV*o%v7n5C9%K%Tp)It{V(%e&*PiET z=l{5!{P#*6nka8mFMPAS5kaK5{9D@+P?i0d`KFTx=cpKyG2?X>Ha!dRgm>b=BMs}Zac`9x4eI| z?IDg7kJR#*`b6Mi2>S07*JUj)8`#ZPcHZk7tj4B?m3bg0fzp#deK_KZ+QeZAy3yx&^lW>W+&4-?IZ0Rf4Put53;!Uo?ALC;jXhx=}%UgNcukB>=h}o)HU4w zZN~bcS0~Z#{~%Eh{^tkF6O&S`k4LtrYTdE%418g>V3dsZed}v z-toEdbckuxW6kf1T=X6$Sx{WOHE$N%TcVneO-LB(elWXnvzOg}dvP#XWhNU%Awpum zRNp(4#B>7d#>#iy8=G%*&bM*BIoik+#d)Uj^ORMP#UM4r|7vx;pJo zPfrh)|ISyz``w;%L?BCMQ9!nFGW;$Vh=e?t`9Eh%7x)J){ku}~8WXwk<+pv9e4&}h z-sq`o#?HSqwTZF1?vC4I6O;r|KQwJOzZ(-iQ_OecwwXep%krYe6xhbD$yklZ6!J9P z=z@lYhj-?P2aTMbjf+vL7b$j56)LC}E0J^C&W>z5V|z1|45(DS+RO4OS7jei7JI<2 zH*&Cbl>Fxn4%<|lQYk6O@G^hJV-Dfh@vo=9+~MK)m7Vu_$12jULWwL+KUlvTYj`{v zfsp`;q`%+ zoIRi8>M}h!dT4cx)i?#W{UWzHGxUP#-7(l&e@;_3+eP0t{Uss69yvW|WJEEao?T;b?DA*{Em%NTC9SH#gift}Wct5}=hn$p+3tYH zifW>vHG8W6t!!R*CSBGdCFz$CeWLn4v48M*);`;8XjH};Qf-9ZTrJA{r~f`DnWB{_~otlF+9U^sAeMa(#T_JHQ>$eM(^vv(=0+eMFQj%sbJT--ud# zT1PruJW2n5KIavRVWHL+ENM;Ex&L+ScBoUgoS4m%ly`qah@QllTin%kEj~MvE!HkM z@J(;%>G4YJ&6_tfm(#EQT}3nK^rGF!Yp}_N_=xQ;y76?J*S3b$*m-g!pDwLR3zt2nRZ0AClnb73@41=-rNK_2RRe(`z z27%O>@ z|J`-{CI9-@r&k+sV@{3oMaD3qq1#^iLJ1UAefn6d5^RaEZ<0`N=7>l>9tn=FF@pVK&atkV`zuZ?`x_zKnSJLZu94e|_8ko8NMG&X{VVkN5)@uSU~DMIZ~iMit{J72Nz} zPW&%YRO!j;TUij{Vf?-@FOh+B$olDa$B|oiou3dVZ9sHDv413HH>>2?OFC*=4k~kW z;P?GVXIMdawd|@qP=!Uxiw+zMAYDV%dti(9dbpT7TXVxi{xeq*YuM_Y8}Rff9kU+I zx7u;iPZ{g5(gZETlL)KM8)6{H+FqG=+mnRR9Lt2zVWqoF$8Vjyn*Gf^6pU)>at%gZ zdxRC=2av&Td|$3~Z9H{L(}i@03uhAwtO_@hDe=3u>O9W+=v?h+?~ClB_VCz{aS~7k zrUB=Xq1OgtnSKN2=vSWZByGcRG}gu!bA~=FyCZ3M)glcyz)0ZNWMjy}Q&WkA?+$A| zTRh#LVTE9le|+>1%(Px@5f~FX7QVk~e~NBe=~{$&3G*LTc1tXJoet8S1Uy{@42+KQ z^mAJb;h%XPueLhReelecjwG;bZfOy2x!#PtzCEajPfCKC#Rwo>t@^Ni<+j0fZ+B=| z3hp#;9p&MFIG=_$%gH(0O?S+*ohv8eFhx*PS3l`QrbL(pHqA8@FD}aw_O*qlX=SnK z-_ym&i+egtb+&{qz7mPaz}_>Ba;zC19E{+q4ExYv){hxQE<_Mb$|p0PCF0%+#ZFTC zrONCpdYH*cK1k^o)6!yKH~dcaE8RFfVwKiZU7?)LlO9R%Q!^MJ(May#@x8B%z(zJj z0%SvKaV+!tcZBVP%{6$ReZTBMJ`!8pZmAxlVc8`T$1Ya%*1F8Fm4t8AD<7wbflQyw zxd$gz7{ZCkzy1jhL&e&#()e=~cTr&>@ypJ@z)rUIdsF5@+u1UXBbO)ZMV4Ku%GS`=Au&d(um& zdbN}z4u22G9vP}!38&pOtB|N5*gcGBT;ysw&OLZ9i{m!i|F-n^RX3JckNez*P{+0# zB-Rurb04aqukX`&HxiUZ#nXB1D_!@L%$Vm}efUK04!P`BTNakhxOsK17U8jkjq$A+ z2U}#vMDOfsRwx7RO|o7FA!A`~FS6*>qD&XPmsC>1j1l}p|13LqAvl<vGAVc~s{nf1~-hO)^{5Z$x3ax&vAAdq95-xpNmPo$>FfLaKxOTz>n*m1aUC zzY8#h&ml)Xy2=DG&&NaoS`eMaCtBbjPQ)sAoUf#EXn*i{)|Xdn0c;amCJ(2+(-Nk|9JE z7Jx|AsWyMt^E#(LurJ19IGLEHxYBvqbIp$*)&U>w880vGe1|I$W?kyr+jY=;yF}6P zmtl>HhpnF;3=3t2s-vT0_WRRxeSRQ;juY0VB?XxD$_Uu82$o5gY$5n!A}7C34W@J; z!^oB$f}#}4#!|?<1*Vd21T8bexsO=2mk%$5OYax-uM&edYpXu~ zV%#dUUTJbSCT4lU7i^4zLrw~>w_ie^qE`6|_kFttt2Ixd1rJ$2xo3uITZsWe z_qB_+;-MK8{)ArLM{sp3b|G{l5WQ|IluDKWJy!5^;B|E1Tl&hghEaA|QM&!X%I-Dp zh8@9Gy4m_r3U7KfHMNmsbf#_Z$F>`xJ<*n@z}&#mlV!iF6z=T%Cu=<+i1nry;?nfkQjRddlrh#U#=t6EY%xScgYvw0bxUd~K+5 z0$X@IrCLQTfPBjQuC;aCu-dyZ_W|6gPW_Roc6WO5`p@@@uPWqv%)}v*Og^d;x5`YS zKW>5vdRg@A5fC=Fx3}TmCFRS;^2#eXhs_{K#)f@(xj9d#lwsZV`pcIu)R$c_7Dj^3 z3D+9OwKj=^cW=fTsG;FM#3P`FcwI{@o9P1QADsP*w=}KH&VK| z_A!VeM83QecpVvUd{Xnti^a<3KucSm6>AD(KG7S2fUChc#9>uk&NAb$93e_L&{%f< zZzAM1nLU(lk%ZbG35ZvP^EDdF*l8#)nb2bHgAbRN$@0nAQMt1p4ADZ3Oe*O-(xnj- zF_`WLcULMC@t>-t=;DrE5-4W`3r3S}#GxUFM(NHtq;fw@NMaF3Qc0#0t#+gc{Rn}I zJ0kuFoQ=#1;9^?`=81RhhcM#fEQ1D@U2Y@(FPTO%G|+o|PHJ&mOa5axFgz1$3%{8a zil&E$M{buMuy?$V=?8WuyRLF(ufK<8RW5I-cg#>!aa1^r{c*t`Lg3U&8hrTjpjRXq zSn$Z0Q6I6qx9={GY$Nz5By}>J@f+Bvg2R&K(V#=`7ovYq#>yto1$_`m^Dl&}uPnNM zQq?)}YUO{d*LUuzWU6Gdr>u4nh=h)7KsLK)hHsdCZz!{$@FL#l!YZ(?U;8HKz2uH` z<`P6ZTZLc|4-QiO2wOxuqb@(Sy*Q zZpH&(v-*zEvdHAk+Rl&iwJuXWrsB%o(u5z(TbLEm3)#on-=M9!q8Azy$vXFsebdt_ zmocdf@a9crcMvxT*UZJQruv54Vzf^VWH5a4Tp}+w*2JOHtv;SL$AF(5JMy`KjkuYEZO(wa#Xh6pGf3%P&3@kg5PMBZ+H>4KTIjG5pM(u5Y*aL`!Y+il`V%^WkLFaxuIw; zBWD~fEouE9Z>)rYu%hwt_CWFyErg1iETNSgq^QViVJDD;R)2F)(f-w!FvJp7m6$#I zbNd}&S?!2pf zBAmxFd zysAE}n(zJ`tDTFrMuZCb~l9eI_E-PNni^)jgx5h(nnOL(|@FlFviy+$o_C- zv{y71x&O)Y4dzd$fHEN__@p@qjwYoy#j4-chkOn8`ZUOkGDUN?X(9uHRW(A!BR+1Twq)pCQN{?8&Pir5-C&T^1X(^Z4h>z>A;A7UsM{G>W4V#YSxy(obuST zzU6)Cu4Edck@zgHfi-kX%m}FX)8Bwo;R*q1GYgmARj!}fZVZk}f8*;v=5$7Y5ZM_b zFcLaDHww#DvD;f%nT;yfzy$CdC~hX^vzt$!?B87izSmW7#NZD$=V^NKaB zM~h|hDtYqyIB}4_@#)3k*qD@zA%#oo`ulO2&pi%LWZ>Bh0#Tp8z5azEciiF8P&6gx z?291UF}#0lTpl)~MwQ%$CNf>2FYyOwyD4FHK6GUt-#=P>zPF{s{vnq=(?*We{>WLL z$&G^{NFJQ&+6_`dQgTDu15YIkDiQL{?~R&<#gdkW~}(c*E=ViP~gKf5XKA0Q!iL0zPKmy zo0&~K84_LeS?w6Y0xH^Sjw&a|CV(&Q_?}Y@! zQ&{FzPIX0y1HUQh#F-M{eR#pVXC8~~r14g}IcJELL%i34V00rQi~Ma+2oo=XpCd*1 zYt~kTcHs-MUH?a7+&{CDzM1^|0gwrxTgV{jjuGL(9RG65}UGIxvdHoy8u z%6NFkc{NyK2I;y5FR#|g0W-OiKq3*nVac9$lo^Xrv1(wx8cdOm>~MX5vxwRL*Lc{q z5(N|wBIM9yCc~VuT}6k__QPFaBa1RJf{=f=dI;vegb)wqYeXYN~*;^)=_VQ7k zW?Y~cX+in41@4%q<05{p1z@2i68X+Gf@vg zeSR78WaXjQh55qAxga#C{Mt{h_7U5hsRTBOU&ZSM_D23L?gH59ai3nZQbxo)D0P*k z81;%Jv`P3XMx`Z=9}Ukn-CulPKY7{Qa9r|C8q0bSI-8pIAHFJ(TY(`yKI)(Lv;&o?!tf=1RvS0|D2%uZNw&P_LmkKR_Biw5* z)6)rXDH=<*U((YfQ;htH*L=^SZ<@6$3>zOVm!4C>IQ!v1lkO0c{fS&6cH_6DdQ9Iv zf=lEzQcdIQ94T9rnisKim+cxeA}c|13-R+sJW4+M{$;6WLYxVnFO^b$bN0m_Pvmw7 z%d7Ua&A5=uIxhfb5ip%&Pn1qp`JoQdbf{e7LR)%$+9!*_$t|YVD-7heo1ZxB zwtXF3(#pQQ4rn>)t-k0gi(vvXul3J}V~Ek%*?yPAypF3;yQAspd-PA4qJDyakHMq= z%i+8!1;lCVz?1T>wLd-jJey8Htn@?nGDAI%7Qu@Yx|PN+Eypr!vZ~0Yft(o>MZ?8~ zSJ8IMczbnBd9tGZYrff&tw=E~a4>-`9}oP@K*hQ4mcD;#qe}6WZ(A0O$phK-_1Y_ zWsfG|0a<0b6Bq_OxSPRzZhse_080FRcuc9+UqC8X+rp)eo2tr*(MlMW5+Xz5VWnyt2%9tshZI(QNz@u^`G# z8ylP5UdvD{uQu$PK>j}^`B4pp!nn6k?7Xs^w?kOjKYdp*DTL?m71*lCLCN@0Kgpr@ z?T@#^Wfn06-QL#r#ki^s4j*dm7N&%e2dnxiY!SAeldJao(@030T4T%%MYPyTvnSv9 zM+rwnmR$m|dsq+$H~8|gBm%aQl9-6^Y_8GbWsqXv5`LqE7$n~>_H=KCk0{X_nU#&F zEIjE2yLrrukIKqSV$vq5=q`AdAhB5Q1!OoQKld)y?`(i*0C6_d)<}j=HCe@3r`?~0 zfH_q==NAwkYL}>ej?iGn)vIIAdI37H#1%A(Q=nen_VTEZ(OthVnH-^n-L702AM{0+ zbR#SwVc=}Rn`UD6@P7z%794%&EJ)_mZIc+SSb=PKJyG!fpqf~gBPU1HaaH)tWxl~N z8?xYbw8#T

jJQAOKkux0G1{(LeWAEk0WLoMX@eTUW_fFL7SY?NN-)43)f{uo}IuwuLFZL zdYzcQp`|5QB$%6~50Y5SmoOvj_=zR997Cl7yxbL#dTqXZj5Rc0J{f8nnqH#nLlyCS zYD*JxuGqD`3Z#Xfu2#!Hs?`VIX$?nmPUKC-YLaE|tly@8<50iq1Fd6|(sg~jAtW~I z{HDpII7}|&!8^?O6{Mb)pw}Q1gGEa=gyX9WPW4-=Uk>0(?sawewG8nx9Z*^3+Qu!g zTL~#>6fD_`;c(TMaTSPPccEI{ksuGntHLZ!V~>S*7s!}TPeE>gw_dEbmut2d1hO<6 z3Z?s&^C^W#Gf$!`79CC3!~d}WTQ*kXS@xU43UEf;b}5FKT4R-ER-F@z(h5W@!nGdG zxL^d`@%<0LhXm(2D!L{T0{2?fjM!RWnx?>;x1xU=w-kv8!RVp}H=OyN!2#2!eT?$U zeSumuG5J85bC*VL7$=DU*n9p?xQx#Gg!C;3JUujSgph*BaFS3(kN52>C6c@1zkdCQ zAJ(;)uVzBnabs8CLg!06?Iqcbm%Z`})!Vp4(SD_ghy5c3@|wl@(DWxuZEBR1Ge0dN z4eV6q&a<0e+D61%t3WAF;?md%2tU!vf9{fueB~M5Hb+qE^4!`}OpH^L!X2`agF~&}%YQiXflhCN}ZRM^-^iV;mZ!cCPW{}eN(|n_#HBt79 zlEVE>h4aN`X{jbF@4z(|>fTG}rLpQ|QI4OLlB7ezxD zCddt^7*%%cMYeeI<^tJh7?FVRm}hWLgC6CFjobKAZejR?Y8r~?GOV3_VR!kbEBr8^ zTJWngfi=lTpLi-T%uY&z|DQ4Yr9kJ+ziZCak}%*6Vr+sU4fh(EDOe1BAY)~ut=qS|?90_U&R{LVD zhHkGJAZ+CXD}O+|j?TO$Cdl!=W*(g(zBe&J3uO%N?>gw-w#x1- zvn?SQ&ifT`>W~ZZPQWLj(q^0#y5H=i5bmd88SIL+04MLR$zTdmz|3q=D%OXXHO%%i znvSE_KdVc7*rh%KC3&g?z(Wd3j`=^ ztob+ZlCtHFCS8;}zY4f<&%+>NzAwDLvRF6%S!r$<^fW86bw`cN>;DA796{X{$Z7B$ zN#(F4A3up?YqNGCy=F_IeY9oc#>Mo$_?;;R)L2F#{71FZaK}`vW;=9Q+99B6`T=%^ z%h6?UmQj{x+Y;z?BRSPjU_rqU4@kq{)FUWF&Tblsft2^v+@7)lXj|=??-WrvCgo{G z6@8SNP6QsU$S+hm8$xiP#Vi|CfaKKQ^K}{3o1SP_qhF1dOdJCCFAR)`nSOe^l9e8$ z5sQpWG5<0=nnbJ7R9pdxg&7Eknjk7Cj>$!6Az1JFz9iE!l(E|qMpR~XQnE@T2EO}r zd5_lh#yKWBe7_cda;UEj*ghTmhW+=G)`$Pj83kY*_M1!UW$RGKC6GI}J5k^PFEgV- zz{3TOtb}xj;c9xIuo!`sIQn%o8*_vSoAi*C2-F;RY+X&q=bZ7(EEE*l+LhyX_Xnwu^-1f&9`ox=jjjrg)uSTBS=D{DA5?H?seuX0!)sO8(vGj2aF+F=x}&~ zBgJQBndK-E2*ldXvN6Q|F9>0@?+A^acv4CNB0^!O--=WbLlh3F@t01JiJs&y{fuhA zNO`%fO>e;3!zr*7PkFoTqEb4bZFC(#M^2B4{3XL-WVL3AnbLdi$SJwz`4MXl_P{5y!K()oN;x#7A&Mz9~cPLb3gF(o| zRepm5lRMs=)*LWMtJguELfp^S#G!O=sF!SesTPI7pAr7v--AHY5Jl!YXF=11uJPAZ zwkzJgPESGC(L1Nslg|A_y;QT?%8iP>#Z5A41KO-npebr-?1&bg=pT4yzZ>=Rmx2Q}D7l?BXuG~QZ;3ca+Q@Dn3G0=&J zed$I4kG)h+&24OS^WzY^uaubX)wQgjKA{65eB@?V*HgM2E}blptoT*%&GbuIIpR{^ zONW&Z)L5}_oChT1*_l!~r~Vv6Mdm*OnI(HJRFgY0dBe~*p6IxW7j)XMOoV1-V-Z{N zZr<4{aS>*5<*chP+*ph|Y+noW|Jhdm=r?MkH%?SD^iip9(pzR6w09jw;6Pf=oC}O{ zN+eSE$AqEF2NWEU7Ec}f@)q+%P>OF%n<Vev-eEykGw+k!AY;u&)wUenph z_V#)O!;J z4a(9iVdmuq!fa*GSy1faf zl`O&YNWwIV^oiJ62$z%>MF3OvE+_Am1%SRW67KGw03OO)L%vKVg-fXmYiq6l5BXpT z<(5p~aHf$TeU3Umh@Yi}SU2?owl&|(2d*hr5|3Gm?wP+=D^g15G|}{{#z$)q3kZw| zEllUX4>-=I?3SmvBBlw#+Z}zs5_zGUW<8lF;GOy5fzkY5T0nJDBf?abj{#?{?TjEx z@XD82ZYA=`b{YLn7;@*z;(Pa9^5)(!G5{z|GhfH0rUsX_2u+46w6YFj@ zD0VKpL37DZ19|yEixgU3n?UvQW~8;YQ3)t=Jt7p_Z*!$O6?yl8!oJj-mOTfOu4r0<0YSDo-kLejpA&nTT! zUpZ-{Lj%he%Yeuxc6(|6lj$8|89Tve0%Hl$r>Ht{qzaFngB4g;T?!UDUU`ecZR?w zQth7^9HF!7lMh3z>IAbR-beGt@13r@b4v_T1sIlDx!9yzhCzOt8Q}8!(>hv?B@=Z< zxXc|UBHqH_fL@^tOIp}fgM(DeTqL}ZXJ28yY+4oS%hrKldY;)xMME)Ff_+_Pso(VD zJ|$CVN3OgF`l4Qh>P8TZwb(m^t$N2!XAF{DcLTC&W6j(;i3~EQJ73r>_CU(|GLcfg z_w{KjX>w>6jxb%HKUUZrrHtmx^@S$+ zvrcvbt_}575<23>`@`XT?R4e{ahiHZX97eD()Gf2^XwxT0$k=0-EKmGSP`<8`i3=s zAtX#PB1`*0en5^m1GUaqLPE`p4-QgCpROnnb^TMdT@HRUd~IivC@qPuJiiCfzfhp? zfdoJdZ@WVm0OBfvkcD<_Xl(*-g3-YVDVJE6b=6ZvS)uPamoELvJJObqsyY zJSck4kv7;i_*v{^J4@-#aZ5r6n^Kb=H})^6*f4mN`O9S1biij%~ZjsizxNqz$)46 z(^RJF6wF==coKO=d!~^pcHZ-?XzUB*sCC-|@UIzOvy!7WfaXSN2ffp6;eBR(%A5Z- zRob%ws4$Q+kv4f8MO+-rk#<7cDIZx;M649`+E4mOpCiHi>nZ)NgNOf;G)&?I@<+`5 z)+%GUnMUWWk%u9tqRD*O^er?#Ue;`3NHq>Ny~ar@5Y&lsiEpG?W!ZEQzj+n*X8-^a ztrP86NqzkRB|F!6`{(;;`~j|pI0{2iqZ`Fs&jNr& z_X0@Ti6(bj*VvhQm6Bu@{jXRXuCaRwdr>eED=eRnvt`5p8x-BIo{$;wwWkH*%3;!V zT`B7Zxcz+3V^ON%;YdcCk1@*fU4tnGQN=~?dj(PqV~|+%O{HZ>+7|2JjSiP1jy;dN zPNTSivYoh|VU{X>s^~&I-!gql+pEq35 zq0eQt9yJ`I#ZU<6PZQoH02O6?F^gtC5Jx4mp06T5{t{6HwE3L;;AoW^Jm+>Y9rr*W z8MUq?o&Z8NGROb85#a3pcXFYU{4Hx) zgvMTn(lrc_wpIw&K%rE0eRJ>l z(_BREOASVlZMt(mzQl9!(QM^@C&dWP-c<-BU_Mi#Dr2+Z&BzU4zHS3LK&nzuZ4F_% z=1Y?ICb9kj{8C2I7d%t**QDz|O~lT9Rfu+btr2Xmo4fb*vNszKygFTFCoxUJ=~^xCA_GF^8?Vd8dM$z??ATA{8g(<~2SVHWJztftY6*ni7G-aN_prFCzQ+C< zx-94C3MptiWP5kVF^eC$1mxq65-VjYh>R-u_)4NT=6I(vL{GyPEk(1U_-!nmqPVqg zef|AgJ$TC8_UfO}FyBYcTmtk*7y*kO(ecZT^wlAu?&`Js>sD};)>Wh>z zNlc_}R89)vdf5>rjxmyqLTF*PYLkItWz5U-*1EzwiRy5}z{_Kp|EcTv*Otz{#fC?o z%lh!ghub=xN@K&%k4#(ATA4Y{p&;IX@s{yxI~3$&X3C0lss%W%n>{1*?GDZFTB-R5^HnvvT9ZIoM*MR| zAjGD`N5|7mu*@f1|N3Je`WeG0Mbn_mq%nl<#yxk2_Px7WT@nrL|r>GqRM;>vLS7TO>8rSmrxu;73AC8sdrqT5#c z6z2d2?mdC-7k-a0Lm>lCfF(<`F$w+y!a(Qtm>lT6+F$PsavtTGOU*aYsj`Us^rSm* z6}PK~!-GQtW^4B)0t#amu5S0uoG!*p-2HjNh-Y8nj9%5AbCCsC9Rt&0FrE^F$im^4 zewO=Ad=;}jv?fBAt=xJ8E#?Lb{avnc|Hi3A`bj%!)1*0|u0}VI5<2MyS}+@>o&}M77m-^CrfP{5HBWb1 zV+MgyUwh3*Oe6aChs$(`^GRV3p>AW-lVbUEY2)4Ei7FC9nz`m@Kpxma-iGi&&a zh(2dBcdDql8{t2->RyW0lsElhG&{^mN!siB$``s9d80paZ05xwLa<}ff|JJ>pQy3s z%NWV14VK>ytz)0r2SO&!ceAr-!LtEc+qvIUW*JzmsF@|htxHYI1g|XW$oeX|>a%8< z{Tsf_9>Q{mw;dU2@HYd&P&p?dAXQ1|0RQs*-xft{4Kc?RH47s4=sD{ilBI#3iB!7a zArkDG1lulAP#bryA&6MESZZA(cF$YmnD67xab<_L3xK5Jb2d9#h(XdLPwN*2xFgP0 zAG}%jb4`6V`ubFuSgo${Mab|$I+>tH+%M+_uq&ExNJ%%i--m<&%8x4F3`*zEoT?yY zZNKNZih0bTMWe)GOvovxjXz7k;(o$-1!$Ku#}eXZ1TSAqW_g9K&049l;i&$x41NGA|G{`+K*1e7 zDs$IFyq{c&wSuR%;SwCn0N@8?`|-x8y2+T9`-Zw5>@42mIT$!mw^Di#s}bkHGdV7sAaKns`?nG(z=%I*Uh-T1zb7y zZ(!3+W8XW?>B&_IIJ6H_uCM2imwZ=pJl0La!nd)1+k8=jtx2*P9OVr7%CIjc0r9^n za0{U~I_Ow6mehn2QdrUc%zbLJkO&$~=;YjlZooYX#L6y9#Hn$c@vz0uYg*Cxbf3ubr?9-zmNQ!yogZLY%$Ec{gRYq zVL7?W{5aVmuLe-?Obv|u5@8Qgg*uf5b{`XeWn((7_w-QR;5m$Z$PT5Nu9m0|N4PUK z3i@gvT?xgmLvG{7;$MH!)6=v64Ox66aWBMz?t4Vew*zq6H?LNy3uw)it3TFQ2PKAv zHNY|aU}BX*R4J&B+jC8YFy`$n$K0hKPLD;;x|7Xkfc?~X?*za9=50(GVEHH@nyoDH zkqWj9Bhv)CwStPjeW*AMcJ+96h1UQA7TvXwD~bHv8dk)aOfMo_Jjn41KnIC@cedBOkZRr?z zCJNL;>fhjd8tE+?LUzFSYflf9Kr?{4F?qk+qD^sH`2Mqm4NI7 zVD4tXpmeHCrJ>nZ!2MTIno3Jc5t-X-dse)*qAec)CjIlX83k&zXbbJU;wFEA-Xs)X zOrRhO67g0-x&k!mIv{EJgU3|cJnGr$~NKau0DX?R|A+4A)w$+x)J!~uvk0Tvfn7SHBw53aIBC2 z+ykMnn9lp7BY8NPh0BC?FT*wF#vf21#uGW>(zRMbxvylY906=Y=G~S+{@f?_pI%+T zs500B0MsJy?th&Q0V+I`KlJ&|{D1@q^we0y78lLh)(FJihFdk2;29wsdYL`Pe#ukZyKqSWLpz&W{+ zp-A}fAan!Ir-!SpoFGh2xS(F30eJ$b^gfdwCRZ#B8vZ&bJ%JJE{X?(Ls*~O3>ch@&nD9!Lc#k2yqiwo7m;NS#;n6 z5L=kp0kk<46VVBud@G!1MZI^4g!2D3061Iz(Q7U z1wyaYm}-*y+)1%C-ZT0-R+!T~drCsQ&tcTuM*3R8cXswPLK(0L>yCysIIm?8+RkpP zI47Th7@+r$xHFo9_R(jAqd(RDxl_<}Q~~Xb?m098Y{&-CxWo73xA!l*{U1XkBh2SS zrFJnuyQvr7{zH_xrqxA$LBSj7nUpc$$B20Cbl!%?sZmMosNW-mp`0I7ilGmIe7;uE z8dc?ViT4H>qEme%^{vYGT!ru-l+{!^ZAe6s@?oYJdY7KaA>jS!P)TMFSuz}7xoze} zD;=q#{|1KzXXS8-yBjSx9ER=qYU6BeOzY`sV>*Tx79UqpA^uIcz@AQek=W>0^3 z>Ujx_cdHAHO$zAE7_BiqoUbxb1_h*_TQX$O35SP=%Y^4}R#{I{tD{Q-@LG~We6EUn zerj0^jfJjWGWUBY)1v^qk-gH-cPpK(OH#+sup(tDM!2>T9ZuXwm$Y;KbAVVK6|&!WIbK`j@w z52Te%*a5Hs1!EEg-Q(~s8EMy^y>=I9(BGG30ujIt5NTQi|0J^6N1$|n| z%kFD^Z(Ph;En^TRw{i|NnT$UpGvctdT~lZI-`XS~J1tnGq)F~^L0$DG&IUPWwf6BP zH<+*QOu!tpjy1UCNoY94jCcT*RGA2(`u0LPM569{`e#jIC>-&d z(ns1p_Nj?F9v$QIX^CDie@qhY^Spmii?<7jaDPKhb z@zbn@Ve?eSL#d7dWGAWbC=jU%Zt5C*|+n)^ofRrqt<=T@Pg$J78T+_}7XAOQZ z2_dm}uI;#9i)sb%h47Vshi1*UXG$8Y7v4JT($W1A<3_F_eCl0OYQep?>Agu z6WE`ml0}uXe2^ZqiQgZSyb7L)+X0YFsrMn^F8#ci`bsa2h8RkBe@wIv+^At4W38a>K5>UcB{vXtiA zIVMic6K?=HruWJ79_nuvZmiv*ZK<#NFwj&T?AP;srVJaYPlt;)HK_#jomG=GcPCxq zqh^HU+`nQ9c#fg0l2KW|KgWGT=iaGlQ{3hsblGzzmB>B>G_Y1-^U{aCBl<47|9p#* zQT*@xmlMh9lT0?s1E*76ybJaJQ-EsByOZFxb^>bzLwPE z3nj#WI>0}8^ITiGqm~wtN+C1~eP*23z}MkFK9{P18O6xyp%E;>K9`g0J>Rwj)a08@ zVZu%)CG_M9iwioMkN>vWs&dh59*Hp`0dlT);eCUNsva&uF^#FcrLf0t57o*R=hBQT zWP+QQl>Conj((RY*GATE>3`$2RHc>f{eVg7P5YOJ@>$jbcRkA28C(MX@ccI%%>TEx z+}9A;t0ZgOf3HsjLH=)-Z{JJfl``F$#orpBf4^8B$QUvzlh1UnH@CLj;r{CZrs*vu zL!*l5Y-;|CYPb9t-tYG3pJCk7_e+GCR=WLGt8oTcIi>V}MvT#LvA1fKH4VX`MrUAP zfO^v{OjxycYWU|tdMykPXjZ&}KyM`9yF363=Ab%hPPSy}R-B}8Ee!1^G8?GjsDYc${ z=8a}NlgyLg=-gMz9PGlbYraX+ceIPL zSN^XTlGDzSdpG*++kd4Nji{4JpST2gySj7281b`)!%h#@P&grB2})LqQXQjAi~vYJ z47|WMq<;9(;Ri~mj1mqjA`pl^Z~XYjSs58Is9Xr@$4-GZjUW+wdM=p)bp=fs{_$VX z6_*3^huUeG>`B8q13{ELUk<4VfZ#fVYB+Q&c=`gu2zshy@_zxxBWT~#(_;o=VNd8s zDr`pCt8K@JcpbkNQv&Q92BiTWARBG)?|UHFrS|6U_&snF>*F5i#Y|z3UloTYfm$|{ z@aEF{Qr^dPB#>KhTXC+@W5?w#0W^j^LEo^M1|ASh(|@eF!*5$tG-mVw^(JUB^xvU) zHk2;5{{8){)4@zBiSqOuNwCifVH45>0Aoo6#ezmDf#UJ@k1sX0x<_d|j=N_XEaFI%803up%%bJmz2wYJ-<-$Z$)_txLW zy(zB%B)HekFzx4;w>a3ujCPlNj;q`D;jcfb43xfl&84Dp{l7OqS*3!4z@V3Q=>-sm zsZN|cJM+*}5Kg+U4Q2G8tD(J`#l)|Jzzm@cYi$mSRA?5Qp%cS8;<07y%O-M>Y0wLEQEt_<=*9_pyyE7*N_BH~JhvJsQ}e=9fjiG-%%wL zUbz1iJ=~!nuT1x?zJc>ncV(eWYBv74`vlI}wQqK||00UQBXgaKIB@abj)iq~A*sW0 zlW}`aM*AIQ1h6Ry@P7gWgExuek0$-Kp(7h7FsN3lC_U&LSTGchC2FDO%~!{V<;Z=P z;uk3A&k&v2^TQP;4%i1&G>eo)#2@CGeO}xjfh3@pybmpdm5~gY)ZF6TV$=zL@?Z54 zok;<3<_x~?wAxIsRoa(l9W(J$k(B7#nK|lS(qXR)a&JE#6)*McrDLOy}42H zZhC%<)f=^!#sr*Jc3W;u)g*hbv-MXLY8I&Gpo=zNp(uXsHmIz8-gLT}#!e9#BoN|- zu$3TB+v>k(x`7{ze)nbe>szKWwuf*sJ)C&?eGFy%9upc4iVSCaEMyVoN9F#Qs``(n zQo)MEqw8AYoNWh>oy3N_zZGes(sw+YjX=NGx%@=1=uJIE7`=;<(%p~@)HCVCbXnCA zOp3Ztr_CFePZEe4O=MQ}r;Z>hE5MRI)QLaQ!x`GrbCWU&&=Z`^8c6L@iNiTAaPk}A`G8bTn16o(jzX56R~s8fq#nVXNJ&St^V zq40D5XfS#H*lEGy-*vk}$N`<@Dxl^f3r3QP^4e3yKOq_B{9}_|I@L8*U3$jUEb@s4 z?MH5uO;pL1YN!n?{OdeKhV-SD9ZMgitL7C_3bMv1V@Tt3;|HWp(V=xmq%uRf{5 z)wxz|&{4|(wObO#{}%BD%O59*d0h7<6CV%G=v4PIf5`~j#w%hP`0saI3;UI^Ai_mM zx{g7b(7K7>rAIYqwV&oz5h1tqZ^!C^LoU>l|1}H}|3Dzy-%s?mU+_1q=f! zbq@8_+d@0G99B$Z!Pb=%@A$4bhw~G z)r%TGtr_7eUgz+Myw&}hDYS#MueASfu@(oQE|0dLGmLKPgJP>fV}A)tZMSfS@&pxg z+lMEX9&z8@-S|UD*ks_=YF*K~^1-@>G-D&*bY@JLO?6$>WzE!jK&6}L#UD5-_Mlr$ zYi0QV1fDQWr*MFO%yT^_Y!`yN+JEx4JXyLpp6i8-F4+_gHn!wK@6bZMCL@9E`ZY!r z{8Tp|M1X(Tj1nn9i6;u&CLDCFW^p_c5_FJc!S2xfTc@kLJEVm8-MblbTm zNDnTuiCTL)RFv6U6SwUdF^e;6&QJBQ=qD(nP`)LLe3F`stQVK{gTq%SgJnL~E^fY? zF6ZRKiy9@X5WdAI;kp>V?flyQSG}b5wX_(b=eGu+=qpVvaUx&Aeu0Nh-5 z$U=x=F`cTm>HGAlT|xZUg+fYR8eWDqjlI#A9o zQ0HRDANUx3-sPzI=hpv5_9l{SV z6%Del196Nh{SMZK6@7grp)87qJQ2Y~8qdw#a|lPlK!Hn3OaXH*_h8AO;6D6A+MgoA z0GL2_6d}Fnh@A)kge#3Z*c%hQGQ~L4ZU1!EB+%+koSu@;N=I zia#Gw@#vJ`A`j#artuY@w{U<{#r985ko*qTf+**S;LK!121fTI$dzlj|=?)xw3? zfI#Jv+HnRz@po6@Nm?NDe&Qy$bU#oh|SltQBz zq^VM+333K!Xs&98c+c1V=l>(L;AQ?zH=|IEN~gmu0ArUB;%e^<2))~8C5>vWVqOJV zn3|KUC<2CKS^*Fvv;f%n0YqpttOMgh%WKPX#9%d;lHXFop&j=>tWAG{ocR2~*P!NX1> zED?OU1$c@!+2dw=i``Gt+nLy@2)pN*ydPbJ&xY;4ltGu|4ehrJIN6YZ$2G!%?IvWCm zmo^!B>T-dfh*~w32tw_rr_0HUjC=B4QE-zJs+bM}Rbb3mONlQ>NW0+45+jo&(1aa* z`~up*n3b$nS%W|I^!^*ZrmZ)=>4$nDo?}BxwqnMJ%DP&A##v~A%g601bkA8^5PZVuRe!| zMRQ;8ZE*4BQ!vR=pIdt>Nngq|5WcT=)+CDk09`Yd|P9<-|m zSmp9ymDApONcztZ)%kCsO2B3qDODcGt-d4~3{j%{#00YncT1<9V(E04<18 zVjX1j#Yvwq&qobaChmm{2$JaN<u{Q?*(t0wjrkNbrLH<&=42rFL^b$LGI?W5L7Dry>5TF;m<$zB>|OB1-U7F#5M2l-jZ>uh>?;;0(||+B4sB3JrRgDLKihU83z! zz#OX<-XDbi`DAZNWza8gS&vC>vLmrpr^qnn*VRmoCvX{@2g~+4O}MYhsUnh=DK;nS zF&M3)Nqsl4d9KJrVm&Dl(|@fr*C?XSA_=ht`IfJZ65u$eOuZ6cbzF&#w~mThZhaQr%x!I<(`K?L@`?f8*1}(@b0*!ck==n9)6csu@x|x$`uBMg0{~Mg@p{!-to&M{eOs&5GBWxX8CTOXGDz*{fN=dKH zWb%W8gejw}rKsw?>Q948I?=*LBW9W;$!n9+UIy3Eh?xC2osHNWjBew&Wq;kJvg)Cz z7OQnp!CHXjmfmb34Zuf0}wZ3~KNbrvzIfs)&{8$O>Y@O<2EPLCOlo$%K<&+Q_V9Hy4$JnY5?1 zOYb^#d8aSGL&na$F`}_dJ}{s2vqbw^Ex{bmy%a-Y?QmA*QIutj>MPvNti7n?kt$JU?F_K`BQN#4dIAFD;Y##t%k ziF}DN%JCJmRWJMS`OU%mi-Vow+pbqQogbVUkmUw3jj*Gl)qVaSg)qQhf zVHSfdk5-WDTbhi`b{z-z~r92G-(^r^2nUEtHQr%mBVpn4k} znLTp+3U&drF%t8+BvZ5$Gm>NyZTOR3F9L$xJdq?Pp8S4*=@j0Rvq&y5JLtKZQfBSU zqgS3p*Tr>!+n>y5rO4=vY>iLhGd7i$@O{XN<0udK*h_6$=CA-vn*brdFNVXA|`P0+r<-G}qGQ+Ak^NsbwTbIYAt*sLisDix>i z?H>|sA5KtmzvNImoG2sts_e3%G*0b`wpHO zEnicGRp!D&Mu`ZQE-cV|nE1gUsO_RNJA$j-wx$(Z-XfYBd#u>F)qg^g^zVqX+~oF$Cyi4O-1k^3ev@3JL!vQNKU6BKIXQ0?V)l1+VbzO080^Tko2<;F zQNdN=HL0sqRe(H|0zSi*uLoSh_OoOuu1v^28j%?%*@yY@A$?q^JVwV?Ii_d;nm^>; zV`$6Hiaza>2=^6p>F+V>f=3 z@f3@|%aYT(QpvX#m;Y_E&(VYfBEQmY(20pGjgm)a!qBnV5|HI;Ztda|&OO#iA$|h3 ze5ksA;aLH^TnQ~gLjhz|`a7xNE_L!gY4`@lARhtr5fD(k*LWLhtS0#iCH)*O(<(|l zMjYH_dmT}4+~isDe0`)H=NU!BefTR)LX0a7_E{X}fYeHlShKEI=O!}PyFgm@{SGsb zsJH_z{r*=H31U-GDA_zg|FIqg=WdqXM1`O6qMS>2{3E^1N!g%ohiOegWqnR2xrR0p zA3&R%mT%^8L6ceq3gZdLHT{{U|Is0X?r(U^74MiL_9F;r^pvlH=3)|*BAXZ*DEOQ4 z9lBkZ#u5%8jR`6r^H`32sza0qKZLBU@Nf9kJw24-g`Xss@-n;ms{$A2qpGJWSv@9i zQPC95;E{6grqo52vcL=6U2UUje||E~?9gmAJUdpRzpR?*$u@p`wlmSf_p^#4<|gob zMY5uJOsu|w9RYh!IGtx2s?dHi|F0I{xvfB4blZ&*i%*Gc(pe)#>?&_q-!m#W3eAB> zYkh!hSXE7kvI?OX%P}jJ+FSXPwpxP~TZ=BQbfGy2BpSU99y{ABHnL2QBZHW#3s5d} zDXYMf>~E+9R&6$Q+=QhY^lyaiscH@1vAroQzu2m{g2;)a zXEBLHK&F%JWLn0gU9Ger=om`E{G543Pte7uKbO$5Kgn4QYeBt;w5uKGn0Zc? zfUo?jp*2`n1DZKN@866fjp7)XD zs8j&}0td~I`7&L=#(effFNs&9Bi8=MSLod57bs25nB=?2o8NXvQn?0mjNxk|!q;!y zCb^QcD^;BL9OfD3N2pqz?Hjhtp5&izh5c+&1;E4y3M~};j58zd52<-LP z=NH28qST7^hBm8Nz4K--y}98>hu;%ka#&J>tXs^|>-kg>SB;`zgEoLIgzVxGF4I0| zzH(8zPs?|y1|RCh{plUTG%mT^gKlbLy(lWal0QjHM#H5wD=EYzbCs8 z!b@PExdrjfV`D(B8El|MqInxJpTKHoc~T^WFPMRjv#|YM7R@Tpa7pqh{#LC z6iXaQ!W=lkuqMmFX%3$*S1UV2w3M1hkHT%qurgmr;@nE>Oik0+2Sz{KE)40XFz|FR zVx&S9eorGCotbTxE0L^B36*)>N9y^y=YT*Peldg9)cI2J0r`aiE@=WzEEknc<$rYw zF4KKI!e@Gq#^u8)qR%bOCvN|DZKSb@A5rKl{KspBj{p7%hmsBJ|8nU6_aCyaI`i&3 z>RZw2UfKhthMz`_r$EW8UsSxsWyIbw(=<@oN@bWVTU@mAFL{j=0ef@ZR`uJd>IxxC zGje=@ifVv7oOo9*Hi^=bmRdEkk6kW*aPR)?!9G2nc$a!2+tu43i-5nzXzfY-_R>V9 zSJe-N={JUx;Ei)=APi`|xN++PCdX|59o<=0pdS33-x~?6Sdwt=2 zRGs?W=3AHQhO1E$+u%F@->>bb#k(S@crtI>@8@~=ivEs%bRK}QdFsJo<>~kDc`YXM z4p&T6bGcvdZn*P)b9m0bX6h=P{!)s4srmwQt>1?5`ybgA&$oUI7hl&H*WovOmfxRL zL-fQ)?_f#%R4D3is^bId3)v?rur7~0{jYGv;V%*p%HsgCm zz7KN>ztQ?=md~<3-K{?hc`KQ;H)o9e_cf+#pGQ4+{L$yWeWHfxcQ(l(TyAA0@$tY} z_$Wfr4mKdu-hY=W#~h#Eu?Tx}Mb(fv&r|2XHMBB?oQ@Ft&W0MDIwexusUuO_sZ~8{ z^nt$yo9GKCnhpBh{n~ave!VEQDEjJd9n)zKw2kRB!O8@AV_g`tNzX@P!+dV-QkU9;rFAP#+Ux6gfN%CaE5&(2Fi35;PeK@=IAGV*gArWZbHvz)y3 zZZfj2k4PI5HdVgN|+&tQzG{5s~{C@34+1=AN0}s*m*uv>HB3|8DRngLdDC&Q=m@FaH zl^3B8ymqpHv9yhHVc|LevJ?9@6`t)oI`zMDYHin44R<%}&g{n?8aA0^G8lafEH!SN zdaCkw7EZTk-Nc-xh9ZuYd}+e(D&(sm?}yckPgUx`j+#t&R($ZU2yv&umQlPqH@#N3 z&P7$n{>p&W=V=DV(bm&`DGt7A55j5b#kHzqjwwaQIJGxpbzbkwSN^B_!2HU`3!s(t z#o4hM8R=_EO7+sGd=lAOHinnSWPgpy)tTPw7qqPL4yOMpRg*X=zjk?dpv17bzdwoR zdToZq<_}xAX&)iSsG5xJfqs;EoCop!cpQzEuQEqFk(8fwPOVObc>GNC|2Ar$sUGzZ zsMUX5+>GKUo<0v;;nq8DS<`QQ@PROmLryiIjT*KOxpT6qge+>MkL8^Dm3dLPU0nbJ z+ks^EH5ui|*5*N}!_qs`(YH5OUJ~2EN|S$m_Lts8?<$Y+-VL9nQx5xe**K0g4~vVp zGjum?&fmkHpt)6b-?6bb&uEEVx^-J4#(pxfTPOP-+VFwW{r5)L zob#FPPbo987tf@qErAvw^A73>hR+~E5jp6j3HoaCw|B`*4yify1V?+wjiNk^7|a!g z?UL-ojS|wfUvx2E_b-U?^UaIGXrboTnpj&K$eMdo>p=aRrmy~FPJ4X1urX|^IGLxk z{Y&q}ipVTgZ92)M{8MF)|5Q*GcWB9|YSkVCQQHeVKfSO()p?cK>x)BpJEm4ed2}lt z$#qI!^Q2+-y>-jRp+HmZSglQ4c1QIOU0e^CrmtH*c#2Whd~?#HrwjLo`?M;@nPT`w zAo9PB&V`(oiYlHV7rig%#BDK6`1io4v7C*cV|m&VJnjJs4OGk&a@DAPT+V^%si{V} ziHu>Rdud!D0|D=VIBj4BtMCV7tLa+13KhDs=}f7{?8y z<}s$a(Q|{I3w5BeJ($$^Y~XEK*bwvP|i!#n$~DSOdM_oG)2Z1 z9PN@-ML)^;C4xY*#Qo3pzV5H+5;%J-?>_VB(0(z%CZW-@1wi?sj0p{V=z7N ze{EA`_3&yM^;H-CU$>u;S$-gi2t;6_KKtL_+mR3Mc=x}#pHz|g|IRps#WlQtk~Jo| zcM0YH`@=VR^ic_|g~<2+e!y(biWjw}DyjEMJscO-FT3x*`36d`j{d!O|38N%J6G=_ z&~D@3DVWhw8SYt}|NZZY39P&*ZSfOYrboL_P9RnOg`F;NQYfQNUet+;|BDP*`93_5 z+gpNuy%Khbb#H=%us#^Ok<6*l(f>-|`tNLy%?Z>04qX03O?bvUkL#Q!4n1X12e({p z@E46zgF6z-@v@75^10Ox)o&a6$K(rQIzevU=f0e(AndGydno52hPTLdrgQt=(;~(c41ZRs$)F zf;JH-DKVJpt>9bvCDkDNr2Cdo0wzDG@fb7V=4GIqP_+H2utB&W$5}m0x|zu?0-eu?Q!jr2&VArB>_G{~UyHJ>0~g>s;R1IE zTFu~O{wLyg#O<k5VO;z69#zXCwvWZ**eoS4LmXItd40aC*a2qf)Dnc=8 z2XcY?bHIQ6+R1r+%gO*Uv1h_LK4NIdaI^y}^=km|X?{CHW)BiqPKsZGIvQx;@6Rq{ z8HBM&Tg6QfIdB9qp`cZM@)QN8&xs;79oKKu2w5n}X~^t+fqr()C>mxfa2C@w!E!qS z75xOTY#pnUEwQ06-l)T&euc^hbTRfT{mJ(aP~xa8-~EUm@QW?i!V)Pa*LQ6y|Ok?PvM$yf258@dkdcf9dSCAfV*l1u4liV4R!70ig62`&oZa zQNZX7)N6(iw*c%YET7*)#!ak}j=V8jcMk?{ZA+2(Nf}pnac&Al1jeQ@FMJ`5}kly=Fmdnc}-k zu-k7pmw}V4CJ+PX&)>GFO;}#;$qzBi@?1I;BdPd)iL}|4H9v)5#RCOJ*}+!=#$PK& zJRupk3zs`rt=#r+Jf%Z z(}%^=OW2E!wVlEzv(PachsC3H5sC0O55aVcmPV$x_7A%5()=Z7f4J+8DCmHs3@hkl z%fExFZF7c{symYMptieHgsoa7T6|k^TgtntnC=WZ$RVLX1^h0gzB z(si}&ON^ei%i$Lr|7*AHtO5Q}9d|aZ9)STmBPKTk)YEa1BiKS_UAQ9EHYSH}utLRS zB8_yuZOal%E%!){&V$y@9Ro)IQ=kKs1!99(aZ?I%BvG-)=mxcRKhGj-r3aQ)MEAPL z{j%s?dF7^!t}t`dQGw>NQcd34nE~YoYegfartz;xPwO+>E$@+N$C2f^bJBdX&2!x~ z?(6$bS@CPADRixv%xvRKd4@I5RzAJ3BPYF%Kdq2=D{gk#MBnH(uGK)>Uib`gGx9v8 znnB#3ghX<~a~o?bd?A^5?lJ9ajkZu#oq4y!t}DirkOg z@WwqXl?}JUYz!IF+GoKHTXd8T|C{9G__e4@>hqlB@lU12*{9;8kIc7c>ZOkdZw()= z;kjF1ITmNoo=A0LA2kh8#N2hL04=m%y@ku;=tHT_48!O@jV>)9Qz>g}T?`t7Fq*Uy(Qe=E!hMTzk+4(vh_R zW=6ZY7A1D^)l~Du+JP45$yU(i%~mNqk`SR2XtUmUyJ)is65HLMo&>v`dGgg;SiQ2M zXw&(}skZF|*DBh?0h+55=p>*w=TC7Z_lmL>qe^Jg>F<2tKqqY( zdZ-zv=bv4<-O78n6@3(TAC|`#)A|x)Yd+Z73vZI$_0c?JIr$MhL?>rGFGkd+DbIm7 zY@WI1DWxZ!NNol$qOkwD=LHS7&kT$?3`3^5+-NM~QW} zm6jgqGr&2Tsv={{zh!r(s0J&ML{f^!paTzU$Z+l#a9Mw@9WFxPCssI%#hGQE2h zy|oq4Xq_Iym=MF^Osi17EL`N@j+^&v`bWM{%gSR(saGHd=>_7?Pxrl+^sAk6v`e(O zJ|`l>6TaJy=>?vjnv+qX718q5?lkRMk7&ldVi9cHEs4KH#)TQKFmRQ03PYjnnX=yX zV<`tuGu%A|rzLsA>nz*`ENU^<(*(Fffv$>LPM7VcSR_w7!s3&^)v_(pA6S<>EEuACmirp_^$9-+_>f~CN@{R`* zAy{&hVwAL#DdE@ahAKi4dOw$`%R9yQLy@~Mhe zj4|PuX(mEgZWfCv9m1nRTL;s22C6!P`wu8ESReIa?ohzezWmzQ_a~WKdw=2?liU%) z+Wg?Qi&-#&Ae;p8#6GLMZJoFyb%#hbTF zSL~GEy}wJ;l*e`7{;WhXmd1414V#!|*LeHJLRy4!!-^J(acFAW#Y=q+(=%lZGbi#~ za+>RP_0F1D*tntmcQ1z+Bz(P$2=(!S7VfSU$KCEutmbftipzyL2CqU$Kdk z(|s&wEr5=VWtwacqgjr|7`eMA$X@gTYzQ`)*EhakP_zvMg^7zv9rC)yksHtyRVqHS zID~^N^hmant@%|rE?EOIOmo$^qMX^HBOA)Cf%9@n6fK#sfsirN3MK0>^o|%w8c|EyX9vK&z zRzc+RGYXy@* z$@j00&Az&-5{rFDW26=P3RuF>`iI^}8gn#%?82~n zz05XA!W6%fVua*Jo1=^iGkS`=H;E}#hxr9MtT!}2BZZ!NK3K0|;l&F?PbyxqjJmPt zk%LfH~1pv71PGv z@3b#$78H-nMm}>7Dr_?>cj?AgJ5=R~Mn@wdF}O<`a*bxSR_#7cZpTsmAOfefbBnR< zK?0+Ir0}<4#Tm@{YfZeP-lm{Cn!1}1UMn3@RA@0R(l@Bflw-_k(O-atB$6h#_rcA% zGQ@IdaD)9Mk9Df{UuTEQrm3A%X`nTqkb29fc5AA6T8b1G_Zg;nUzuLZ%nvnB?p=WW zLpfOAx0?qm24wokVHuG^4_6WBk)l3Q9q9_R7{^R&LdR8%@N8W1$MSBuD=u9Gz#JK2 zBR?T^h?TFVsO%76zRf@m{-zW5tRu~NnB{x!oLCsJHC^i^s&T1x&BOg3+nWphn9$v~ z>ckMzxXgxIn&&1`Z%IatSmq<4gg@WkJ=JoS_Ui%Cpg;$W`wP>@_zuZ0AIv354qkuJ zQ`-JP+bK$3s}^3aYC!T{*D0%GC5T0-&uXID`E8ln^LI(V9L9$-YM)Qn-mV3tm-%Br zMf(B65(|rVJCfv#Sdx;a^NSqDXvAi=ph{k3^5WgTh5Wav{h@oxgB?K%FBzzF0ru5t zL16u*yZPvYuUA>9#o0do`VVEiQ#5Er_o0T8!lcXDD7CveeVCNLjsZ(d7 zrbrX9SFXAg$h;~^74ewk-^j-B8MzO5`yIDr9I)6-4|?OzHQ%|}NSw?EcfNymy)R>g zi^2fIXxZoyfe)Gj^HX}Zkmm3iq6Nih4XWs|>k%e)`I|(eta;IAk%1UX$&Xoh4QijQ zpxk78I0E)Azi58zB%8a4EZ<2akbV7IX)$Q763#(sRqeb}#4@{e+476{CCZ{^NQGu} z)3Ne+bccawnTVx-NgL)NE~7NO%+0%qUAjF(`2+r&8JxjN3U5g2uTF7o-7)Y{ z@LWa~miuMiJL;BRqWlkG5DSu%pJl3 z-e^ntKt5oUm-_hS#o07;gx7?hAP-=4-z2nBt6A6XJktYy(GE@~(*a8nAiH+WvvuDH zzJ!L=i}Mu;vsJ_#DUc7Qhuc4pNd zH5z1>cvKVC{R%>d2h7KiC%=X2tLaV)GTf*9#fYa!dRdTtUWrHmHhgmi1muG5rOLt- zv(m@)F12=(Lex~OwaqYoC{s_T=n>n_-qK%Gc7abEYQPZ`Ugfak{*ixk(;T32;m9l(cA18=jGgXW0`(#8}!a_GP7nqh>+tOE44W2|MJw}vInQ5AHV2Tbv6 zxc6=mKa|hj9TN6*VEXRy2h-)ypmK2e7ok)|()?dR4P6S}ui1BT0LC2md`=e|g`h!e z>L+dqeqcg40+-jB-w4cxYJ_>Qe#XpVT60BD8f$AD=Vn2DwK9xywV{xSrSWYje5>1o zan5RdmSRNgy242Tc2JO5K$34lQd=!_h7HueL+KpKK`i?NCR6Tg0D(D*!U`If6CX60 zBip?pLqYZoqO7)H@ZE2G?drfQl9ZBh>ykOV7f@F&Fy5RZWQ+mj)qtwxo}BR;`^O$X zo@bV*_71><-Wuh+y$j~3Dd^|chU-8ZJOw6;ytyagx0T4KB(*|F76i}zn*vR{2fTj& z`p(a20-h0f=;)^d&@g7&(nOtepTL9*hg4Gh@9$LTUVOnJF+kuF2$)9W;1MK{T1(JC zvm-L+d+VW|pz;>9Y&%;Cf-T_B8eSdBuwCkn`v{45pI^0~IDXBGsDT{+4|R+9C;(%o z&<~Os?LhO~@OlOp+LQBOBz@AkK8>d z|M@dyj>O!5fBBO`9}AH~)1HD4X!J{!lex#BS+$)g&*AvW%nBinUc^}ldXi!<060!- z*6Lk*XszlLDR*!>h}I8L6Ca+~-5^1oN`JR(ZrSnNA$im8%11(Fw*Mu->08eP93Sg4=y?x)I>HKH= zgR6u*#r7jS(S6}-7Pk|mOgLd#myOlh8v>n`aqJ>s+#)&IB6z|%5Pot+lB`;yN3z2S zHJ!yCMZtsluc0^aXh8f>lts|`Rrp*qVpvq_*VSvccjK>nqh9b0$#G^9B6tl5(uS%B zBk?7%Jwu9h%N$Vc4Bdh!iQr-*z)LVqq7ufZ{JFIXU*^EJ->pdvw-;co(*p~bYp`u9 z3Kf7lBQ5$l|A*%$#)O0fmu2vHrbniKi z!57$=_R*G}3d||2+(;$571*5aVM4QWkN$=vEiWYKqECkiP)3*%^llS z?5z5|>A`}9J5iXSQjA?-Q*6BF4{wr`-8;A?vm2i!qleXZg-Y})Iy!BHIsm_0!WLpo z4AAj%8_ds?8a@;(Lp3GGuo<6K4+5dROW1azU~*+VW8(-yJXyEU&?3J0kI3M#smQwR zws&gPJo|2;C~KqIaYysg-_3V-`W1`DaVFh%sEF+41^=$o_ygMQWl{mbO}wR^yITwr^Zo(Nm1KFvAt&3UC&SGxfgs0Nh-;Cc&$lv>2~5>17GEO z?k!#-*bZ+TT0S6V5%4FhD7h^sw}?13ix%&ao3F^`rs$zx(2(i43k)h_xz{# z*#)Sm%40bf!qpq6B4sj#UjopmPc#lZbYzDw0sF8(#S^SKkQK|NlHdQqYR7U}=Z>t^ zxDiB8keK^g)l6jk9J2Rz<2h0k<-jr_S#n$0i~oGJn%Li#tZI~?7ik5#Ia$BcV}Xii zw-5ANvNvs{*Bt4QGYcvpP8ht18|VHyC!^<_`;wK{vkspr@g?W?ui+0k*x$Um-5jg+ z6GpJSZ~f+#^GGI45G(q2(=~(zm5Xn9FR@(677uy26a-Qw)xgN&;+zuF}xT3*?o*qoJ}PSn7D3da=)CO&cL3H0<3EnBtI zGjtuz&SzU6*M82mY88Do9j(OozqQY>YXBi0LuGV9Xv3tRegop!>Vu!EI*YNGXhqzL zvthRUa#sovP3iQyoc_r=I8R zmmXEIl_U_W$(hOUt6Mv0SGR`fqjU+4n8yBR84dJ^yep=Gy}2Ms@a=)}+GmqbLAg1B z#dj)QMmMCC1F1xGOeodGymK#vqbZe(X@NF@gxG{4u~nvyJ~_XTJ~@-yjCp4lAUw8> zKHM9v@sZ(Tc;?4l(k(jxrQEp6Iz?%H<$Ps*VsvWaeWZKt82@ESqjPh6? zYhL9}5h^qLD?=vvshIE@HJ<+f!1WF4TKTLA)9n%gh2c*JHL+qN-3Uis|JZtMz92eb z)kIcRp8btAQb0$(H?FVzf@>p;gIS9VkAaX=qA$V^7?Y>-wE1gVz5&h@pVi5k%K~$* z5BK=1!mqX6nF4$&wQAz$XRux0?Rd9_Nze2A6ATSnbROl4;0<;5>_28oGcu(%Bx zEv})!e-(q)Keap#$NUzszYy)^|gZMBIG=_o8PaAbqdH1Dg_H>NMT- zY-wT2+h7f!559R*8r``kTDkv*pB#O$owNcx;*pdp>Pv*nVQK_!^@pE-Nd!deMj)L8 zKV!FiicW|(1P}ODEA#8{+RfB`c{=>s9M+6m#mMsd+tKse))RtUd0b>5tvf_hN7o>A zn)O<~CsN_e$T0W{M7>k{mZXzam^){~piTzwlGpgLZZ%gVP z^5rk+nGL`bWCt~p^aaS7cS-Nl)=-#|;$KbCP(s11ERn)CU%ME=&SjC0VUD_LB}~sx zz2tlD(g+I?Pi_~4)mnfrUgvP|MVwZbn`&o>@j z2%i5PZarU=+V;HqC`b>FL4OZYB`Z*M$z4=v@5FvUAR}+E1|wb*jwcb6@)i)GRg03! z6l=dvYbG-wxj8z^i#KRrViFc8QeHN)Z%_FNzYJR)=_^y@~#6fb{ zom$_xLPC9duyR0#jH2SNj!fpx7h5MXv-thyj?Rr2{%S@uCK}-V$Y5$%J=UNA?5btZt^1)-_a!`V4^|)LGlFY(Gn|>|$GSG|6r^AJ5i_ zWm)ewl64s7DJ5_|z$MKxc|R!~n9!GJsAp15{_1*ocywf>y8GtLPbsCa@!}P!O&d0O z@@Kz+YM2-|_M;SzyY2>&WwkI<2^uSdiSy`=2Z2bZrfX=P)QAvy9faBxNT;Q;f&_0q zp8nFrl>>M+|KQ7xW9#32AtYum?&07JTT9kxk;v)ornBir&r}08-v0iyf?mwJ$#y-a z*T)CQl?IMiYvD*Lfz&^WS5 zWLb~jPST4D8;OCgYxIChKjpyGD4rS@MGb~A7YMt2B=Jf>5j{IuO327aST}Q-KHK%U z57@AO5`{2dM<;FXr0}qPDvw1X-i;9-b}JX%^xg!q`7O*3%#4xYaTy@o+2?ZQM4wOq z>Qho65JzbG5A;X&(7^mu<|Yoo;T0fbT-Hio?3ASs&e$#73<%qg^;_$&e;LpC>vOh9 z_-;uOv7=EQZ?Eii-4pPhE_+eu5c@MBC+2qT3Y@Sq*KrJ!l;0mW)c8Be z670@YvIWUtFJja=-dv}3DI1US#PW;o`eP2uWyXb5VPcQMkhyIJUCGAL{Yx{}_~S7c z(8Y=oXdj=Zz{xW`|AcarpnVS@`6*a3n~NdlYfb2!W26R~ok!hnqgB_D^Oem|-ZYpj z_}Upu8&$hPa{u#6zj8H~4Mc>y3JdAL9_D!9G1<-pbi>{?-Sgrjd*N-&T`J+87#i(T z?FURNy$Ct1PBc~_+Wv}rayQs-3aO6lx+_QEbY|2BmSuf%b5G&qS1h~8h zAkO-Sg--zvO3uEAuXAWe`l0(cT}cUK^wn+VB+Gj7iVDe+lDIJCJvlB}&J@2t`If4h z3GS_CFnnFoFV`#J^6p@EJOzouuVHhuKcqa%uhE!tJc)4YS28-9_@6YKc#Pe@>b>GM zTXkJ>wB!K?S;n2iv8ot#$2-HinV)gl{yv;YlTV44})IzrT>U`Q*j*Wr{t0RB2kK@cEKr3Nvbq^bVWNEeOEdU%VAGReeq5J zW6hN&@pku5PjG+q!q%L2C?fD-#LLrk9giT}Dq8J|b~^fc{WHc#E+TFcT68yTq{zO+ zLZFRH&%SOp4#Wsy9eR~EXBIV(&H%H zH6ln+`&nA9^}*&@p1UO10!hzwQ3J=wLic0HJ*@CPBCNPF;w9o^E}dJ4f?dX9`1>3INXK7@(m{ESYo56G=+o zhK(hLfd=Ap@5)7T;B~w*92{$@gG#O;hun$*$-F)i$x()EuVV`H+ zr|plxt=VYxT5xQHDEBaaOpJ`E`!`;XT%_Ae{iu$W;>1U-*_4?GWK_QDek2lmfc(}->2U^aG^Uv z?J@0Y`j4V5600EqUzhmI7i#k#qKa-LF3OA;Id@srUZzI(re_|aV2c8Bs(znbXwOW? zG2+nGx9?22dz+SPB)+}>>nYv&^)_en%6^|XbNpF9+#B9|apJ!U2`?0EGFZOjac#=f zQ7x!)!D||bc^v(J+WX3|sQ&NU5dlf*mKF&K6%Z9rQc5Z54(U?5K|)XoQN$z#MH)dm zln#*;grP<0l+L?9e!u_w{GNO7%NuX*3m=#Phcjo+*|GLoYu9;9d6(gPUxdDV$>-GR z{1dEe*5tI5G#p72flo3ORll+j4<|N!cyfc5n0I8Ln@zQ7{Oa?w)mJ56JQx^8=xe8} za0Zj-zvwHEA!yR$=-9;W8R1pYPW5R-6HG`6Noq&7d`THdoSpi*8py^PdRn=kYwGFL zZHqnFU%aKrY(QU2Uo(|Maj4{xzAmFkjx`(CjCpQ^`>yaB<(m(TiuB~8BocJeqXfsZ z@G}~FRSc$EYJOa8mnZ7xnC9pay9^GiL@RbOtWUI7p4iQSoW#A9$)*_x!g{5flJO)T9j_` zMfRBR*R6B2#Y-$gH(iYXs}-5uC62?udXHYW9|Q+q{G{SYT=~-Ot*TzNxK11~b#Z3D z{`kEDA^~d-Ig^NU&Bbf61b%6JT99h%e}@ZFImnSF4Mh>`4J(^bEpBN_OJ_vYg%kN` zM|ZrwD1XzHczoi1v&``o#DC_^+@+3ZRNy!A(4I>qlKsBQC1(_8EKAZrRsIft7QCM9 z=fxaXUi9ssFVk+17hIH7K#VC>sgIYF<-#w_OsNsXMLt%Oeqm|0|{59@2%=Sb$rCOT1=ujr$(D%EtM?VpK3kq!wEN5Ij*i`{;8Iu>sO z_Gtcn$iWFLG-$8pafm2@f6^bOhFm+s$XnHUK*@o=S(Mf!@9V$OJsy%Y<_JXGm9y_&*Zpp+1O1N^AmyGQWjP~o0I13kY}i-;%&zkz@dG~}*naE@5YBFq z!c-t|AI(?;w^M^`LxEk@pMNHd+~>`UvCmaya4sxCpg{;6_sM3M#m5r3xyFFqS6SR$ z;GNmnCL5MG-VL1r^n3kJv#k$EU~<7h$-JE??lk}fK|S3guI&Pz(8?H;yZ&;Wilh@X zvIVEv0+6GGbx=KM2P;$yMC*V=z@F!~3?E=zq`uz5aJjJczr-%8v#>n)Wyg!FBYt9> z-9YjYf2S{;t)40qRzBf4S~UpFrs-Y^0wCRy8J>}(KCAN;acyuNSU@JgiR^hxGgO`% zWGFw&0qf+$AfDmZ!^aWw4pcfUqRD}4!kz8_a6tV5?s#UfHb1@jsEX?Q&*wb+5QN&RavY*;iFi7ChEIBV=ijnr#LhUxXL8Q z{ew4wyR)7@%p-Qz6`R{Ukri^b!KbVPK$I`qcBK?p(hWAF8Wj86ivl`gR@B92;0oig z)4>s!d^4`l>olo;5-=xbYv%U*Ya!wx)yG+w!*S`r0$DL@Xwnmkn}FN52+|nOLi0VD zDmcjJBCJBh?2HK3k8r?s#Flgn5I0cjAJ9u4$0xa?)&$_5yGo=)`-}6I;8o!335c}; za1@;;8y>W(hO=0OHG`AKue6Xo4}{yoI)ifQL$Ea2kz^zc!^3{fJk~1d1p|djdT$7u zM!{%LHDuJH0wG+A0B-ng(qxL8y5E1(x zdHdMN89lDl0PkfnBXZo-WH9v_qWI*11vI*9`pIZx@rw&q54Uct0b9kTM{oDqITkM~KL?vGeL7|DIC8n)tsnUn5? zbspp3Jdud8cxzgJ5x_*I0Hbzan^yRIK@ z?+Eq`d={d*D=m*Ohi9T5ZZGt))rcqX>F__lFc3N)_i;-rvI^6*gBA}UDO7|2yC9Dq zxq7-Hh1%h}k6MqzqPs`)jK#%)tZI3+9`=d+fSJ_HXagpUD7g<;=DM^x+v7Cmd6@d- zZX&m$+w9Q$K-785#1Ki?enz7Z40qIWke$Ur{n!mzqlOD4SL!UlEGCKSOGNE)%ljtZ zZ10n_&aMx?!~5<|t_#X6gPC~pat4|070t&hUjy!Y6Xf<#4GR;vDTi|8Fp1cXw@>`y zJc`_V^!RO`851}zlmep8Ezl^^AYmf4mLwyuaNR7x^#a_t;@6g70A@3zhtfe@V9#P< z$`%>Ly%#AxM0b1j7e9Pf41x;Esb8pedkdeG$pE|$7XXSnX?T(AwCSyh`$K!u!y@?Y zKr8({q47OicgyIcuPV?;XKuG91L)%x`mo@PMKQefgMvkD&26nPLhYL^N85AR`NQXK z(Z{zuA`gtT^@f-^(#0+GV1=8HCp;vR+uV15d({)7xgjJ9NiFj8s;(DlUiGBG+$Yc_ z{EROZBM6qZEXZqKP!PmTmI1%iL~Ro8_|iwjn+&sh6pDX8@+)h(OWh-tXP%D*+GH_t z?ei!`7Sl`8tTR42$3RSyF8{zFilmAcQ#jc>GqOj;YFCx64Hh~;Dm`+d4! zV7lN|SacdenTV^=a}3T$z_Lf{!$p_NW8$A+ahn5@u3oEXXEoexh4^% zYjIVWuk>*cxkD_KP>h~(>GcpJ0-0zFrGCiXaeL4)n~Fr%oVe;kxKK?O=cT?4Q;AI9+CJ{Y=v%*pTCwAIQ z!q1rtsqdx;{=2vu3PcX+&v=OQHw0En)urhWTs>jrZ2&v;gguU-U4RZ?BZXMKj!ER* zXrI|4WGvFxhLB(OU{GB5&PEg@LZvW`H2_~9%h5GR{<(lAT@2V=KljrNsPGrT?(wyV z-IJpcs4$o$ybGA!yQIyr6riA&2VXPFFrBAseg&76kPAeg0O&Z*dRu5^r_1|?;+>6 zzb`Z{sr6bm5mlJrH!S&DP1NyPtQ5SJeuUr=`|m>UYj0fPe%IwQgUy?XUc@>FT}JWG z81Zi?8*kBe{hol`MiIvakPdh*uVhlF3O1ec8I5$gwS3zv$f-+X*%)7!X^- zh(4Fe35o60WW%(;MdA13CqTp3hw>Z&^no{k6kY(T!FJ%9-bNh#t!<)Xzyn_ZMnzAw zC9dsf5TZ%$FQMt2r#DC(u)OczOg068oH~FJQ9}d`P&5YDvNtz@ev9PvdjLV?K!A}~uckQbkD7qWF|x2ov}+=;Rux=c zkZX+}@Bwd0vZ~y@X)%~g&f)OlqEi+ri@$aQ*&j+$pw>`gqG-dU?b%MwTo%yEd@Snt zqf2EnyeCbb_^d&3<|ij?zn_wBj$T|_KZop91<(}ui^JTxXgPw#BuYApwIQ55xI16a{&uuw^23@XS^0R|i# z=D>cCT0T>q6?r0xEk$=7KH;rx2MIzXJ&5q{%hGOdYy{U;`qjGe-0@?KO5SW&whI=E zQ*53Qi9@;X%Bb>C?zrqOf({FkK~GX~*B`|Ea#ck1Uja2=^HjnThkFLWl*T91*j~;s zrc0tEk@mE`n+rvZ7VJSaedYG~QOI-(v~%Z^)$HZORbBaIlsY%4WNx!u0om`o3+Tbu zoL0Tkzs1N&L0CSG@#ZIx_Wjc#HiF?O--S7y=P@bAOZN#(h!Qv*iPU7;uJ%8|0K>B<-2&HMmm^13Nbwy0G`w9eg*a4k^px&5s#RVj1SsrOFn6ph%nGy6=%1+tE_E0!;+ zUsA1m>vJq#?wuZHhtzwJAn_6PHwE!iprL2#ES4nkd&llQ z4+FagBd}lOHPf$1%b~NdY_?%-MI|d;qwkKz<%f203E1{x?YIA z6NxRu|D>yD4wv~?P57Ts%YW1suKy%$EjcBpb$fPDH)ayhbcS{)|JCPvlGB_xbthOm zQ=Q$g2?Y5-UbNIxclP}AyW{Rz!GEQ9Uv9B$zTUZ>yg z?0bOIWG;OH?$`cN@sD!1_o#*JhqXtDw`2_DxDwDGi1Y&r6~}^J{lmw=17AOYEEdA3 zR13hN!~hiMi@-bk1e3*#l2_#CS0O13!ae>(;0j3BSW_^1;7yLYea7(M;1!5I6kzok_H4!F)-TBx7PS%uRY(Bp`sbZQ(Xi1w`cb%Ok;g5 z7#9YMnt>K+fn-w41o5w(D_Q~4TCPO^gxi-3u2YK1P`bERLKzR#4Cf-TQSW-c7v@m9 z)hvKLh81hTdfehjrP!x>8lNbL<39jqc;nvXeF0#X+mPecULkJcJV+1K=6m1A`iWqq zLu^7D?wB2--VZUZJQjX*%d2#4q7|Q&kntD5V(~7!EA%gZOokQic3FGD5IKFAmisd)0ng~CSOwz==w(~}`AW;J7w5D~zEsw<&nT7a;MK*WjteDC;3OBx-+@p*u-yw0yd zxA6mNqQC4iKq&@Oq(c|L7XOcl4aGHZJspHlo0$G*2Yz`Gimy#ix;yZZR!AR#@n8je zOjlG>T{!U~Y#jQCBvi7=j;6NX0a2L2lCpjC87{l4)Y~%zdK_%E0BpF*811Lv1~j1r zu7VMkz-@EW-_ZHqITj^ljlK2mh7zS1xb>I9Mfd~eB}~1C0H1||@L_2Di?00sIic>y z02`(&0~2E8MVglv1e2v_1irfGCs!=G++ZwAfmCi=U4r@_Pk*|31%W^CIc;xJ5U(3i zC27LkWPY@|@;eBt0}pp>5Eqc?CE@}cC%MZ$83EU!uOH!)0t$xx!+Uf%XiqlX^I{sA zHCwN4~Ld_zLomz$v;qnV!0)}7y}n#yQmuQX#8Qb>Xb+c+ZrGJAxtZa zV9#p{_Sl4U7z19p2>s%Kkz4d5(kdqUNnNA6@)h4`)#w+W+)0O{=5{ItGpD7?nQ*G# zZ5{LGh557u86yQsFbMLwS^R6Q zgJCk}DHG46E}_AWATC-;X!;Jw!Ge5k2?7ql&su~2^;S&AxNw*+5m-Ub9_A&(LCjScX;*6_ZT&- zWvt|Hr&7Qj^goiZnZNNs#gi z0sdH$M-Jam(vyJ=SRVH$O4FFTEnq`49)C-9)#tSJ&(%nL$)+%UM1?K^S*IF4_tKli za|eKht+Px+IbsmYBAMnWKV?Nu4FV!8;bj7(A2x>7T%*So5AmFCLl~I7Vkm*@%?&5v z7dDmjsc?M%)s~$HG;1L|SEa0kaRI_T_0!@$2X0}~E#FP3J&oh}w69DA#r>6>1pR>& z4VE@x=M0OiqqRYraU=-?8_xFbc*0 zp$Xdl&YZO1hiXW+={VNNDI!U`+p20{&vt%3Pk>A+uerNs>E@sQ&>UI zUGYOEGA#U|I(1Rx-;^kGTRie1tp5JYr@>TbOOh-_e<`jb$KaFlbMG+~WTErYJLn`z+da5jiy)RYgZ&jnSm(+P zwCE38cGvO-9a@98BHevKrFfBF|6{{n{yvjSRX4B%oFPb_G!!fvudrsFm7HG0mSUkp zoIQGU6mju8j2{X*Aw<6xaRF&{YkxUPUof3otCbzN1`5Rm*b`BJl-VP?-V=4+-4?uyF9j>bjYNUmYK%N%#M|Y;!F1P?PlnfuHD8_Mk_TCiRIpTN& z7NT7M-M>#KyYK63b^wmxO=zPk9W%lBx|H8&rB^<&)ghTwnGuvv2)x_73if94r|oUG zLQjyD{3}ba2m7;P$k}7l86`>NG7aK?Q{Esj%C@E;6!k)^m?kWP{(6;V8yHSyaq?AP;r1S_@u7!`|Elzd~JrCTMCTG-#h9txBW zTR;X|P1*sAJuE=6R3$DHCzT!x02UR>;-cY84^$h(me;BBUcK#b09A+%lyL|GHZDWm zA|44$5r)DQ0YeF>hU~w)W|ymA__^`|04fep0C+5qN)8a10d7R}PjLnQ)pS&m4>2U$ zP#lT0ddK45cZGRNj>}k0KWum~eaJEb_1GXdbvi)b_(|6^;QRZG>*C8CayJR1o;$g;BxOY@=` zgwJ&RBO!Vw2&8Zr-pKKiHr69cis6BYYm*M{Zr3R`5eX zeoYxQr!LE66CgrQRDXr7IUA!!4N`Cy2=B|n_06k)Sg*vLIMuWVg_ldB|7lD!~>ROw$dE#RFZ~B^ zVbHqK@GHLS)@yxBrqFW8eS#zxjDhOmP zraP0Tn~naXAP9dka=%`w&;|Tap{iTFjZ72P zvv|@}2G1Uniw0f`t4Ct&$#{Q4wuR^_2DzK|^An#4!Z$l%7MJi{NKlUD42WVu=n=#u z=^LMn8zd}1p%DXNT6;y$ObRHF-`cG?E<_%1OFuiuLE=clxyHC+@!0q%1+J60Dnc$=MnYzA` z_~bqP1NyAU$80xv+1@rY&Tq=^vKcKyF}HsD01OHbV zY5;dD-L>dLF5L zKS&LX@glmqRE%Aw2$C<_bZJ*8pASjB`8^$Q=n=mS`N_|cp~sS1*xGp6g5UF5`53ax zO-gaqdHdnxUX1$>Tb)BM;2=o1kfpM6oKH2-~iz@hd^*%t{HpZr&rha=Sc z?+k*|yf7JptmAH0-9<}n^F5~kX~UX~V5gytF`h~;qNPu5jb7Ne3@`nsYvMU}JIp%g z0#A(pUB^W3Lr?hVpy6HO&O%3HqtoP*v=V29DXr(9#McIgn0FQjJi-@p8yj=nCnPwlgr0>05;ujNQ;&sEV|IC0g~q=DtNVV%6JuU;)@ZM44n z@Tjq7pI~lL>yYkfQl%;^mrD!IG&8FsqT#cZy2LIgBO}lAq!gm#snSUq?Nrytl71c6 z4-M*;cFVOYEl7A8X|sQBw(S`{uoF#GDE-#lY(RJ@gZBxFqjoqqu?=c7lLiU#mF& zF$S!^yYqvBS()1>piD-I%A?i@iyUNBp1ni1n-_1lkRJ_0H+vBj5U(YCTz|O65sdtX zrg9PdS=Nu_zXekq{6~>vzPAr^o?Mg&0lY8pIfg7mJz&8QvZJOW757>qF~sM&D-JVu zlz$KW4EF9vu=uthyRFTa;$F`8r@uf=gm@19S=wij)@}j1iPc%uzyLMH#0hLWZQv~& ztI;!Q82u)rCa*lIulaQgJS;zY%tPeK4e~*P0JVFR>JQPub1YzM5cDp#06=Io{QOeyj&&*>>`IkI zUHT^EHqM z$suH^Gm8(BexV|cRD`4yC`Eox7_YNdcYwwy6k#zy+n8vg`U>UK)$Q@)YIBmP6h+XF z|IXSV1kI6gnJVP-1CFT9P_gEN*HI%X&i<8eUYAhmNA9!;11*7lN3iBN4rWXJCP4=t zN8coTAMPAMp?RaE1Kv{ky*BqOPb3HgX%F7_>TRalD zw}==Ox7{EkEH6fm#h3H|xRGv!)S76$>ZA7f6~mMC=h*D*?e}8v(|$qSyds^aNjWb; zDMleY%-ID?>kw%3B%yJy&Lu|MOmdm+h4b3?TpUUCf=$|@o-o<(#Clw zIArD0F=F?VcJZX)Rj!55fJDFT-vvH0xAE4i04nNfJf6yVufR;?*N0p0hX6rY8Us>} zJ{=nrZmxGV0HLVd9C8R?uFIU^efRz)i?y#)dpxftn3BF>hIKSLC64-ZO!V6HtFY?t zPtrUR`_?BwS#JqhJJ$E&DJGfV$4_B3P3wCo&zc%fUgx?#)$o97F@#u<0DA_9JGh|& zRdMnZ)2)R?iD&bxG+Uc5e+EkUu=suYl&$2Fdxgo67(zHv|wpteNm(^0zBy?*71L(BAhxU}Zm~I7Zk*N{Y6S4Be zYP#SDuPqjJ_7B#Dr}{BOoMbka^m~UZkpGn@oKODc;P0hd8ZQo`EuD1iH~dp&G!2>u ziH~Pv8(89QD!mJ^OO{gV)ebUV)veEi;3Ie=bJeEY%{4pEnDoj`?yUPM{j0MuQv@TX z4$+?PE4pf*Vd81rs(_qa0k=zd^27oei>WzjYa7i?sCOpRF-fq!0CZEVy~r&H%(;)94zwzf)!#@uR86VRfUq|KQB!%0Z7p(C*ul%;PW6BQ7| zhi%HeVzbQpwZ!_nh2ySTw*K@PZAUHFkm@4N-Wmy=JN8{Q#hoUkLb#GAyi=PD5t7=( zI^!j<*QypcnMXMWOx>ld9N*K(=eX@M&WA7Y@$pkK!HoA9PoyTDOokv`*;LiPs$t2m zB`f&2Nzc|lj4=te+B*{88;dA^3`X8XiUc>Nj>{z-RjO_vbZ@PE00q1KU5ie4eLDHO(0&S2vBca4tEbH zs%FJYhm}H==jnD!V{snGFi16?bDv4f^KxyDaa!`mewrUokmn4M=iS}EGa*Sz<{nve zUo?n-HE3@kgqY^zkx@*vX}~CL^bPkTotJ&j9f-+D=4-k2Ql{+KiWxmBdgh+S#Z82S zGpaEXr;cL2$JDMiG370sF1W1}Eq^efU2kG8ZOP~_yuOVPL1(6`LnYQN4~jK1SJIj? zN_xT3N=#jcRP1|cwus6EqV7oN6Q{er{!E@4q(G@Wo+uMuW6Ec~R{KCJ^MXi6dU`}= zx@v~pJ&_uPvFb_9{0F|>>&!%2ebXX3O7|3hKIAV|xcO6QU2+T0>p(2U5?}p%Cb#SQ zjNjrj-NU&U-P#DoM>M49h7eb!PQqTfxWCG|-JG;<$=fG;e*O>fQsI%@?a+^$gWT%W ze14j5ZyYZa{qux{aVqEjCJg(H7~0Tykx|yZC41mYPy+LYvMt*tfXO4Q2BKM7OX)1c z&-}KNZu!L51v8oqy-&!Fx(#i#v$(xkR^f*LYPnzMuOtA5QOW2ZP9@sYcc=I2L9D>= zMbXbj?O;q~xpjr~#(*cpv0I;$G&K7R(}Pp+OPAEM&;5Yye_~gqLGby;MQv9QfZc|h z5jppL*`n>brs?g3q{cTzw|xNzmY%1Xz8rlG4(a*)YVUcwQxEDQgtTV%K9J{IVfaoS zi1{BKkd-NjbP6h-Ev8-+XZH6HP_M+lmgDwYCT2c^K*T(t+n04S+1!j*Il=d=h{=~D zvW%u1wl5hK`24N_-|}^(X|WNRsiiTg*Uk4InyMM~iRkQS>@L26j;;K9s&ckSZ>;Zy zVk6@MadY%=XqgdIgRZecED?RK%6e~Qm36!TocZ0wOw$@yOfQaVrPjO_$qt7 zPD(XCiPsXJyH@yu^MkCB!{&B8U1(C6*m0eU{O;#ADob^}e)5Raa9Aa5y&5XhE824A z^}oZ%@xDp=b?dd^T(3bVS);+&Jb%xmi{AxQSpN{%2;++O!)0RqXI02X+Px=8*j~<* z4;p(nN%dbl->_-tWf-~Z+>4}s!8pA{S$Ap1fl7l&TeVLy@&kD@A%-Td>5r|oaEFAB ziCzEsjjX6sm!B-t2NOLo(|Bm#MAKuOYDc4XSP)|!-g86!p2+tcmfB@X)^#JExCJU6 zVm_uGZxY|L<8RLkJ%6aY;?BLSzLm-&q~!~AkhhZMC6R_u$1|anTPPBHFn}U#)+20IPGD%>(o7 z>EYq*vY8c2ezRhOW?zlxyA0N|W$(=oH*YYFijLmAymw8KYGMB8pwCv}c2GdjDSmN> zTh?6;vUbm@2YoT>3GOr|MFD{3^V-r1Vj}V9E`N9b{mjP|9|DiE^PMlW%e>pF`L76- z#Txyb6w`?5b{Q0VJ7_)KBv==zFm0R%o$-S)n3T0N>MUxmfm$=A)$kKI8|vxb#4TAJ zYhSqRRE)g5=(#f(`TkAr)5lJd1hg0orVMwckVpR2?#8ChG{2M09U(ck4MmBSFFwMO z5AE)>yE!MrFG=aYWiV*dG)%lJNtkhSud4>03s$+u@<>xh_-bL!WeUf)KX48+u;!mL%hZ>U!EiepmtIrZZ2)!h7s4T??r#5G1O@wl?g*}dNlbM?o`YLtn6^Jv=%S-00vW7 zz*otOtJuI$+3VIz+AY2Pom!#zQyW@xjC|>^iH%~*8G{j&^yP0;bc`C@cIIBlH?$w> zp`0tHA70BjTl6q`Vbmv>TTNm$>~#<}nQ{Coa$W>SNE$mjRP)25@Fk z-LRTE{#vR;H?us5>db&q;;OLmUrh_lF%n+9u>J7i12i1j{t7wS17Q4G0En|8;Q7NB z4v;BhwrOq6-WIe+Rxl*tCTdVt~#I#t_DVY^+VW;Mw3!h)| zdCpCe`Q%&smx$i{`tjr^;SuIf9`%w-x9+L@0#-{W_76Cl+d*7VOI7Fr=vzfm@s1=N zn(Z=6cz40jB*7&S+2b6p#s-z)*JhH~1E+s!3yKee=YqyY`S;V))64FpE@ts(Lz^bO zN0QE#7Elb;yyV-_hhSq;IYuL=)ocoVSZOjK%@<}ifFyDO_mK*}U{j86J@L}9c$?HF zJvrr~V_aNZgCA~vp(3?)lm~xaBf|J%aF>E^>{p=fgI*wCAW5IkJm>=KA zr7!cnG?yyO^FRIgq2~Z=Kw6CL-qZt6c0{&zFEdO@lGb1e8`JhyMx#|5cG^n0N(+L&>SXj2oLd3wRmzR=y!1DuMc`~&bN9u!yY!Fb1@>Z{c^(CF4j0TT- z{yoOMLofaQ1$8Livf+Afc_v^N{K@+HT6EmX`(u;9nkgYBt{{9JYwgo>QDpC_a&`qM z0<9Bz95v8<;4*k^Y6^5*^4MI^7u%!8V0bD}W*g?J_<74@YW)~{=G|fIwW6g5R;8qO zd!O0c_kQbrS79}4$wC;Y5r6BaiLfY=v_g^Y+FXfzapbSifeck?R8kd#`SmpaCiU(b zI|jpbqgt-QOEDd8gyWb@`t3)gDGeXaqcf_?zt+v%?X@&K>s!o`x*YfS=MaH|FT72W z(!&I|J<#NVsESFV;74D)uNR;%;|yPL;7hO#E-`xezwL+mr{0re)M=qFw*mAZ(aPHT zdU0u4*`>;bkL@s*vX|~WhG}CB!3)lG+g>pTH`-&Y{tS;EJSZHk_A>-47mlG-7^NbF zT)O=j<`-3lx>S5iTN{E_2VolT0EEn9{UYnZ)t}9hwL7qb0}GHqNWydO3e7{LefRV% zNxT*`3S6^^z%<7X?>TzZ*#U`;F7rB$xid?_AIwvDyOk1K8&r#UBb%_8tnBQjot>S= z)~arenBbLfL6CnsCMP|mjfG zccTd&_sn}k5dZvub~)llCZ9SB0}A&qKLO1C2O)t z)a?xR6@=h3{Om9-3*4<>JT>BE1F(eiHI%vF#Oo_7 zKP0BRM+>hfG*!Smgm=)U(4J$J-@Rx8HrElkjx{=t(H^_p3-7Ma^!rN6jwGqjE2#mC?v1=VSO_e2csysKBQ3j13 zV!oOW^m*1X>q_tSlzjIVh#K`Wi|neEtrm+v6>yb^f{2RI=B<7s0S!id_3t~`(96WN z1LjKJM9!?PZl2LBHx(5NqM}Gj z1w_|@*ldFoV$#>=@4F$@(80oJwYW@wyd>c=q8PDs*9#c%I)LRA1#1egwXh_*rEa%F-Q$$ozr zYtI2P`dZi~#!ppPWL-U2Vi<7-L9^x4F8ac-i0^}Ro_;EH@l*I#4khoQ z%nFw*x8ENF&X|w6!to+eYPN(!OZaR8Fp zUTKptARxkXAWAX@W7RiKm`q%YnDmo(pC84jff)c5fi&sd#iv0p>fE6R8U89=Av5YT zq*clv@Rjq6P?j7uJ>&-GtoKb4>P8^d@jO2FXcC6ygyPwBP*<*edcYHogNY~Hz@4o* z9oJK_&T>qu@r$V=22Zoz83fjNxj1riw{}5C)VmQPFEb{&^!Ox(<^%+3b!%#B0%DB% zW%vLgQhyc>L0>SPe~WC41g9Q)v=U_oW#9j?9~NCwWyhrOgG2w93&O&e2QXz!KIk?@}F*I zshmp>!*f1@jP>_zj-1J`hd^V(6*wOJFzchK5j)%+lf&h1n*bpX0(j^IWdIoOQ&xJf zro9)-Um6CMZqGsB;l9snu-n_?g`&F@E+M>X{DR>p!47%lO<)lbzwD0|l5S34JG#8Q z=Yfda$>DI%5)RQ~QXEk-IPcKUzjYnq+k1;HK@K1%D1r$=!jISaFqTH6x&vJ0kfz%R z;a=kY+h|}k%pmG|u8d1FUAP?y;C4H-5tdLh!zyiS@xc8uD;t~2q!SzVkqNw~w@*p> z_H9T>K*71W)-DuLbs^_V`OtlPh3}kclnJPGxIY0Q!3MHOi=h|Xm(C38kA-c%m6?zR zl*&n($wr*~1jxq_;_LnS(-7PNZ{vHg(SES@6+MxF5m4N)WxNR5k-F}%OO z|LE&nn5%(=Vr+AH%thD4$Lbz8yMRDP9$2L4CZwgL;19#dn7lYC7AG=95fLJ@vhzN| zZTJnz8tJZRnF1QC0~~_A5R(&OZ+kv~;logYdA$*jj?3$Wom<`jYL_|z6(R2pT6Sk% zf{)?)`49T}N7mV4ri-G#$VRzqtu2a$n2jito8$cX^E1)*FY}+LvBB`P)EEM};0t#c zhTMFvOO1A6fd;D+ZA|o4LoRW!S70Lh#6W$D3E^0MtxfwF0C*#MkDxNBG!YBnKF+%^ zCmsOwjzJh}8mXPa#Gk>7n3_tG_Urm+OH6YeQW`UKFbVm$8x-2tjm$+@EMd%^hpSwD za&D1_Pn1!+E$zBF@NRZ~f6-W$L55YT_wijK(p)9*`hNUa8K}3guoza`c=&5-s_XKknp~Y4Dg(D7S>CBR@rBpFNHA^3J0iXRMWJF8 z3ovQHA@$(XGR*Wn1&9;xD@KohPunA56lu|cFO`}ns_OKin-DMDu@eF!q47Ke1FrUy{B1%azBk|98q(j)g8HR)H59 zhX2d4{QpJ%`2T|$zMX_ z*=o2vtwQV857(M2xkAqnpsV8jAxg_`BBQ2-yjL2M;Tdr1e*MBtd5m6-_Zh-(Y|{!*b%}sXOy18}@@} zi|M>Y7;toXX11ZUwmaINzGf^1JwhR(jezj>L&{>f_$C@%A3}+2h`5e0O!oxMaLT|g zZr&c+k}au=XaWMT^vDuckfByVgUz4wnJ?W+TDIbRJ!zTW#@}(W%3DuXVmUv>r zmW1`{Fzo7ivQ_>yQG5W#bQ3YlNUeZotXVp_jP8PPih{{6aK55ZCUq6{?CtH%g?2jc zOC{`~L81fWP}6oX=i!-t?fmn@Bec5?v+I;UgyAFbF!Fzb~$f$`_PA1cG2uz0qtBByget(?hJ_%$xgZ z=Po!8U)me&477ekC-iO4Xw>^B=@x@6)7&hNvJWF%0V#Z$I5y!u+IPn29|6!ficF&z zt58>lYC+@6YRbwVnVieMi2jg|UPP1!N=nM%EB0R>`W};u9tX8TrH6l?xH?RCvEaeU zgpC6r6nbRhD=b04)F=i7V;)Z60iW_4aC|Hby!s;IS+E7or zoAg!Q1@Tv(S1OW63yesDf+l22j=x zDF(!s%IdSU2m`SbF(Z%eOe;^M0;j>JeZ6Kw4^G36EgHSw+CMInrmvlKyL+KO;GHjw zliQdhmM^2zO)to&cl&w|+xKT~(b_XZpRye=Tgzi(_+%_^TqK`$Rl)s+M7Wj6!=s5 zGe4>cyz+oVU+q6F+w21z;>a=G)6*i9L-)TulEI%q_*Emdt{HFqHRD-bPEVNmpuz1P zz(B*}R-_XB!Q-%)r!JaI{dhTOjGey*<8$xLZ2)Av6lh-+x-5F={@tjWm`}C>u&Izu zA>Sncjh$aJ{!F=h;%IlEcDM%ZpgIfy;op>Bbj(D?a}(ES8_E169MQDnrMg{(5tBzl zAz|XWjP0qxZ_l$Cc5#N|2SF@U!yE6n!6 zoHfSeEq<9ya1(K+4Jv67LuEkf@Rv}~Y)I&}XuC^5O&aaXo-1GJNTM#QzSGR2Jnm56 z?MLL1*LUmjt5NAuPlxuuM>)OI8jg5QXO% zZh{-LnzA}uv0XHNGV+7H-cQhMvXJ>zwer?7{37Ndn~Ef@cu!AH2=O+G-E26Zl{&mq zk}_-k_aP+_t^ONc^qVYGauOqdLCY|TZ1pe3-RMd0xSRg~nEH{S|}7lZ1xA2Z8_z2XxqztTx$O$q*CeHyno@RQ={UQ26YU5WD2 za$#V8d)r9hyRie|kNdu=`_FCmoH|R7_%}Nb2e0kf94#at6a}FNK`$3gJNK5ywhWS4 d`^EN-j))6+=A7!aH}0Y1Qj%Ad%abt+`ERal-2eap diff --git a/Documentation~/InclCaptureOptionsGameView.md b/Documentation~/InclCaptureOptionsGameView.md index d67bda4..c799511 100644 --- a/Documentation~/InclCaptureOptionsGameView.md +++ b/Documentation~/InclCaptureOptionsGameView.md @@ -4,7 +4,8 @@ These options appear when you set **Capture** to **Game View**. >[!NOTE] ->If you are using more than one Recorder to capture Game View, they must all use the same resolution settings. +>* If you have multiple Game Views in your project, the Recorder captures only the last one you selected in the Editor. +>* If you are using more than one Recorder to capture Game View, they must all use the same resolution settings. ![](Images/CaptureOptionsGameView.png) @@ -15,4 +16,4 @@ These options appear when you set **Capture** to **Game View**. | | _[PRESET RESOLUTIONS]_ | Choose from several standard video resolutions such as 1080p and 4K. | | | Custom | Uses custom width and height values that you supply. | | **Aspect Ratio** ||These options appear when you set **Output Resolution** to **Custom**.| -| | W/H | Control the recording's width and height.

| \ No newline at end of file +| | W/H | Control the recording's width and height.

| diff --git a/Documentation~/RecorderGif.md b/Documentation~/RecorderGif.md index 55dfbdb..ed37c0e 100644 --- a/Documentation~/RecorderGif.md +++ b/Documentation~/RecorderGif.md @@ -14,9 +14,7 @@ This page covers properties specific to GIF Animation Recorders. To fully config |Property:||Function:| |:---|:---|:-| | **Capture** ||Specifies the input for the recording.| -|| Game View |Records frames rendered in the Game View.

Selecting this option displays the [Game View capture properties](#GameView). | || Targeted Camera |Records frames captured by a specific Camera, even if the Game View does not use that Camera.

Selecting this option displays the [Targeted Camera capture properties](#TargetedCamera).| -|| 360 View |Records a 360-degree video.

Selecting this option displays the [360 View capture properties](#360View).| || Render Texture Asset |Records frames rendered in a Render Texture.

Selecting this option displays the [Render Texture Asset capture properties](#RenderTextureAsset).| || Texture Sampling |Supersamples the **Source** camera during the capture to generate anti-aliased images in the recording. Use this capture method when the **Rendering Resolution** has the same or higher resolution than the **Output Resolution**.

Selecting this option displays the [Texture Sampling capture properties](#TextureSampling).| | **Encoding** ||Properties for controlling the quality and size of the .gif output.| @@ -29,7 +27,3 @@ This page covers properties specific to GIF Animation Recorders. To fully config [!include[](InclCaptureOptionsRenderTextureAsset.md)] [!include[<title>](InclCaptureOptionsTextureSampling.md)] - - - - diff --git a/Documentation~/RecorderManage.md b/Documentation~/RecorderManage.md index 8b4fd63..25861ed 100644 --- a/Documentation~/RecorderManage.md +++ b/Documentation~/RecorderManage.md @@ -36,7 +36,9 @@ Right click the Recorder you want to delete and choose **Delete** from the conte Or -Select the Recorder you want to delete and use the **Ctrl/Cmd + Delete** shortcut. +Select the Recorder you want to delete and: +* On Windows or Linux, press **Delete**, or +* On Mac, use the **Cmd + Delete** shortcut. <a name="ManageRecorderLists"></a> ## Managing Recorder lists @@ -65,6 +67,3 @@ Use the Preset icon ![](Images/IconPreset.png) in the Recorder Properties pane t This is useful for creating predefined Recorders that you can reuse in different [Recorder Lists](#ManageRecorderLists). For information about saving and loading Presets, see the [Presets](https://docs.unity3d.com/Manual/Presets.html) section in the Unity Manual. - - - diff --git a/Documentation~/RecorderProperties.md b/Documentation~/RecorderProperties.md index 6fa9a9f..f106fd3 100644 --- a/Documentation~/RecorderProperties.md +++ b/Documentation~/RecorderProperties.md @@ -1,6 +1,6 @@ # Setting Recorder properties -To configure a Recorder, set its properties in the [Recorder window](RecorderWindow.md) or, if you're recording from a Timeline Track, in the [Recorder Clip Inspector](RecordingTimelineTrack,md). +To configure a Recorder, set its properties in the [Recorder window](RecorderWindow.md) or, if you're recording from a Timeline Track, in the [Recorder Clip Inspector](RecordingTimelineTrack.md). From there, you can set the following types of properties: @@ -44,5 +44,3 @@ These properties define file output options for any type of Recorder. | | _[PATH]_ | Displays the full output path, as set in the **File Name** and **Path** properties. | | | File Browser button <br/>![](Images/RecorderReveal.png) | Opens your operating system's file browser to the current path. | |**Take Number** || A value that the Recorder uses to number recordings. It increases by one after each recording. <br/><br/>You can use the **<Take>** wildcard to append current **Take** value to the **File Name**. | - - diff --git a/Documentation~/RecordingPlayMode.md b/Documentation~/RecordingPlayMode.md index 4bf3734..83da6d2 100644 --- a/Documentation~/RecordingPlayMode.md +++ b/Documentation~/RecordingPlayMode.md @@ -30,11 +30,10 @@ Use the **Frame Rate** properties to specify how to constrain the frame rate dur | **Record Mode** ||Specifies the frames or time interval to record.| ||_Manual_ |Start and stop recording when you manually click **Start Recording** and **Stop Recording**, respectively.| || _Single Frame_ |Record a single frame. Use the **Frame Number** property to specify this frame.| -|| _Frame Interval_ |Record a set of consecutive frames during Play mode. Use the **First Frame** and **Last Frame** properties to specify when to start and stop.| +|| _Frame Interval_ |Record a set of consecutive frames during Play mode. Use the **Start** and **End** properties to specify when to start and stop.| || _Time Interval_ |Record a specific duration, in seconds, during Play mode. Use the **Start** and **End** properties to specify when to start and stop.| | **Frame Number** ||Specifies the number of the frame to capture when in **Single Frame** mode.| -| **First Frame**/ <br/> **Last Frame** ||Specifies the range of frames to capture when in **Frame Interval** mode.| -| **Start**/ <br/> **End** ||Specifies the time, in seconds, to start and stop recording.| +| **Start**/ <br/> **End** ||• When in **Frame Interval** mode, specifies the range of frames to capture.<br/>• When in **Time Interval** mode, specifies the time, in seconds, to start and stop recording.| ### Frame Rate properties @@ -76,5 +75,3 @@ When a recording stops the Editor remains in Play mode unless: - Use the **F10**/**fn+F10** shortcut. - Close the Recorder window. - Exit Play mode. - - diff --git a/Documentation~/RecordingTimelineTrack.md b/Documentation~/RecordingTimelineTrack.md index d023c59..bce7901 100644 --- a/Documentation~/RecordingTimelineTrack.md +++ b/Documentation~/RecordingTimelineTrack.md @@ -26,7 +26,7 @@ To set up a recording session in a Timeline instance: ## Editing Recorder Clip properties -Recorder Clip properties are the same as regular [Recorder properties](RecorderSetup.md), but you set them from the Recorder Clip inspector rather than the Recorder window. +Recorder Clip properties are the same as regular [Recorder properties](RecorderProperties.md), but you set them from the Recorder Clip inspector rather than the Recorder window. ![Adding a Recorder Track in Timeline.](Images/RecorderClipProperties.png) @@ -34,7 +34,7 @@ Recorder Clip properties are the same as regular [Recorder properties](RecorderS |-|-| |![](Images/Label-A.png) | Choose the type of Recorder you want the Recorder Clip to use. | |![](Images/Label-B.png) | Load any existing [Recorder Preset](RecorderManage.md#RecorderPreset), or save the current Recorder Clip settings as a Preset. | -|![](Images/Label-C.png) | Set the Recorder Clip properties. These vary according to the **Selected Recorder** setting. You set them the same way you set regular [Recorder properties](RecorderSetup.md). | +|![](Images/Label-C.png) | Set the Recorder Clip properties. These vary according to the **Selected Recorder** setting. You set them the same way you set regular [Recorder properties](RecorderProperties.md). | >[!NOTE] > Unity stores the **Recorder Clip** properties in the Timeline Track. They do not affect properties you set in the Recorder window. @@ -47,4 +47,4 @@ The Recorder Clip Inspector also includes a subset of the [recording controls](R |-|-| |![](Images/Label-A.png) | The Recorder Clip's **Clip Timing** properties control the recording's **Start**, **End**, and **Duration**. | |![](Images/Label-B.png) | The **Frame Rate > Playback** property is locked to **Constant** mode, because Timeline plays back at a constant frame rate. | -|![](Images/Label-C.png) | The Recorder Clip inherits its **Frame Rate > Target** setting from the Timeline’s **Frame Rate** setting. | \ No newline at end of file +|![](Images/Label-C.png) | The Recorder Clip inherits its **Frame Rate > Target** setting from the Timeline’s **Frame Rate** setting. | diff --git a/Editor/Sources/BaseRenderTextureInput.cs b/Editor/Sources/BaseRenderTextureInput.cs index f71ec28..d15a032 100644 --- a/Editor/Sources/BaseRenderTextureInput.cs +++ b/Editor/Sources/BaseRenderTextureInput.cs @@ -21,11 +21,11 @@ public abstract class BaseRenderTextureInput : RecorderInput /// <summary> /// Stores the output image width. /// </summary> - protected internal int OutputWidth { get; protected set; } + public int OutputWidth { get; protected set; } /// <summary> /// Stores the output image height. /// </summary> - protected internal int OutputHeight { get; protected set; } + public int OutputHeight { get; protected set; } /// <summary> /// Releases all resources allocated by this class instance. diff --git a/Editor/Sources/BaseTextureRecorder.cs b/Editor/Sources/BaseTextureRecorder.cs index cacb5a0..6ca5a08 100644 --- a/Editor/Sources/BaseTextureRecorder.cs +++ b/Editor/Sources/BaseTextureRecorder.cs @@ -13,7 +13,12 @@ public abstract class BaseTextureRecorder<T> : GenericRecorder<T> where T : Reco { int m_OngoingAsyncGPURequestsCount; bool m_DelayedEncoderDispose; - bool m_UseAsyncGPUReadback; + + /// <summary> + /// Whether or not to use asynchronous GPU commands in order to get the texture for the recorder. + /// </summary> + protected bool UseAsyncGPUReadback; + Texture2D m_ReadbackTexture; /// <summary> @@ -27,7 +32,7 @@ protected internal override bool BeginRecording(RecordingSession session) if (!base.BeginRecording(session)) return false; - m_UseAsyncGPUReadback = SystemInfo.supportsAsyncGPUReadback; + UseAsyncGPUReadback = SystemInfo.supportsAsyncGPUReadback; m_OngoingAsyncGPURequestsCount = 0; m_DelayedEncoderDispose = false; return true; @@ -46,7 +51,7 @@ protected internal override void RecordFrame(RecordingSession session) var renderTexture = input.OutputRenderTexture; - if (m_UseAsyncGPUReadback) + if (UseAsyncGPUReadback) { AsyncGPUReadback.Request( renderTexture, 0, ReadbackTextureFormat, ReadbackDone); diff --git a/Editor/Sources/Helpers/UnityHelpers.cs b/Editor/Sources/Helpers/UnityHelpers.cs index 3e830ab..e103c3d 100644 --- a/Editor/Sources/Helpers/UnityHelpers.cs +++ b/Editor/Sources/Helpers/UnityHelpers.cs @@ -1,6 +1,7 @@ using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.Recorder; +using UnityEngine.SceneManagement; using UnityObject = UnityEngine.Object; namespace UnityEditor.Recorder @@ -74,5 +75,16 @@ static void SetGameObjectVisibility(GameObject obj, bool visible) } } } + + internal static bool AreAllSceneDataLoaded() + { + for (int i = 0; i < SceneManager.sceneCount; ++i) + { + Scene s = SceneManager.GetSceneAt(i); + if (s.isLoaded == false) + return false; + } + return true; + } } } diff --git a/Editor/Sources/RecorderController.cs b/Editor/Sources/RecorderController.cs index e91c500..9869306 100644 --- a/Editor/Sources/RecorderController.cs +++ b/Editor/Sources/RecorderController.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using UnityEngine; @@ -34,36 +34,25 @@ public RecorderController(RecorderControllerSettings settings) m_Settings = settings; m_SceneHook = new SceneHook(Guid.NewGuid().ToString()); } - + /// <summary> - /// Start recording. Works only in Playmode. + /// Prepare the recording context by setting up the internal data and pausing the simulation. + /// Must be called before <see cref="StartRecording"/>. /// </summary> - /// <returns>false if an error occured. The console will usually contains logs about the errors.</returns> - /// <exception cref="Exception">If not in Playmode.</exception> - /// <exception cref="NullReferenceException">If settings is null.</exception> - public bool StartRecording() - { + public void PrepareRecording() + { if (!Application.isPlaying) throw new Exception("Start Recording can only be called in Playmode."); + if (RecorderOptions.VerboseMode) + Debug.Log("Prepare Recording."); + if (m_Settings == null) throw new NullReferenceException("Can start recording without prefs"); - - if (IsRecording()) - { - if (RecorderOptions.VerboseMode) - Debug.Log("Recording was already started."); - - return false; - } - if (RecorderOptions.VerboseMode) - Debug.Log("Start Recording."); - SceneHook.PrepareSessionRoot(); - m_RecordingSessions = new List<RecordingSession>(); - + foreach (var recorderSetting in m_Settings.RecorderSettings) { if (recorderSetting == null) @@ -84,8 +73,46 @@ public bool StartRecording() continue; } + if (!recorderSetting.Enabled) + { + if (RecorderOptions.VerboseMode) + Debug.Log("Ignoring disabled recorder '" + recorderSetting.name + "'"); + + continue; + } + + var session = m_SceneHook.CreateRecorderSessionWithRecorderComponent(recorderSetting); + + m_RecordingSessions.Add(session); + } + } + + /// <summary> + /// Start recording. Works only in Playmode. + /// Must be called after <see cref="PrepareRecording"/> to setup the recording context. + /// </summary> + /// <returns>false if an error occured. The console will usually contains logs about the errors.</returns> + /// <exception cref="Exception">If not in Playmode.</exception> + /// <exception cref="NullReferenceException">If settings is null.</exception> + public bool StartRecording() + { + if (!Application.isPlaying) + throw new Exception("Start Recording can only be called in Playmode."); + + if (IsRecording()) + { + if (RecorderOptions.VerboseMode) + Debug.Log("Recording was already started."); + + return false; + } + + foreach (var recorderSetting in m_Settings.RecorderSettings) + { var errors = new List<string>(); + // This can be done only here as some recorders needs data from scenes. + // Example: Animation Recorder needs their target to exist. if (!recorderSetting.ValidityCheck(errors)) { foreach (var error in errors) @@ -98,20 +125,11 @@ public bool StartRecording() Debug.LogWarning("Recorder '" + recorderSetting.name + "' has warnings and may not record properly."); } + } - if (!recorderSetting.Enabled) - { - if (RecorderOptions.VerboseMode) - Debug.Log("Ignoring disabled recorder '" + recorderSetting.name + "'"); - - continue; - } - - var session = m_SceneHook.CreateRecorderSessionWithRecorderComponent(recorderSetting); + if (RecorderOptions.VerboseMode) + Debug.Log("Start Recording."); - m_RecordingSessions.Add(session); - } - var success = m_RecordingSessions.Any() && m_RecordingSessions.All(r => r.SessionCreated() && r.BeginRecording()); return success; @@ -163,4 +181,4 @@ internal IEnumerable<RecordingSession> GetRecordingSessions() return m_SceneHook.GetRecordingSessions(); } } -} \ No newline at end of file +} diff --git a/Editor/Sources/RecorderControllerSettingsPreset.cs b/Editor/Sources/RecorderControllerSettingsPreset.cs index d1e525b..d089459 100644 --- a/Editor/Sources/RecorderControllerSettingsPreset.cs +++ b/Editor/Sources/RecorderControllerSettingsPreset.cs @@ -4,7 +4,10 @@ namespace UnityEditor.Recorder { - class RecorderControllerSettingsPreset : ScriptableObject + /// <summary> + /// Class that models a Recorder List (a stack of preset Recorder Settings instances) that you can save and load for reuse into a Recorder Window. + /// </summary> + public class RecorderControllerSettingsPreset : ScriptableObject { [SerializeField] Preset m_Model; [SerializeField] List<Preset> m_RecorderPresets = new List<Preset>(); @@ -19,7 +22,12 @@ internal Preset[] recorderPresets get { return m_RecorderPresets.ToArray(); } } - internal static void SaveAtPath(RecorderControllerSettings model, string path) + /// <summary> + /// Saves the specified Recorder List to a file on disk. Note that this method doesn't save Scene references (such as a GameObject reference in Animation Recorder Settings). + /// </summary> + /// <param name="model">The Recorder List to save.</param> + /// <param name="path">The path on disk where to save the Recorder List. You must specify a path relative to the project.</param> + public static void SaveAtPath(RecorderControllerSettings model, string path) { var data = CreateInstance<RecorderControllerSettingsPreset>(); @@ -53,7 +61,11 @@ internal static void SaveAtPath(RecorderControllerSettings model, string path) AssetDatabase.Refresh(); } - internal void AppyTo(RecorderControllerSettings prefs) + /// <summary> + /// Applies the current Recorder List to the specified RecorderControllerSettings instance. + /// </summary> + /// <param name="prefs">The RecorderControllerSettings instance to apply the Recorder List to.</param> + public void ApplyTo(RecorderControllerSettings prefs) { prefs.ReleaseRecorderSettings(); diff --git a/Editor/Sources/RecorderWindow.cs b/Editor/Sources/RecorderWindow.cs index 99b1f5a..5af8860 100644 --- a/Editor/Sources/RecorderWindow.cs +++ b/Editor/Sources/RecorderWindow.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -96,11 +95,12 @@ class RecorderItemList : VisualListItem<RecorderItem> RecorderControllerSettings m_ControllerSettings; RecorderController m_RecorderController; - + enum State { Idle, WaitingForPlayModeToStartRecording, + WaitingForScenesData, Error, Recording } @@ -392,10 +392,9 @@ void OnEnable() m_ControllerSettings = RecorderControllerSettings.LoadOrCreate(Application.dataPath + s_PrefsFileName); m_RecorderController = new RecorderController(m_ControllerSettings); - + m_RecorderSettingsPrefsEditor = (RecorderSettingsPrefsEditor) Editor.CreateEditor(m_ControllerSettings); - #if UNITY_2018_2_OR_NEWER m_RecordingListItem.RegisterCallback<ValidateCommandEvent>(OnRecorderListValidateCommand); m_RecordingListItem.RegisterCallback<ExecuteCommandEvent>(OnRecorderListExecuteCommand); @@ -446,6 +445,20 @@ public void StopRecording() StopRecordingInternal(); } + [RuntimeInitializeOnLoadMethod] + static void RuntimeInit() + { + var windows = Resources.FindObjectsOfTypeAll<RecorderWindow>(); + + if (windows != null && windows.Length > 0) + { + RecorderWindow win = windows[0]; + + if (win.m_State == State.WaitingForPlayModeToStartRecording) + win.RequestStartRecording(); + } + } + void OnPlayModeStateChanged(PlayModeStateChange obj) { if (obj == PlayModeStateChange.ExitingPlayMode) @@ -590,14 +603,22 @@ void OnRecorderListKeyUp(KeyUpEvent evt) void ApplyPreset(string presetPath) { var candidate = AssetDatabase.LoadAssetAtPath<RecorderControllerSettingsPreset>(presetPath); + ApplyPreset(candidate); + } - if (candidate == null) + /// <summary> + /// Loads a previously saved Recorder List. + /// </summary> + /// <param name="preset">The instance of Recorder List to load.</param> + public void ApplyPreset(RecorderControllerSettingsPreset preset) + { + if (preset == null) return; - candidate.AppyTo(m_ControllerSettings); + preset.ApplyTo(m_ControllerSettings); ReloadRecordings(); } - + void ShowNewRecorderMenu() { var newRecordMenu = new GenericMenu(); @@ -699,21 +720,18 @@ bool ShouldDisableRecordSettings() void Update() { - if (EditorApplication.isPlaying) - { - if (m_State == State.WaitingForPlayModeToStartRecording) - { - StartRecordingInternal(); - } - } - else + if (!EditorApplication.isPlaying) { if (m_State == State.Recording) { StopRecordingInternal(); } } - + else if (m_State == State.WaitingForScenesData && UnityHelpers.AreAllSceneDataLoaded()) + { + StartRecordingInternal(); + } + var enable = !ShouldDisableRecordSettings(); m_AddNewRecordPanel.SetEnabled(enable); @@ -755,12 +773,12 @@ void SetRecordButtonsEnabled(bool enabled) } void StartRecordingInternal() - { + { if (RecorderOptions.VerboseMode) Debug.Log("Start Recording."); - var success = m_RecorderController.StartRecording(); - + bool success = m_RecorderController.StartRecording(); + if (success) { m_State = State.Recording; @@ -773,6 +791,16 @@ void StartRecordingInternal() } } + void RequestStartRecording() + { + if (RecorderOptions.VerboseMode) + Debug.Log("Prepare and wait all scenes to load."); + + m_RecorderController.PrepareRecording(); + + m_State = State.WaitingForScenesData; + } + void OnRecordButtonClick() { if (m_State == State.Error) diff --git a/Editor/Sources/Recorders/MovieRecorder/MovieRecorder.cs b/Editor/Sources/Recorders/MovieRecorder/MovieRecorder.cs index 90fc628..567d166 100644 --- a/Editor/Sources/Recorders/MovieRecorder/MovieRecorder.cs +++ b/Editor/Sources/Recorders/MovieRecorder/MovieRecorder.cs @@ -92,6 +92,15 @@ protected internal override bool BeginRecording(RecordingSession session) if (audioInput.audioSettings.PreserveAudio) { +#if UNITY_EDITOR_OSX + // Special case with WebM and audio on older Apple computers: deactivate async GPU readback because there + // is a risk of not respecting the WebM standard and receiving audio frames out of sync (see "monotonically + // increasing timestamps"). This happens only with Target Cameras. + if (m_Inputs[0].settings is CameraInputSettings && Settings.OutputFormat == MovieRecorderSettings.VideoRecorderOutputFormat.WebM) + { + UseAsyncGPUReadback = false; + } +#endif var audioAttrs = new AudioTrackAttributes { sampleRate = new MediaRational diff --git a/Editor/Sources/Recorders/MovieRecorder/MovieRecorderSettings.cs b/Editor/Sources/Recorders/MovieRecorder/MovieRecorderSettings.cs index 41e8643..9bbf64d 100644 --- a/Editor/Sources/Recorders/MovieRecorder/MovieRecorderSettings.cs +++ b/Editor/Sources/Recorders/MovieRecorder/MovieRecorderSettings.cs @@ -64,6 +64,7 @@ public bool CaptureAlpha public MovieRecorderSettings() { fileNameGenerator.FileName = "movie"; + FrameRate = 30; var iis = m_ImageInputSelector.Selected as StandardImageInputSettings; if (iis != null) diff --git a/Editor/Sources/Recorders/_Inputs/Animation/AnimationInput.cs b/Editor/Sources/Recorders/_Inputs/Animation/AnimationInput.cs index 0f6be4a..dfbe64e 100644 --- a/Editor/Sources/Recorders/_Inputs/Animation/AnimationInput.cs +++ b/Editor/Sources/Recorders/_Inputs/Animation/AnimationInput.cs @@ -1,4 +1,4 @@ -#if UNITY_2018_3_OR_NEWER +#if UNITY_2018_3_OR_NEWER using UnityEditor.Animations; #else using UnityEditor.Experimental.Animations; @@ -25,7 +25,7 @@ protected internal override void BeginRecording(RecordingSession session) var srcGO = aniSettings.gameObject; if (srcGO == null) - return; + throw new System.NullReferenceException("srcGO"); GameObjectRecorder = new GameObjectRecorder(srcGO); diff --git a/Editor/Sources/Recorders/_Inputs/Camera/CameraInput.cs b/Editor/Sources/Recorders/_Inputs/Camera/CameraInput.cs index be2cf69..a5db0a7 100644 --- a/Editor/Sources/Recorders/_Inputs/Camera/CameraInput.cs +++ b/Editor/Sources/Recorders/_Inputs/Camera/CameraInput.cs @@ -192,10 +192,10 @@ protected internal override void BeginRecording(RecordingSession session) if (cbSettings.FlipFinalOutput) m_VFlipper = new TextureFlipper(); - if (Options.useCameraCaptureCallbacks) - m_InputStrategy = new CaptureCallbackInputStrategy(cbSettings.AllowTransparency); - else + if ( CameraInputSettings.UsingLegacyRP()) m_InputStrategy = new CameraCommandBufferInputStrategy(cbSettings.AllowTransparency); + else + m_InputStrategy = new CaptureCallbackInputStrategy(cbSettings.AllowTransparency); switch (cbSettings.Source) { diff --git a/Editor/Sources/Recorders/_Inputs/Camera/CameraInputSettings.cs b/Editor/Sources/Recorders/_Inputs/Camera/CameraInputSettings.cs index df0b035..5bc2a01 100644 --- a/Editor/Sources/Recorders/_Inputs/Camera/CameraInputSettings.cs +++ b/Editor/Sources/Recorders/_Inputs/Camera/CameraInputSettings.cs @@ -61,6 +61,19 @@ internal static bool UsingHDRP() return usingHDRP; } + internal static bool UsingURP() + { + var pipelineAsset = GraphicsSettings.renderPipelineAsset; + var usingURP = pipelineAsset != null && + (pipelineAsset.GetType().FullName.Contains("Universal") || + pipelineAsset.GetType().FullName.Contains("Lightweight")); + return usingURP; + } + internal static bool UsingLegacyRP() + { + var pipelineAsset = GraphicsSettings.renderPipelineAsset; + return pipelineAsset == null; + } /// <summary> /// Default constructor. /// </summary> diff --git a/Editor/Sources/Recorders/_Inputs/RenderTextureSampler/RenderTextureSampler.cs b/Editor/Sources/Recorders/_Inputs/RenderTextureSampler/RenderTextureSampler.cs index adb4fd0..506acc1 100644 --- a/Editor/Sources/Recorders/_Inputs/RenderTextureSampler/RenderTextureSampler.cs +++ b/Editor/Sources/Recorders/_Inputs/RenderTextureSampler/RenderTextureSampler.cs @@ -323,7 +323,6 @@ protected internal override void NewFrameReady(RecordingSession session) void ShiftProjectionMatrix(Camera camera, Vector2 sample) { - camera.ResetProjectionMatrix(); Matrix4x4 projectionMatrix = camera.projectionMatrix; float dx = sample.x / m_renderWidth; float dy = sample.y / m_renderHeight; diff --git a/Editor/Sources/RecordingSession.cs b/Editor/Sources/RecordingSession.cs index 3e9e73e..27b6d7f 100644 --- a/Editor/Sources/RecordingSession.cs +++ b/Editor/Sources/RecordingSession.cs @@ -16,6 +16,7 @@ public class RecordingSession : IDisposable float m_FPSNextTimeStart; int m_FPSNextFrameCount; + internal bool prepareFrameCalled { get; private set; } internal double currentFrameStartTS { get; private set; } internal double recordingStartTS { get; private set; } @@ -61,9 +62,10 @@ internal bool SessionCreated() try { AllowInBackgroundMode(); - recordingStartTS = (Time.time / Time.timeScale); + recordingStartTS = (Time.time / (Mathf.Approximately(Time.timeScale, 0f)? 1f : Time.timeScale)); sessionStartTS = DateTime.Now; recorder.SessionCreated(this); + prepareFrameCalled = false; return true; } @@ -86,7 +88,7 @@ internal bool BeginRecording() AllowInBackgroundMode(); - recordingStartTS = (Time.time / Time.timeScale); + recordingStartTS = (Time.time / (Mathf.Approximately(Time.timeScale, 0f) ? 1f : Time.timeScale)); recorder.SignalInputsOfStage(ERecordingSessionStage.BeginRecording, this); if (!recorder.BeginRecording(this)) @@ -179,10 +181,11 @@ internal void PrepareNewFrame() try { AllowInBackgroundMode(); + currentFrameStartTS = (Time.time / (Mathf.Approximately(Time.timeScale, 0f) ? 1f : Time.timeScale)) - recordingStartTS; - currentFrameStartTS = (Time.time / Time.timeScale) - recordingStartTS; recorder.SignalInputsOfStage(ERecordingSessionStage.NewFrameStarting, this); recorder.PrepareNewFrame(this); + prepareFrameCalled = true; } catch (Exception ex) { diff --git a/Editor/Sources/SceneHook.cs b/Editor/Sources/SceneHook.cs index f3cb025..b643163 100644 --- a/Editor/Sources/SceneHook.cs +++ b/Editor/Sources/SceneHook.cs @@ -6,10 +6,18 @@ namespace UnityEditor.Recorder { - static class BindingManager + /// <summary> + /// This class manages Recorder references to GameObjects in the form of key-value pairs saved inside Recorder assets. + /// </summary> + public static class BindingManager { const string k_HostGoName = "Unity-RecorderBindings"; + /// <summary> + /// Retrieves the GameObject bound to a specific key. + /// </summary> + /// <param name="id">The GameObject referenced by the key.</param> + /// <returns>The reference associated with the key.</returns> public static Object Get(string id) { var rcs = FindRecorderBindings(); @@ -18,6 +26,11 @@ public static Object Get(string id) return rc != null ? rc.GetBindingValue(id) : null; } + /// <summary> + /// Creates a new key and binds it to the same GameObject referenced by the specified key. + /// </summary> + /// <param name="id">The existing key from which you want to create a duplicate.</param> + /// <param name="newId">The new key to create.</param> public static void Duplicate(string id, string newId) { var rcs = FindRecorderBindings(); @@ -27,6 +40,11 @@ public static void Duplicate(string id, string newId) } } + /// <summary> + /// Creates a key-value pair in the Binding manager to reference a GameObject. + /// </summary> + /// <param name="id">The reference key.</param> + /// <param name="obj">The referenced GameObject.</param> public static void Set(string id, Object obj) { var rbs = FindRecorderBindings(); @@ -74,7 +92,7 @@ static void RemoveBinding(string id, RecorderBindings rb) Object.DestroyImmediate(rb.gameObject); } - public static RecorderBindings[] FindRecorderBindings() + internal static RecorderBindings[] FindRecorderBindings() { return Object.FindObjectsOfType<RecorderBindings>(); } diff --git a/Editor/Sources/_FrameRequestComponent.cs b/Editor/Sources/_FrameRequestComponent.cs new file mode 100644 index 0000000..cff885b --- /dev/null +++ b/Editor/Sources/_FrameRequestComponent.cs @@ -0,0 +1,105 @@ +using System.Collections; +using UnityEngine; + +namespace UnityEditor.Recorder +{ + /// <summary> + /// Base component used for requesting a new frame. This class uses coroutines and WaitForEndOfFrame. + /// This will not accumulate requests. All requests for the same frame will be merged into one request. + /// Thus, FrameReady will be called once. + /// This class pauses the project simulation (updates), waiting for the GPU to be ready. + /// </summary> + abstract class _FrameRequestComponent : MonoBehaviour + { + protected enum State + { + WaitingForFirstFrame, + Running + } + + /// <summary> + /// Used to cache project's Time.TimeScale. + /// </summary> + private float projectTimeScale = 0; + + /// <summary> + /// Number of requests submitted to record a frame from LateUpdate. + /// This value shouldn't go over producedCount+1 or we would be requesting + /// too many frames at the same time and end up with copies. + /// </summary> + protected int requestCount = 0; + + /// <summary> + /// Number of frame we did record in our coroutine. + /// </summary> + protected int frameProducedCount = 0; + + /// <summary> + /// Component current state. + /// </summary> + protected State currentState; + + protected virtual void Awake() + { + requestCount = frameProducedCount = 0; + + EnterWaitingForFirstFrameState(); + } + + protected virtual void RequestNewFrame() + { + if (frameProducedCount == requestCount) + { + StartCoroutine(FrameRequest()); + requestCount++; + } + } + + protected virtual void OnDestroy() + { + // Restore timescale if we exit playmode before we had + // time to restore it after first frame is rendered. + if (currentState == State.WaitingForFirstFrame) + RestoreProjectTimeScale(); + } + + protected abstract void FrameReady(); + + IEnumerator FrameRequest() + { + yield return new WaitForEndOfFrame(); + + FrameReady(); + + if (currentState == State.WaitingForFirstFrame) + EnterRunningState(); + + frameProducedCount++; + } + + void SaveProjectTimeScale() + { + projectTimeScale = Time.timeScale; + Time.timeScale = 0f; + } + + void RestoreProjectTimeScale() + { + if (Time.timeScale == 0) + Time.timeScale = projectTimeScale; + } + + void EnterWaitingForFirstFrameState() + { + currentState = State.WaitingForFirstFrame; + SaveProjectTimeScale(); + } + + void EnterRunningState() + { + currentState = State.Running; + RestoreProjectTimeScale(); + } + + } +} diff --git a/Editor/Sources/_FrameRequestComponent.cs.meta b/Editor/Sources/_FrameRequestComponent.cs.meta new file mode 100644 index 0000000..60584e8 --- /dev/null +++ b/Editor/Sources/_FrameRequestComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6afdecc9a1848f246b874d5c6e241268 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Sources/_RecorderComponent.cs b/Editor/Sources/_RecorderComponent.cs index 2128c35..d413b73 100644 --- a/Editor/Sources/_RecorderComponent.cs +++ b/Editor/Sources/_RecorderComponent.cs @@ -1,23 +1,38 @@ -using System.Collections; using UnityEngine; namespace UnityEditor.Recorder { - [ExecuteInEditMode] - class RecorderComponent : MonoBehaviour - { + class RecorderComponent : _FrameRequestComponent + { public RecordingSession session { get; set; } public void Update() { if (session != null && session.isRecording) + { session.PrepareNewFrame(); + } } - IEnumerator RecordFrame() + public void LateUpdate() { - yield return new WaitForEndOfFrame(); if (session != null && session.isRecording) + { + RequestNewFrame(); + } + } + + protected override void OnDestroy() + { + base.OnDestroy(); + + if (session != null) + session.Dispose(); + } + + protected override void FrameReady() + { + if (session.prepareFrameCalled) { session.RecordFrame(); @@ -55,17 +70,5 @@ IEnumerator RecordFrame() } } } - - public void LateUpdate() - { - if (session != null && session.isRecording) - StartCoroutine(RecordFrame()); - } - - public void OnDestroy() - { - if (session != null) - session.Dispose(); - } } } diff --git a/Editor/Timeline/RecorderPlayableBehaviour.cs b/Editor/Timeline/RecorderPlayableBehaviour.cs index 788421f..d5081b2 100644 --- a/Editor/Timeline/RecorderPlayableBehaviour.cs +++ b/Editor/Timeline/RecorderPlayableBehaviour.cs @@ -57,13 +57,7 @@ public override void OnBehaviourPlay(Playable playable, FrameData info) // Assumption: OnPlayStateChanged( PlayState.Playing ) ONLY EVER CALLED ONCE for this type of playable. m_PlayState = PlayState.Playing; - // case FTV-251 the Options.useCameraCaptureCallbacks is enabled - // too late for the RecorderClip when recording from the timeline - // to workaround this problem also enable the - // CaptureCallbackInputStrategy if HDRP is available - - Options.useCameraCaptureCallbacks = CameraInputSettings.UsingHDRP(); - session.BeginRecording(); + session.BeginRecording(); } public override void OnBehaviourPause(Playable playable, FrameData info) @@ -87,4 +81,4 @@ public void FrameEnded() session.RecordFrame(); } } -} \ No newline at end of file +} diff --git a/Editor/Timeline/_WaitForEndOfFrameComponent.cs b/Editor/Timeline/_WaitForEndOfFrameComponent.cs index 9a6bf29..6ad8840 100644 --- a/Editor/Timeline/_WaitForEndOfFrameComponent.cs +++ b/Editor/Timeline/_WaitForEndOfFrameComponent.cs @@ -1,25 +1,23 @@ using System; -using System.Collections; using UnityEngine; namespace UnityEditor.Recorder.Timeline { [ExecuteInEditMode] - class WaitForEndOfFrameComponent : MonoBehaviour + class WaitForEndOfFrameComponent : _FrameRequestComponent { [NonSerialized] public RecorderPlayableBehaviour m_playable; - public IEnumerator WaitForEndOfFrame() + public void LateUpdate() { - yield return new WaitForEndOfFrame(); - if(m_playable != null) - m_playable.FrameEnded(); + RequestNewFrame(); } - public void LateUpdate() + protected override void FrameReady() { - StartCoroutine(WaitForEndOfFrame()); + if (m_playable != null) + m_playable.FrameEnded(); } } } diff --git a/Samples~/CaptureScreenShot/CaptureScreenShotExample.cs b/Samples~/CaptureScreenShot/CaptureScreenShotExample.cs index c7bba09..57bed0d 100644 --- a/Samples~/CaptureScreenShot/CaptureScreenShotExample.cs +++ b/Samples~/CaptureScreenShot/CaptureScreenShotExample.cs @@ -49,6 +49,7 @@ void OnGUI() { if (GUI.Button(new Rect(10, 10, 150, 50), "Capture ScreenShot")) { + m_RecorderController.PrepareRecording(); m_RecorderController.StartRecording(); } } diff --git a/Samples~/MultipleRecordings/MultipleRecordingsExample.cs b/Samples~/MultipleRecordings/MultipleRecordingsExample.cs index 1e86ca0..32b568f 100644 --- a/Samples~/MultipleRecordings/MultipleRecordingsExample.cs +++ b/Samples~/MultipleRecordings/MultipleRecordingsExample.cs @@ -91,6 +91,7 @@ void OnEnable() controllerSettings.FrameRate = 60.0f; RecorderOptions.VerboseMode = false; + m_RecorderController.PrepareRecording(); m_RecorderController.StartRecording(); } diff --git a/Tests/Editor/RecorderControllerTests.cs b/Tests/Editor/RecorderControllerTests.cs index ee33a5c..efbfc5a 100644 --- a/Tests/Editor/RecorderControllerTests.cs +++ b/Tests/Editor/RecorderControllerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using UnityEngine; using NUnit.Framework; using UnityObject = UnityEngine.Object; @@ -7,16 +7,14 @@ namespace UnityEditor.Recorder.Tests { class RecorderControllerTests { - [Test] - public void StartRecording_InNonPlayMode_ShouldThrowsException() + [Test] + public void PrepareRecording_InNonPlayMode_ShouldThrowsException() { var settings = ScriptableObject.CreateInstance<RecorderControllerSettings>(); var recorderController = new RecorderController(settings); - var ex = Assert.Throws<Exception>(() => recorderController.StartRecording()); + var ex = Assert.Throws<Exception>(() => recorderController.PrepareRecording()); Assert.IsTrue(ex.Message.Contains("Start Recording can only be called in Playmode")); - Assert.IsFalse(recorderController.IsRecording()); - UnityObject.DestroyImmediate(settings); } } diff --git a/Tests/Runtime/RecorderControllerTests.cs b/Tests/Runtime/RecorderControllerTests.cs index 36b93a9..a905e96 100644 --- a/Tests/Runtime/RecorderControllerTests.cs +++ b/Tests/Runtime/RecorderControllerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using NUnit.Framework; using UnityEditor.Recorder; @@ -7,13 +7,12 @@ namespace UnityEngine.Recorder.Tests class RecorderControllerTests { [Test] - public void StartRecording_WithNullSettings_ThrowsException() + public void PrepareRecording_WithNullSettings_ThrowsException() { var recorderController = new RecorderController(null); - var ex = Assert.Throws<NullReferenceException>(() => recorderController.StartRecording()); - Assert.IsTrue(ex.Message.Contains("Can start recording without prefs")); - Assert.IsFalse(recorderController.IsRecording()); + var ex = Assert.Throws<NullReferenceException>(() => recorderController.PrepareRecording()); + Assert.IsTrue(ex.Message.Contains("Can start recording without prefs")); } [Test] @@ -22,6 +21,7 @@ public void StartRecording_WithEmptySettings_ShouldNotStartRecording() var settings = ScriptableObject.CreateInstance<RecorderControllerSettings>(); var recorderController = new RecorderController(settings); + recorderController.PrepareRecording(); Assert.IsFalse(recorderController.StartRecording()); Assert.IsFalse(recorderController.IsRecording()); @@ -37,6 +37,7 @@ public void StartAndStopRecording_WithValidSettings_ShouldStartThenStopRecording settings.AddRecorderSettings(imageRecorder); var recorderController = new RecorderController(settings); + recorderController.PrepareRecording(); Assert.IsTrue(recorderController.StartRecording()); Assert.IsTrue(recorderController.IsRecording()); diff --git a/Tests/Runtime/SceneHookTests.cs b/Tests/Runtime/SceneHookTests.cs index d5db053..7096848 100644 --- a/Tests/Runtime/SceneHookTests.cs +++ b/Tests/Runtime/SceneHookTests.cs @@ -1,4 +1,4 @@ -using NUnit.Framework; +using NUnit.Framework; using UnityEditor.Recorder; namespace UnityEngine.Recorder.Tests @@ -15,7 +15,8 @@ public void SceneHookGameObject_AfterStartRecording_ShouldBeVisible() var recorderController = new RecorderController(settings); RecorderOptions.VerboseMode = false; // Make sure visibility is not toggled on because of debugMode. - + + recorderController.PrepareRecording(); Assert.IsTrue(recorderController.StartRecording()); Assert.IsTrue(recorderController.IsRecording()); diff --git a/Tests/Runtime/TimelineRecorderTests.cs b/Tests/Runtime/TimelineRecorderTests.cs index 36cfd64..6edbb0c 100644 --- a/Tests/Runtime/TimelineRecorderTests.cs +++ b/Tests/Runtime/TimelineRecorderTests.cs @@ -57,8 +57,10 @@ public IEnumerator TimelineRecorder_ShouldHaveProperPublicAPI() new GameObject("Light").AddComponent<Light>().type = LightType.Directional; var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.localPosition = new Vector3(0.0f, -5.0f, 0.0f); + + var runTimeSeconds = clip.start + clip.duration + 0.5f; - while (director.time < 3.5f) + while (director.time < runTimeSeconds) { cube.transform.localPosition = cube.transform.localPosition + Vector3.up * 0.02f; yield return null; diff --git a/package.json b/package.json index 84a5260..ea8304b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "com.unity.recorder", "displayName": "Unity Recorder", - "version": "2.1.0-preview.1", + "version": "2.2.0-preview.4", "unity": "2018.3", "unityRelease": "4f1", "dependencies": { @@ -19,9 +19,10 @@ "images" ], "repository": { + "footprint": "31bf4b6400f779bbdd42c58d24a552a6e46ccc3b", "type": "git", - "url": "git@github.com:Unity-Technologies/com.unity.recorder.git", - "revision": "680b1b716abed7aa476f0b653e8f283b232595bf" + "url": "https://github.com/Unity-Technologies/com.unity.recorder.git", + "revision": "b97e1ca7c4f1fc85711e4f7f24ca74a8debdd1ac" }, "samples": [ {