From d49b2a563eee22923aa89ac762def4481b29082d Mon Sep 17 00:00:00 2001 From: Awawa <69086569+awawa-dev@users.noreply.github.com> Date: Thu, 21 Nov 2024 00:49:37 +0100 Subject: [PATCH] Breaking change: remove LUT from installer and create it dynamically --- cmake/installers.cmake | 20 ----- cmake/linux/arch/INSTALL | 6 -- cmake/linux/debian/postinst | 4 - cmake/linux/debian/prerm | 2 - cmake/linux/rpm/postinst | 4 - cmake/linux/rpm/prerm | 2 - cmake/windows/plugins/ExtractLut.dll | Bin 180224 -> 0 bytes cmake/windows/template/NSIS.template.in | 12 +-- include/base/Grabber.h | 2 + include/base/HyperHdrManager.h | 2 + include/grabber/linux/v4l2/V4L2Grabber.h | 2 +- include/grabber/osx/AVF/AVFGrabber.h | 2 +- include/grabber/windows/DX/DxGrabber.h | 2 +- include/grabber/windows/MF/MFGrabber.h | 2 +- include/lut-calibrator/LutCalibrator.h | 1 + include/utils/GlobalSignals.h | 2 + sources/base/Grabber.cpp | 63 ++++++++++++++ sources/base/HyperHdrManager.cpp | 14 ++++ sources/grabber/linux/v4l2/V4L2Grabber.cpp | 22 ++++- sources/grabber/osx/AVF/AVFGrabber.mm | 22 ++++- sources/grabber/windows/DX/DxGrabber.cpp | 26 +++++- sources/grabber/windows/MF/MFGrabber.cpp | 22 ++++- sources/lut-calibrator/LutCalibrator.cpp | 91 +++++++++++++++++++-- sources/utils/LutLoader.cpp | 51 ++++-------- 24 files changed, 268 insertions(+), 108 deletions(-) delete mode 100644 cmake/windows/plugins/ExtractLut.dll diff --git a/cmake/installers.cmake b/cmake/installers.cmake index d1767608b..d8f734e1f 100644 --- a/cmake/installers.cmake +++ b/cmake/installers.cmake @@ -2,18 +2,6 @@ macro(DeployApple TARGET) if(EXISTS ${TARGET_FILE}) install ( TARGETS hyperhdr DESTINATION "share/.." COMPONENT "HyperHDR" ) - execute_process( - COMMAND bash -c "cd ${CMAKE_CURRENT_BINARY_DIR} && tar -xzf ${PROJECT_SOURCE_DIR}/resources/lut/lut_lin_tables.tar.xz" - RESULT_VARIABLE STATUS - OUTPUT_VARIABLE OUTPUT1 - ) - if(STATUS AND NOT STATUS EQUAL 0) - message( FATAL_ERROR "LUT tar.xz Bad exit status (xz-tools installed?)") - else() - message( STATUS "LUT tar.xz tar extracted") - endif() - - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/lut_lin_tables.3d" DESTINATION "hyperhdr.app/Contents/lut" COMPONENT "HyperHDR") install(FILES "${PROJECT_SOURCE_DIR}/cmake/osx/Hyperhdr.icns" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION "hyperhdr.app/Contents/Resources" COMPONENT "HyperHDR") @@ -214,8 +202,6 @@ macro(DeployUnix TARGET) if (EXISTS ${TARGET_FILE}) include(GetPrerequisites) - # Install LUT - install(FILES "${PROJECT_SOURCE_DIR}/resources/lut/lut_lin_tables.tar.xz" DESTINATION "share/hyperhdr/lut" COMPONENT "HyperHDR") install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION "share/hyperhdr" COMPONENT "HyperHDR") install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION "share/hyperhdr" COMPONENT "HyperHDR") @@ -622,12 +608,6 @@ macro(DeployWindows TARGET) COMPONENT "HyperHDR" ) - install( - FILES ${PROJECT_SOURCE_DIR}/resources/lut/lut_lin_tables.tar.xz - DESTINATION "bin" - COMPONENT "HyperHDR" - ) - INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT "HyperHDR") install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION bin COMPONENT "HyperHDR") diff --git a/cmake/linux/arch/INSTALL b/cmake/linux/arch/INSTALL index 46c79a9fd..f0042b374 100644 --- a/cmake/linux/arch/INSTALL +++ b/cmake/linux/arch/INSTALL @@ -84,10 +84,6 @@ post_install() { start_msg="" restart_msg="" - echo "Extracting LUT table..." - tar -xf /usr/share/hyperhdr/lut/lut_lin_tables.tar.xz -C /usr/share/hyperhdr/lut/ - rm -f -v /usr/share/hyperhdr/lut/lut_lin_tables.tar.xz - if grep -m1 systemd /proc/1/comm > /dev/null then # systemd @@ -255,8 +251,6 @@ pre_remove() { rm -v /usr/share/applications/hyperhdr* 2>/dev/null rm -rv /usr/share/pixmaps/hyperhdr 2>/dev/null - echo "Removing LUT table" - rm -f -v /usr/share/hyperhdr/lut/lut_lin_tables.3d exit 0 } diff --git a/cmake/linux/debian/postinst b/cmake/linux/debian/postinst index bfc69a585..ecaec4269 100644 --- a/cmake/linux/debian/postinst +++ b/cmake/linux/debian/postinst @@ -44,10 +44,6 @@ fi start_msg="" restart_msg="" -echo "Extracting LUT table..." -tar -xf /usr/share/hyperhdr/lut/lut_lin_tables.tar.xz -C /usr/share/hyperhdr/lut/ -rm -f -v /usr/share/hyperhdr/lut/lut_lin_tables.tar.xz - if grep -m1 systemd /proc/1/comm > /dev/null then # systemd diff --git a/cmake/linux/debian/prerm b/cmake/linux/debian/prerm index 80d891567..38ae4f282 100644 --- a/cmake/linux/debian/prerm +++ b/cmake/linux/debian/prerm @@ -48,6 +48,4 @@ desktop-file-edit --set-key=NoDisplay --set-value=true /usr/share/applications/h rm -v /usr/share/applications/hyperhdr* 2>/dev/null rm -rv /usr/share/pixmaps/hyperhdr 2>/dev/null -echo "Removing LUT table" -rm -f -v /usr/share/hyperhdr/lut/lut_lin_tables.3d exit 0 diff --git a/cmake/linux/rpm/postinst b/cmake/linux/rpm/postinst index 305885f42..f091ba954 100644 --- a/cmake/linux/rpm/postinst +++ b/cmake/linux/rpm/postinst @@ -44,10 +44,6 @@ fi start_msg="" restart_msg="" -echo "Extracting LUT table..." -tar -xf /usr/share/hyperhdr/lut/lut_lin_tables.tar.xz -C /usr/share/hyperhdr/lut/ -rm -f -v /usr/share/hyperhdr/lut/lut_lin_tables.tar.xz - if grep -m1 systemd /proc/1/comm > /dev/null then # systemd diff --git a/cmake/linux/rpm/prerm b/cmake/linux/rpm/prerm index 51404971d..4c55df23f 100644 --- a/cmake/linux/rpm/prerm +++ b/cmake/linux/rpm/prerm @@ -54,6 +54,4 @@ then firewall-cmd --remove-port=8090/tcp fi -echo "Removing LUT table" -rm -f -v /usr/share/hyperhdr/lut/lut_lin_tables.3d exit 0 diff --git a/cmake/windows/plugins/ExtractLut.dll b/cmake/windows/plugins/ExtractLut.dll deleted file mode 100644 index d58a14a1a6401507978895e930e996d920e13693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180224 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 z zSY~3DZb>LuZ%_)>{Lfaf&QQf`Mj55LcP$K+W$TgAO%d7%HM4~G0|N!3*n_zmmJ7a> z9TBcY=9PS&Zmz@1KGygI@ngIwQ`+naWcVBKO4S}jZj3Fi%d-J)?Vsen)S){G5Gq_V zqlL@Pklo_XmnF_&ysO5~*R(4?$Tw^%@1V%Q(cwrGXy3sWPnCq(*kBwou zqjjTQ0JwRA_R2zsG>S{2kwR$9C$<}omd#*6nL2)YQMl6DXW$f)2e&aZx!$ZK z$)rUv1PYq0zg_RX1_MTYJr{d@x<4iIp zgeWsO9w~UQ-9dOR;1JxA8(wsGEG_so2lq}-f8Z}&EQ8%u`btNkbwjEDrq)8X5Z(SS zwH7`ozuB#YkWix4wH7kY-Fi>pYhA4r6kFc4RembFg7R}~*B1F%tPWm|&2KIIexi^c zBno*h#Vq94{8Gr}U9wS$P4A)-T-dwX3vznqAd^UG*!}}07%DP$|7dc&l$#`L)3`s6gfahM_E5_ml1%21 zm^R~-h3L@KJRazSY-cnKh`ix@QqP%|1@jTYS+sVMlmP!1=kmDC>OL$)ElrNB4}3`} z4rP&@T);<9pZ}st<43f(P9LhO;y~3T`Zp|p1@E6pINSx&8&-3#jGF5bt=7{DGXn&r zK@HzfCU#Ow&=b|w{a>uT4SZC^xxl@fY{HUk*dPf8K?xFCYQ&-u1(#?7EKntNBa#r6 zk6KMJYOfb|L0bYzH_>cPx8>fez4oeowb<4cYiX-|SU>WCNl>amY)yn{P{c_O)u=QC z#q9fk=A7LG_1^aV{oed?cFvhI^UO1I=Hr>?Yu2omh#Mrrrz6 zaNLp_inUMZ3?)8W*lvxMMdDrVE24f+oBv}eA}SKi-l+d$C@T3H(UOmkq8){2l%v*gR@sGi6O45u9da@nrSDXGtEx z9t~IbJETcTA^ckwxp=EE0SwP~^w6!+v*?>np=MOEW^s9}UQCSGEvfUZ$Q7-RNEh8= zz2q=xSu3#X5qlmHKbDCd&qOh~9Iwu2k*pfOGBQ&Y%j(e9CydCY>Q886tP$@je<}h} z!2qj=k;kY#yQ2ve1*n6wySRZyOA+5SDLNJXg>zE*)~6z&2|rS zhWdy;w$C2*B&AiM3oz6Cy3GC}8fBnIU3Uk_CsPmfvP^R#BV8Ps)k$ev_wggD6RMBS z%kHckh3tZZfikpt)w|~sHHdZx%Zn%@wvognUO5>=8)P;?c7kQs+4XAt1r{l75q^FJ@@tVU9!tLx- zgE@7v(2kltYX;D$*nKhr>5Ij-y$+@8m9&?5!HZF^y{^+UM>^wJ= zyvR)Fx!_>ktKNJ4vHi+SUrf=iw$vLIf@M?aLn%3Uc};c95pq-Z#dAmFj`?5^ONwAJ z)$=}w`p>TXMBO}#MpQ25T+|n0F0>#zfY^t+5^MmxPh1be$>DQpQE;`}T-Imp%kYYI zb6Dh<**Pvf#H70JJn!#HGMkSk8Ev>GYFKX$tS7FS+kbrlxpBw3%Z5$IQ&aw3; zWY;Qes=~$0whlJ-O|50>5LBC?o{|j_KKYEg1`9 zTO~hz?{-p_sqaYo3NbW}_Y>jo6ub(%;^W3-GiPpL&^ga|IeJ%uD0^jL@`sJ7&}T=Y z^El`&pv29erJ)o`3#jn`_5g3N1-mquokLrndHHJ=m)FO}NQVC zMyWO!FJ`o`)tRk%f~QooB=rwgBzHBAL$ek02la$RwOJO6Wr{%~lgUqsB=}DPAq|_% zUafc#2&lOX2y2;;ufi9cY^0VOLncjj6RDAb8Kb1B`peX{JOkHmbtWvs;Y*RW6V))B zFva3zko_uPzxtW=s>-qJUfIh%#o(7EWR0}9+RjTBM;UaOlq``bya%E9C4iN9w2jRY zKx#R6;I3{YyESk2jb=8i@~o*5ilO~wUZb-^*$@CfhQXAe8ZMTRBc_UR(gB_wP4v0- zREP&T%0TFc`z3pPa>aRVcRA-fpq4Y6Io3@l>JyUM$aaXr+lyt!rO*}zCZHb`d~)FB z1KMC8dI@JtF>hTXH|$&RDuv<=(plfo+G~wbJ`V8ys6ftSJJ4ZtM9vhZz9kdGgG_Q9 zvVe6MIq0nvym8>Af|dgvJ|?vl{T#0lO7Z!R2Y-hewJ`{b&-}UgI?5Jo=VC@GfopmO0+Ne&YCcKl6%pa z<6pf6*+Xc=P=b?YEmNJ43uWpYhH#nMdV&1DI8%OKM#Ge)L#*NG(La6_81@KV^9-|n zv?Qk1(dOHoGTERQmnK?uBKn02>4?{KgkCpp(xZ;o5+~*9 zitAd2dnZ@rR^+p}bsy-k$Vz)y$SA_D%t-C`HoHUF<uEx3S`h8)awhSy zOw;UF(pV!!T-}!BQ2Y5r7HM&mZnsJ+aT%ZFf7Ix@95rFqlPoQnr=O%Zq^Yfv`dqUU z7p||V->^)wM7pcSt0S^v4y4r3PD!}XI5Tdbgo*4Z6j9kUG8&7J=+;|&GVavCNE-{Q zKklbTw$00OSm#o=&2u~2=1tP-t``PW-OfoRt(BZHx*(8~~5cY7l1NP<%sQfk;Ra;XSn zY+cp1xK|(x9^k@PI6}q$6lR$PbnBM@tsht!9A%8sN0q8IjPhZ6R5S*SZncFm8e8Xz zt`l9uG9$1g`h7VsB(OLTIaB@gLPpg(7wVv_sej|axLeu=!NX%on9p@2Mf7vq{H!Dh zfrJ(tTqIOewaPc{bWgNO5y3$Iiziyhj2fhOhifd3-4@e7E}IuNo$D_iXh{zBMO|a3 z#UN%2Pw}(i4Z}6omlQe>HeKtpqT6FbLqiZnCpfq4*EReF_lx>OtJZJPaseK!ej>-o zhmsg7mSKU2kh8rzFRElvWK{YtWc0R(orrnVyEDnVb9BC#7@W31da8O0UR{1-z~}d@ zz1aIZB=`fNGZ&g!YFvTt)4648!*sed=x3Kzxnr|>nLc9K+pP^lx0#`SNxhc-?q^0w7MY3w!)6E=fT=z)5&gcl;|8(AXaYe z9S^iIDOUxe^}Wz#Vv+eYi}M=GTy!QAy+r+rC@TToB~sr-%4og3jA+YFJaou?^pO1C z*CoFXy(Yg;b;|Fv`}oC-bWjJ;V>)=KLkIPHbnuHN9sKqgf(L)B9itdxJ*s%tW~9ft zY1c*CW~7n&BSZ0&9Hg?ek$-xU}sPm`&fnOuexiPTz>#A#^u zCzIsBh)_Bc&QE#4CqK{Feghwcu8g=xBomtBD=g_@1_f)Urr}=EIxZrE(6;fyGrhQ8 z@Pg_fTY+ANVR0QmpafkQdRD%c`8uorx=fGSqht(4Nq2 zbl}C(fh~UscK>0z=DZQl3$hFbzsl)GGuD0>E&h9W5O3*K8Ov9+Mr#*PM%9=K@!L7I z8GkginCpdSNN+b?nVJhq04j~R)vrh_gF~W*2M3MK`0&t+@sztTSJg_YwuO^;$YB7f zL(IUmVd}1XS$O8!CX7+ExIgwU zv8D)EQ#2%*S(;zNh%(|5WeFY)m40&r$3Lz03RjM_lE8^?)|HTD+RX|En zxl+_GnP)BJ*T##YCky)2CqrhIe+g)H9B8k!NNED-*>RvUuNJ!ms^J9kAEE63HONyn zWIah+jAtY;Rr4cqC@=?n+yTR$n@EGKFx*sBrL-3NKyJ|_0v!o?BlR(*x_P7}Y!$x!8j*F_?WrPXhdzrwZX4=68v#vXNgme!W@ za5qF2qpm>SjROQI1$%jMhmU0%?%I=ra4@Y@onzVgRmAR?tIn|QV|UC{qvE$0t5Zlp zKsa{CZ1rLMcDgzmzdc_ajNcZi&iL&D^@4r7eKqw|J9)x|+Hi$ZtU6N_sk2>`ItHXv z6_Q_SO%jVcFHIsz1_MfF*7zJFv@8b~1*dZmkqSeEbJkFWPgC{5tU@8|VQAlpGXXY$ zKNT`g^Qo7tWGW&iO=4hG-Ooo7TcIh~3f0Q~M7ZPQWSx^Y>bFFdsfYL)GBd=Df{ejL zzOw@AO40x{J-Xa^;^4%CQ@hOX>DN^;jFR*_v@j2vH|V-Lm9&{dmFazl$9OYtJtVv_Z9$|i z_y?4e#-~i`nG;a|!yKZkIZF0rLG!x_Y@gS&OYmE9M1PJBosDRAz{cwV(v+!pc~fD| zjw37k6_EAD6Rnp-X19&x3oK6{`Fl$v4@$gM-H#3#gv*yV=t-LCe{0Z5R!OHf=qHfe zUu@710W+dO#iH}{2JIxKOr52x5^vB67Op8au89WKjj2bG)t2}cwVU%QpbR(XT_c+F z4qalfGTxj^htbR~x0_SufpYZ|-c*={@#ef#XAF7ciN4D7aC5F_J*7EsBoFJ?E!Ccz zc+Dxpu!GolwcX67Z4OiBR=aCkZdJC>g{eI*@!9F%uf${nr)wg$$Ox!~W+T9l= z((qbJ$ak`$TT003!jI4%aLwC{NzvR7fMTf(<0?(me>JP@CY$s_W%yECWq7G-p)1i2 zbeO5cO`_WM_07f$d92D!%7GVgr6Za?rR+^zc+>fYrKXjsKIAiq z5n%9a5zyIuc{z$Nqg-8vI#rXd#7yLMRh^y>^7g^U78>+BOALwr0CPeoTI} zmi1)i7y;gU8rdeQ(xPH*Lx(L;wq}>))G)NBb*^gGCDK!vU}cpWruuX?QPUQ6Yu&GzN^X#H>ZD;S0>>7sFxIS0SACVoMX{ohHb}Tn*AmB!<9GfO;*EWR3 z0-;ELa#$>@yvlhxgnz1aEj&A|uB1AcQ*>K@RZjAuU{Pt*Do>}8!EtQN&%a|eVlkI3 z89io~)y{cw;Pr9fwCU-!GPSHM{c8+&T|wQc%B!YUJTD#h<89lW*i{LJ+9SYM%bt@V zA?nur;F}yZVcqSKx+86_9g<9;-j%|)(YZ>6#8d^$3$T?(iwH%1o7JeG3128q1Y7nx zZA*XB!A|vkDAQb?5WNuXqs!ILbOfg^^sb+#CbLo{cAn?}s8xA-9XML1S|?BmM$JJn zEsk$NpP?m)>oQ*zCdl)vpSR>QwrT4uJ{NCuVkz6%;#zjCwL@|ugf?vz&rM>&SfQ<3 zb%k#AyK_^owZeyLt0%xF?i>qJZft{xbEgt8(&I3K&n%8C!Yx>W1uyD2vNfAz zVcfv7gUouRJF?OfSxLga`vvENm2=L~N#?AK<9sJ6!D%BnH{_TH5MVE*IAjf3s$7?r zI}+n9cr>X{N5s{M!(2>f8%Fu-7NCnj8O<25M#m^iJ!sKYi7H>M0c^DZq{b_Oy}H%O z*=ZSP&O4*7pP_FDQ7*cGr+lB{>H|OJ zY+MYlmJuC~D*%-o=NXM{N=3mYzXkX6fos(A^E8iss)lCAZy))5~*Gyg@Sz4$~Yq=m0zeQK3w`KrCR zxQecFCU=XP^MA@>k4A!@~7@XN7_QT_SpT< zSi?Li&Evz5CDQT8eUCD8;xBM&qjT=pgJ;gYAvkXCWkGLgxw=iJ?+Wcb@Et=ZYjif$ zZzK8K%h2;*yQ*aP)X@Es*VO$esM2hGa-fe< zFR9V&&UZJTOo~Kr<0!s0kynPsc%``GE%@{Gs^+o8u9@z3Qe+W} zJdWrp(Vicrg%4&{*cLaOF+$wHVGmci%;GYY#FU27^ah58v3N-&-B`RBOZhaER?1?R zs?~&smxeNGh5xZK&R^G0l;mV*a=pcb5IKW!shN(vX)Bt`6{5zr!G-$CrRu-rIWExF z^PlDrR-w5Hp$z?V9lS>L#YJaQPtCA0FlsO9S5u|E{l}l~`wWG3jyCeBiBJ*+ukyv5 z^J=P3Vf%qNHT;Mm_nFZmlegw2XCV@at#_*lQgYkEEJvL5El0b&OMq5$q7DM4fLg^` zW$iK2!j&Gh5VLS4&o5paSb;5>nMR5VeyAR_@|HziS8&uahF7`&YIY%#_Mo$DxowaR z8}2=hF9nMf`LNvBEZwat8UeqzYQX(5B@94wXSX zli3GWAZdA$asp}tQ>vjw12X=Eov;4$Q5o%UR#yvWb;%PXfPXhrckGul(+5wy{sdyS7~ zo*y3k?DXhPiOvoWoFRVK8d4I`E9G0Xbg0`J4!iBuF1^swXMr&vr^|4`C8V0fGo1n30>L4VYIGj z{V6G^jF5Z*p}DS^!dzgzqPvzQ-j&66O1+n=VzzkUJw;@JqL7rsY1W95WIWvjoh~oB zXoB&Qcjvt&Qqn*R3X?VN%*J~&P66Ef|Fai?^jnZag}-szw%GD}i#ec#F$KS#-n4@Vj}XK4B5!0oXW_iNw6Mp&AZ97ZQHg!IjvLFtKqX+^Gk4(p7Wv$b0D3r z|D84Ct#si>D#-#8YO1MzpFHme&$DRosoov4Ia%I!a>LkY*@XO8l3y>bNpsB;4V@Dh zQP#|Mg#H>`c-HPAaH?^;i}VXlTvqQQSz=#yx1h!dTh#Y$+G$RqOy=Htu^*G+@hss8 zjP|l5GQ@86ADJo2<2AiB4VvQ=Vsr$3jm1o8!3(`R#xmvkIyX#?uAGqkM(rokx7VG~ zcuxnZ@tN-3QS6-W>s)`7DGE?H`O4y-Oo2U7P|gV?q^b37E@5 z)S%RFda6>RTV4a$s!Ag%dQDPg#2NiYl9&*EP^NNOq0H1W^^{bvN#yj_q_P9j(q3F( zuVk@V7cTSdtYSp%Qf z$DkfCT0N)%m>!a^8>fCGPv?qu_ErmAa@F|d2?h_#DP*}2;6I07S#?V? zCm^^lk#k})SSbzql`BxM9iVEH*8gR-gp?INC*%Dgz99nvBbMw#bjGcs>>bPQmD@wy z##PU#_3p>tq<=PVSQz}u?t(q~b_%-X>b&6i8A&|jS_bkUO@30sio+tsG-k#udGn7M z-$p(i^v^g0-PhoIBr$t;|K0*OF8KP4-*Ox5l$N&L^0S;8 zn2RjzmyE>ToH2}efra?_lHsfTm}4!(X%rOhEyS%x0q1F(!OOBC)R?1A2LVz0iA)JW zPwgi%`h%{E4vL{0z2zFUkn~1%UIoX0ymX@5yW``DdvR&}ikt*;;;&Ofx#*COqPr!B zzv?K3+lEoE&Ee+cq-;gShbb4zf+bct=Q2dEEK&cSRB1RFOO^Pn`A7cC`%gx*u0+|1 z_o2fpqw|vB2Wu2dft!5{NWxIZQ#FGNM$T`*tKeXMn`|Za52C~`M*ynn#3FXqT$>Q5 zsAcz)kDh-G<6z}MYBE@{lx{y(oymjjr|tI_!fZUnlsX6;^$xU*wIgwttM}hvT;k&6 zD53FIJd4q)c~lxdi?}L_nLqRQ(Uu9u>wQ3ga=9wK6e2 z=#VX37b2pA!EE2qy0Q5uqAp*VjMFoyB-54%BH6pdvX4`l`lhYDGSy*55}qb^3BAnl zvBgpUE~fL_NLCrH{u|Wbe@kPbpDW8lBll%SL3F+=xs3+e<;Z39^lwZu(4~G4tR7J< z_?z_gZz6{8#9ApUJce~AIsQ0&awvF3L_ zGWFKZ*cN_A)~!*;q+QLKSUiDqFs>x*1hY!Vx3A9EXjbAWo z=8PXe?G#Y-_A>1I@0OMW4T!x-Vk7iRc}5pU1TsP&ukA_b{#v9z(#&9~al$xPR1l1uU>P8X1TzK}a~M7)3w&vILj(VOhYGBt(DYkAmsCd6SeAa?a4 z@vyBYXy1pWeU1NzZh!L;u@ET3lvVFwW3vRF+SS4HY0C4`tY4(cgl2Q7)skC2Td#n< z*apiK%;xiyY(BNhl-4&B-S%076k!Qo54`*@>gOY6xKIrWENij?_+puNXUKLHUqGYr zfu>S9@s2p$4RN5waosMvPFaBzNo2nc^mKA-h69x{R#s1Php!oDOUvAI0xlpliA(Y0 z0z;?6%&IC`lxk3%fv~ppYG4zfIHN|>`D~&AgtiLwty1n*DQ>G(bk+1VP0}o9|4h?U z)m>An_vsD`e<%Wn?lso8JJJQ}I)id!GlK<~sZEmMV* zYPq{r3%lbx40T->6KEH7l0F&BJPY@3$}0LP!jKzg@-XaR<41Wi&5ku}!vC2I}HN+e0K9$XFdy)Hx(v?bj<@LF@rnuxQB#*i^ z+pTXpamV0m362Y|#>BPBWAyE*1MM&R zv9cR+rN9LCLdMNLOKSmhj8?5xY3VK;c#%^aSxj`FlFlM;Z125Y| z=$O;SG7@L4NBAgxYVQNItsZ9E*_~O#3~}0eJOMKFuBX3<8>Qey@C1d>A7in7JX`jw z$D9}{OQMe@k!Y%nf;$w0i)SqKgxzABLuZMp|4Y$Oc7zQ3^Vj4GE`+M} zRR4&ZpXj8!5gUX7nZe{bwktcUoL8pBJCa<_3cHb>EFj!oM`ABfQ4%Q_8C zQS;->rb|5Bi0dBFl#Q0Wr#=BY05V&fzxh{ieHMZ{vB%35-@6QCeLj_p>RzoHhxNQ)o~Rrv7r z#2j+0(e}7(9}$7koR>Toqk@5EoYo9smfYNzUUS&l*c|T;B|yzw{BszKd$N3k^zzK*{i9RapqXbFsaq^} zGO1OcE$^R_I#SWa(m{qcz(e*EC}vyMr0HeqHCmVH-<&DUU9KwQ6VBPjA`jrwsbzM# zT1wdgb)Ohbi3UNkmTGpXJwRH8s18o4Q#A^tR^0{4s*=$V42{|)tE-vnYpWh*v~88n zAy#w$(aB=(*eV@Hz0E!Jm~HwJ%CB;jMP^Atb?b;!&zzo01p8R|6~vxv(7X+;tPow8 z8&LId4m8nWyx#mtYUJWwMmt2*tsS!s*L|9NTHuCi(Z{6@ajqCBwlCCVNw{tHqS_(h zwS;~r=LTTb0qvls$-wv<`;>wK4K{Xhs=7ND!cLH{FkGqOrd$Xm4}=o^Gd$!8b;a~Z zP@@IqX_CxQG0b?ilE?KT*yb>#tvE}^Awm5bsXj{ylf&$7wv5FC8l_gkLy4pg(*>DA zOBiE(o_f({41O`gjMFmc)Ib-e%9kYm^ZW3|z7+cZlHtMAGFS>~oIvQU6TgVK%M>~} z#^A5PlqH+$BD~ORiB_fP`I_|-#mZ*1~Mh<+6%Y*6I>+Fz88%K{aa~}Rz zX3nrcMN43}7)=%3BgT4~QRd+Qz%QqYZlwBqTOY|Iy=|(_7w(VYAZGDKI2XzNF{jZ` zM?)nZYDPW?d0@XOgOjs(`pVk725T78FdoN>S#f_XDSX#)VP%${ia$4J3LpBfvF#6% zTP=}AEj}3Neb55s#@)ibWuCgNa5f`4c(bu^BTp;CEQ}S#-5MX1n&fdD{NH_4Vu$2V zFEFp7CvbO-l|7!Ka5%*ybiay<*!qoX`f%jg+)6fGou;5)02di|9w1! zMmk%pLomUkI4}0k0-``|ApjZwsqkhRZoIKbYgsNOL^DIaUHVj17K)-nYv!$ z?H#1dN-~Cm<7-d4|AC787&)P!gPy}U7F`MJt5Sp7^?G$>Rq?};fEs3_s*eO%V zv{jjMXnf*d=yQ7Gg92KFrYhzkv|BZ4b)=U*9HgXA8BZNjl>`(822+WY5=C>IA z`-iHQ#V-CwejcrpKj{pE19DV*FTPvaCi%=EhW&v zb!%25WWk-8g-3wCZZtML9Wmk0$<8WaA6a`Whp{@$b4Pj$A0L``KRl@|*F)rc>bC_5nes(UTdy#%Vky zz#Heq8WxPFw1z8Vm_CNyF?6*pV1{mp{8tQ(k%c;l-m{vFeRnaR?^lTKe%Ee+kItQ0 zUKV-w7$wJ96vk81avEVnOAt4eM4l4VBF{=4eeJJ4eB2NiM#z*Y!E;SyK`}~$j zy>8-8yFF5)>z$2DE}|v4zNy>6vz z!qgco2v*w~Z$$3X-*{;K<>n~cV|a4E)kwY*>!un}-3#pR4KQhrw?s*!tZ{bWuMN*HhJ@;7(e z$#fFK`l=eH@6EMW+6{aln4kZ#(bb4Bga#h3yPDn6Oe>3ph7C$Lw(nEi2Fn*4>N`r{ zJGpMI^(_+k<#*V4y|R8vdFhB+YE(wFPVg`0f_SHqA#JyBBLB;KMgBdHNHUbOmX z{>yx5-J5;Q8w;&Y=4)S@Pa?h#*DbK7m%hPIsoY0o z)6+yGSYH>pw_dUpVKXZA*MpBfkb%HYXYPBREY_`+Nmfjq*4rQkBnB{yA8HtO89$O( zp_({+$IbL6#CewJ98bnZelilF;B>XIJuYDS4<>t~O|QF5bVu1jGWotm>QQY@^cl=| zIU~u{Fu~lH-z{?2{Yacq1{~Yy8rLA2sKG-b>H5&jO+>sTYx@UI*p$}New39ssUZor z((ffFk|a-6plyLO=2&hvP=@LUgQ|1;{*6}9Xs_tIoLlfOvz0|TyaX>VGDjq(;W#SX z;`DBF<#8ShJeOEwDsk-0o!+gkymff+WTfP>8`Pjg5T$)3ip-ZiUV_QS(eqd!XQ?1% z+tYf(3qnTkm9u_DdG-voeE8jMyfaf^maY{sonLf`5tprl2PWqsmc_z&t_@DQa?UdM zhBWVvq=5zQ2`Iy%R@-9yHQejW@4WK!vNEG3jw7cw4lhV7kgR6Wk|S!o0ADeQ)=$Mp zA?J{BMptZ(KewC&S!@>s2iFU%W)8G|OJG%sg|q*-Y;Ar(WO9>G%ZuHg$mj192Y4-d+NS@?2Ms4C$>QeCvQ>MQCAAF6_anZS^ zOi>1T>xh(=Cv+cjAv7jw<7|iUwh(|AC)l!rKt+wXq)HQ?ik2?}qdj_a7yZmqZhC6- zNM0tO&Il`xd6d$HNc?6qq=WsnN=r{`A6!AhjL4E^P~~VlRQTE}qIWuxcnlgV@@Oyd zT#tIva(84!p6rXJi>E7EOmYl2*;%?0G})ju*&Q@wa#Nzcymi+QVYS(rsu*iuX)|x# z<;2?Uc4k1m(`2`sw{Dt#k!U+_T^11{c#=Y;&9=d^(>pqE-AP&pPfd2`E~oh*eLU)Z z*>-lxR<(-+Ps{hJUzQm}@PZbdx9$ZZeO=xk|B0|*Z)qu7X`xAp%-6>=*FVJjzMt?D zbxlmvC-{9|3m^YZA0-Q`|GVv@;vfGUsl=d=aTV>ObOqYQRp1hhp6quA;|QLB1mZ(o zByZ@5p~->3(sHoKQw>xOAr0z&2ZQ6vwaqJ*jh1bUc@Pb1HIBKh0)fCl!ND?>Di20$ z^yXuU?(oa%M0Xe#N00l9^t|ct$-dOmCZKvg(;e~iV+*I9^WJ1I@5Q5)b)L1}L&}KH zRzIM#+avxbbTYlgWylR%qqykEiJrH#tZH^uk-G6Y`O=s@gv4VK!g}Ll^Q!3G4(xL| zBdWMOx+xbAeHIUBQ7;Clkci={2V*tg$ry}Gj&7bES+y^^sJDGlr^At!*0$)iw8*Nz zHmrKX*B07qga%hFRVye#Yn0{nXc7GXMn3Zw)LgXE4U(!C__SKBW=M+*F>Zh- zv2pU8i=P#aRp>$`Yjeb^#GTHH`qCsLI8)a4nj<>DaBw?*&Y&<2NsN) z?nJ)1aTF5ALUk34WpS1`wV)}#pWW*FqD#OIep~=)BOWCGVI~Kv24dN6nZzsz;U%+k zSP#tcDnQeBfe|cU5SG|OGdB^#_x`&DoO+N3!I{LNNl=6$X>rp<7{%+bq zz--NN{2aTHwTLpNl&h;5OclZ?q>g;Uvn^Ftd>O2uJbK72iDKcbj`+I&mme!FCz~fo z#Q8KrY#?YF3T3FA1VEE9bEn__UWI%w7R4)Ijt(zC7$+F?=kTST_1uRs~S}^g0d$#=#Ic7%OtXLD;mR zha((^x9l04NgFBIZY*%JIy{I=IT5Tsj)^A?SM&WW7$En;Cwxg=wwoa}pUt$}7?MNa znzltswrtyG_#YO-n%8{($Gzdv?3aw{?c(HfS7TCx|A2vC?-fn${(Y-^Po``{|Pb*xQah|l#GUdmv@K5`&`WycuPgd zFY-BQ@JV00_s3Jl$PAEpinKE?>kBM(33b(9@sRl4E3($=4%4#9M}p*$v#LT zurm%AAu9fqbjjrQh8r?3nCIKS@%>n64|O9)#D9OZqyZ)G6%FC)4p*u7UT%L_6hO!p z_1{m!HeqO_^}VxTY_s-(gLyS{koUO;K@dOTPx@Z*{`e1iP23}ZYQiU7krj2(lA6e} z4&W7)TF^QyXuHycT(h7-B1#h){@0TIPcH8Ju~grqhYw&IZ<;e>V2>+!PUC_(7t|d2 z6r3CUz0%T$8+e60r79_4F63}S?~XKa8VwJ2(&Fl`Yg?)g{fP=Ktf)m*5-qbE&2Cs< zx+2<+#ou9`1K29(HM*id9r0e&J;7_~(xR#q4*anEs?a7)sL+M(RsRkzlSPrwBMZ22 z;g&{A9+k5^#Q(~JvFu4&(ZXAIQ0lbMo$r6xSoWH@uHJ>3p5gD9tZ0TFi znhE`s2i`_#pHcFRVQF=V_%7exxyfZ-N#YX*c4_`+>}H43 zPky;!!GsIulT4Yf8~!KRwlA4|fh4gewwfigXHbD%MbyJYRq9SE8cCJ)C*hY=Fa70T7Kzd-V<>#|iso4At#2|x z>$R?CW6pF(^+I+83F*Lsrx-a1Eq4j4Uxb{AlwV^D5ETccRtzp0a95qBXIrRGGf50o zwSEkR@A71^oa9{eIc5~cEH2BERbo(93HEMoyFoEW`Bat(wDFSnN9qSn*{f`e+;^Ot zZQFb=u3Kk3E0NKsPVvig4n}-)(?X+S^WAN!84Gc)8TEha>tA~$S}!RgC7JpCQ4I%` zB+>LHG5~pDbxEYP`kiyW3uSV|Ihlqo%J<^hhZ3!s3?+}olva{Hx-LP#?aGv@72>EX zG5>NZj+`L*|E+5MV6<(U8A?=Xns=utmW2n?aQijiom7>vsxoqUxDAa<fP(oEr_LtkD|c{#G8QZN<0=SwU4+1lZX=14`ao%tmd#l2Dd8G@VP6>r1zsOV=wLalC;}hS0Y_I53upf9Ctq+_8kD+x_ygR-0nbCeDAHmA%x{$QPMX&ql>N<`Wpw^%RQf<^G%8v1n^B-MnghI(RYtw@Ivtm_nF*<0 zk>+%Bs*5oJ9*oj}epK%G{*CdoudNPYH^N4)K-bha?Fs2!4HCYhQvLg6k?Yi=Gv1 zy+2q;;zWz3O4op?Ao}w!{kybSRo0p&Azt>6jz|r!&ULgEA~i?K6a2u!y1%o&P~Y?L-8VnaxfDJ~WPWa-ZT=)@pnZN0dtZlIrtMHf{k^YQR-i$iOAwyef8#0d)~cg}CU~ z$D^_u+Hdes&E{S^JjpT-Q@By0?9yvCx|wU2*`VjZJqqUXg_; za4V5FnD3n)_ahMDfUYI(oM<&t&~0VgwnhD~v2e1d97NaAn(soR?KR5Z84Yzts}IS+ zSN>kwevMImhz8P#vMoNpDrLEEFm$GT13rQDSNSx2mcF~7PqB?P|0s>rcPmecW_3?5 zLUijNteJgQaFU&MQatOr+`h|6obNv(3UhjiU^CY%gJt=h)KgUE+-fSsv=;E7)({Ex z`m};Vu)N@5&hJL*g9yynO^1bwh~T-B@UT_Q0I`U?VV1-=%`eL{aXq5$L;~r)%HXtwdeP;E)sVc1SFca z{Khw*C35alC`AO}<7@76a*G>UIW%x~aT3dOxG6c|UW=n3IJ}30XzW2AP>%q}=oE_d z6W4~bnA~caU>%P2DZ4)-u!LjD%*mEfst^~Y!eC_EA@s`?-a1XRugIjGV3FKfj&h&6 znF-TUtA-#PM3Z^$a3QhaN<_`@ZwKvy^247x*B8|GIj~;1%D@BvV6#fAJse|uk>P+} zWG#WUdmV@5eoXQwEQlgRxepVW{E&P9P{fDS?mGpv4oS^EnQ!1M<=FG*d3MvfPdtXT{|CQf{zgoL0VF7DVqpMoNM0*RLnBWXaQ|`bqRCq@=I$6x(qvPimnCzg%v8 z`t}C7ovCkE%k4C7!+WMD8bYj9#Fl17E6b=y#-H1}^UUbxr0Bfo#qKXT+>-0vSrBeb ziY~Mx+H#GS{I<|&MqG;6BfUcRwHbg+OiU11C*p=RII5^-E-b|3n5ND|#%`_Pm@&xY zSEl;^4kE9_;6~%)GBL1Zfj|@fbyJQ+gIpuXgxL!lCdXpKjFTzA_Pn}X`e}vv3M&O} zHKw*8Da9aVkb`#EmY{?`Fx&8G0;cAs3#Wf3N4sbthc$^Q7sl4n4MGUUG_X7Bu60b5#tTr z^g?=YjO#*Kdpu>#_->WSL{?$GhdEdE5mnz!rQ{?Yjuch} zs6K*Hh~&1aX?0(XO<)8%HXB_n8OG*%uqo$T*o)CTU34boZ<#Tuu43k<>N?JG5aE_&zVi#Zz24Eg)iX?v zasp%*Y_+g!;bU&^6E|Qyx**Rrt!6V~hMLK2B)#2p^C}Hj zUS+scPOPVTV~i}o}R2c^`Dvacc^^%a;?#8^IWQsm}?#&V{i%3Je9R` z^EM|1Q@dv@KQ}4!*A7Sj=HN;KM@^`>`&jqh?hnI-a|H=+{SD-dW)$TnWj;NT1br1e zTPe>pU;8!myaSgs8}sPy<3*TL6MUhk>)?z`!0uwyIm~m_V_t%ZR?-)&q|Zs3r>Bqx z29P6BRzE36l%@J8>$+CEJB{YCv?Fjg)#V48>=h5AHP_5k%z;v(ks1xU6SYO0ak0J z_k!5>^PWD&qKXhAaxLzoUkkTnapUH4Mfe7{fIF0@P9DeL;}^VExD^4D*;34!O^}KgJ@@; zGDksX3WmF-M&Ns{7P$q-7wWGi_-0!8jy66rM8QRlc^}`b#!P*Y`L-FYVy*IM z=^W@_pIPjHkI#Npv4 zX46u2iOdGDnmfX8UqQ{8mYd&BO5bn1-28Sb3JJXQ4U8+Nb~e6cPH)`gYFwGx*lvtJKdE8G2Xm9W_cW8f=2KXjySTaREpK=`A?zqA z*nh~^ye^5e|KLRQn$y6nsA0wXRI%}$#uXnl?#XMKTN9e;-LXeD#BZn4GyJ`O*Imh8L|~2QCbe&j5FVUrcr{kS5Y=nlwV%Y^g3LDwW0{T(?~te6-(Ld` z?f&D^N89~_LX!KgtygPbpg~ZfNQ#U-@kZIiSEs&yjVhoAn4?O|l@5D{bvtrJ@8K(HM;b>3zlx^AR5TsJ?as^ITbp{> zI~$Ucj$YQzT`PBOm-U9yg?`yzu=ldw;ON~_nYBqLx{YRi5RojDRfxHg*MNS}n){h? zV%gJS%x>MnIoGX5h6EzXN>}^IX+7fvkTbtABzZ)?Wh3dq%?1QKvNE#TE3>Fs2w4O5 z5t}6mW7%_gE2d$g85VUD9!w3LtFT$-;0%6jnerDhuwZIk<6NOaDsExz2h2pLG27sHH_@>FQh8SfXXN!!Pf>w1$JpA^qlx&}Wn21;mP#qqswM8Cg#;1V z7S5tQ;nl*m%5#q3K$$_rTvyp*uKEAFmn@cJFKsW38`BDHgB-) zd{5J)ug7W9wgqFSi+ZW_1KbLOTZNp2WbrhHr!Nj4hZEwCEJi%QuiS?hXNp-7XS?cO z8kc(x?1IDTxrdprD$P2qW2+EQoV#R=7{&`!L-Rr8%LM+_BzObjr}>K4@0u{ zmL%CtRHT`!jjO%VJC61gssy^nZe7x5%+$rVbkHg-u~q7qB;5)_@>Z~%t{ny9-M z|B_S?cP*2og2eJmg`p!Uf8DFO-0Y_Sz9v)!_&#hQ`b%52P@n(NR(}WR45j@&bfr+* z<|O;29c;1RU-b9xzrDFvJBsO6Z#ECqe~Vl=KH}lSftI3BQuk+Re-9>g_x8O4$)sfM zO-Ik_B91Ib3MLKw1=xqphx<%k_WhdH>gf`qdpk{H6_C{0{ddwFd7$T6)|l7>RsqGK zSGzxKwNu2Y^wzY!p{1?e$IK+j!ow4!>C*=uzd~aRWFp6Ozb~2-sTNjo7*>(;;_tlZ z>+Ut*?dj^92UY~*z-#&EQQ&leIHsq8a`kz1uJ}s}$z(z9ck#H^?xya;2WPxYE#K_^ ze9i9T<*DJ)8t;=9?cUpUI1$%Y9QneHTy-dv1~$s^)uR zQbJ=ZjfZXkotjsYYTg_A;}xc>@=sTctBgFfQgHmO{Ql{3W|HoABlq3LgIzbP4IB?N zMx`#DhdWPpHa9lsd0+QF*HnAh1+8wpk=zw-%?w;qYNT6g&=uD$k4^pmq0sKVR;k_Z z+Q<;`TaCuMou75S(D(vqH1>|bsq;wZk+ePk3^V1WCwK3S4~lQlPvZBF=1HTss=rIq zE9rLK@3(HT!a6+`T6?;9?pCewEH~vj4nBJ$ZFBIq@;guur4WP1Za19WOC5(&E}(I( z^Ld8Lw#xgm{G;vs<|zB-&E|NKTfQuPZuj0Vi~c+qCt!4atQ~aCvocdSHrs_b)AqJP z<5>ea4}7iRk+wJJ?n$|X=QsB<7-UKq(YyBTlfHZCFhjk!yI*FK?$3I{f(H|Dw6-uG`V)VzY^o}^Y{!pG9!GQ>7V z7UZS!Xry@`?MQDvoX)c=;>kOBeqMM_8X)O~^IWYk9^4~fV6a6*tIdi??mj>7x>n8B zD1i=4Ch%jHno?`)cl-Ce&=&*Cv zslQj6wFffZ)3ZYLU<%#av!cHzH9(WtCLFI<^nIcMYxvrl(k{f@)vai>o}50ZU06-@ z*8Nc5ID^Gul^raQvZvutCwS(JZ6IfhBgGyQ1bQ513xFO29diOV+vNs~j_i^fxDQ7@ zhbid)Gfbg|OV!-_MNl<`)aC*z$kZ>bG7{K7sV`8{)xduXlyjv_|6tEK365?lx+%{I zN49Lu6|m>j4xPd+?qs|>OUCT#-wd~;qqLM&sgiTP7b-vO6Uc48^9A*VWu}L!K;SRUTw_@5l_XXOejpj%q3_;AWvd`mSf$Ao&=5J%``w9oVzr`#A%x zxuJ0aqI>T!h)nZOWj)`lfD1D&2TI+!L-6!@} zPAxe#)$gfH@2EtK)qVTmh?F7-Jmwi_Mm_W3j1EvgxZ>0U1I_NB3{NYjXT|Xcco=Br z+?#_lUL%df3^e0Qqx*fKqI$Y`%7qJR%8NJ(4}jE&f@nLxTQ{J(4US+%#baASS04|J_wo;AIP#M+$wC87%2O3O$>1A(l0*`uAWjtb)-H%!47q+uKm)&Dc|$Y<#`O_so34Z&9yg!p~69@et`e9CqCv<_xCcX7PAfo&I9)G5VNU^t0cII8( z8Y{~F{*AKcnm5exdqNf3UScVUtw!4k)vfbZRCMh(IwVVRXxwl`ux<|JLKRN3!F|sw zF=GUohpDIO63~>I^fjYAlY0TsRhTuPVi*9i9e$BNLd2K|+g+tI*=j z#0$~M@xk=)$+Ls0;hUR=;Dh;_dKRK8`cAkbxo5@ph`&j)iZkHS@@Tyv!G^sipx)9W zDrb$1TD)NsuN7$WA2~`vsbh}h8y9kBvXX#DY%YV(TZcFaBoub zzuvAiYHoCXPI*~Cd{=5ULft4|ktPW6hKsWl)_J1yb4g)USdR50AG3&L5=s`ij{3Jh z>3V(*Rf%amI7$s4%VE;Uq^rp6Ge47|1Dta8j}&S7JTs?U?dF!lTJ?0N_MzE9K8sZ* ztpbPSv{qp`*iM|UNoJQ+Ze&!NwH71#Qi~CN7L4c{(P8U;|Ih@+ zX3G6^VMgxvmzawavGRPr^~$_xWbF6Ov189UEta`iM!ac<-Mu{%&`|4JPnR5MP4d>= zE;s&6d_8`fJJwD#0GmH>^*E-Uq&53EBU}dE0)8s`^n4HuR5)u>CL@GdZm3+kMiPB27FBNSp@W~N0X+B#u(3%+>ON-~?&?HygZbg4k(8TejC@9Al zH(_-Sd&9GMo{Bb?<#Z&M3&+`zZn=DpW1WWRgOj*0cNa^_>^J4UJ*FZDw zZsqyEcn&XiCCLJ)Bbc)#f)p+*0&lJo;g&T~r=b5zgy@jLo%9%~&ApsYT2SmpMsi^> zJbJg0nvA!69pjG2>{oV-D;|S1$Bs&pC=~cO%OpidO>HGcJvGP(=@dV4qhyu-h9`5N z#l^kw?>uf?$HnjQC5MKG6`wTF!b;5j=;fdmA6&Dn!G*8~`XAYPGj5y!<4!iG2)@p6 z?~okp>SXq{9zRQOHTibPK28Y~W*%fkxw;qV?C0ut@8E^XO8;KC!^MdX)`J=DaN~j+ zYP2M)`EW{syY_Hz%;~sLSdXKZ=Z33u9l`Sj!0Oz?tVrELH+C-<@^$p`)%;?F7hb)Z zSMKiQ?&SgVGJ#v1tCxhNNO7*LVv?sPk%#vyCK<)6<4FWcPjb)lfI5Wc8)Uz@iFKfC z`>-&{OWXs+?o1?4Um4=YEjOQXb+^`!6f8_&ioO1J);e0ywv5d@Q@tQYF7Q1uh zCqve{>9u3DY%teIofc!rXGja9?~^IdC*&DY+Js3X(o>G?Jf>hbat_c!m-=Zw1>t&kJsdDt$2L*&9C;Uca?~hNi0)v?N8F;eQBv{H!w`)z)0=4&=mY<}eElK7@eSoCbXFq(@)!ott+=b_4g3c0!ssO&!i>Lbg4Hw!VE zFqg>c#VQ-;qeHbZ$3p#;31v6Br@LT4Q&;7cM)ep(o4*zUJoG)L65P0*Xx8F#7wRKx z-t2x(rp>o{8U8{MIp+`f$7F^kC-04LuJx;TrH1!9xl4Zan-U*X0xz=6z3T(0hRUgf z82{~TuZ&cWxjr~L!%;(A#6JdPsvOqjexaUcJmyp)db))CSLYDr-FbrMX@1{TdsH() z-xm(^Drug?@x7(!l4W{#YG~8EK!&V{MkHPHVV9=FhlZ()+G@5F{hRr$AvyXr8zRGs z!m}*TLg}txQ(rRX=|S3|a_Wnfz86ETs$^3=Ee#`2<4@p<3S>f~t+NkYu<>1HhehnM zC)T-jVxzfoY72tvPyrRSs<}Zvhu+QPNS7L;`<143pmUON1cRFn>7bB0JNF_!m4*VZ zb99+#F3?$FcX&^9Puv?myd_%8d(!HUD)hR1Q;+qsH(E^Pn^L3N5x9030g^O8 z!K)(FUOYFs!@ILM%e%7zZ%aAJ%_#9r6wSUnJiei|qcQ$Te%W_&ZQ8tW({$f~waWH- zC2WDjAMmP%))XPvTH`q1nR(MAAms?a+@JtW;$G+y=CSSu~38)O*pyPcfO z(4P7@luj_M3c=6=AP#khn6CxF_6Tzjl&-+8v^8*3Y!+!8(FJ*){G0MP-KRV<-B9)} z0L9%?)C^1+##}Q3=B`Wi z{-WhTZ>xbeaSbN~zRjMm;MLZBBi{eE^T6L)jh2E}<-M}smqwT5x$`^1hrP+o6ZfV! zSMODO29K@;Q{4lWsbUJ=54d#(W)X(~Rbdd-1^P%4?k=iWc<_vrnVg zcL}?4BBHtg)lvfCRrQ>n0TJ0^vP@BNxBOT zHr|luv5#IK-FjnwNxW&a};B?jodyOkk0e|X6W^h7tUnaL6Zj;Q8 zRnd8|>szDqhE~b%XZrUPzgxBlmeF}0&#jWR4dR2}cB z7I)uElyN30=`Q+j@Rv!B%wHurrgL4w^-ZqTTtTiHt{-yU&-ELwU0iKkuW`N2b!rFb6hWS9pZYQ%LT4yab3*y zO|I2kcW`au+QRi9*W+AGTz}6m0cPbVDB^TmYdMLLS?a0wyHtm6jz z{Tf2p0ggND=Z$vQV2Ae-3fuJfvp|~$?BAi6nOL#V+<2~y+mr$OI z?B~^lQ+cip}@P7Q2J2~ zq2T{RLL3M<9wd}F+1ZC47ePT*6+$>4cuY zIWtA|Y&M~&kX}nD{rM)sv4nRLO8<=a%Q`#$enLtAB%!od2ch7j2q%n4AMbDR{uKY- z@qQ5RPx1D5na)gcM6hbrjo(^#^G$*x_uszh=5OCdc*nQaefwLtS#j%vH*qfyt5yZq z+#)Y{ShcG1TkC@H`}H?}JNR#F?PLPyw)n%URX2a@##b!rA_m3Tj>h|Y2{7WzW?&-h9qxAK^ zjcsEe>`C;1>F(m`;^zXZJH){U@95=&M{TEs5&ay3T>So+)|40!=dX$JZ;SXV&VQ^7 zYUBUtv;QUEzpYn4XCDWmJ!RQa?lpKpK|Eyp*S!a3!VzL1(FJa2fB7jXtKjfva38>H zI{4c8xR9`Ajl-*>rLN&l^!5EC1W)wCi~cQ4&Buor4E?ndRo4ZUrjMO-@E?gF6oq?v zkkB0xZ)EEVcWJx<+;3LOvLSkUc?NrU`TOEwJRE#Uumn*eQFu1kgJgjaaU`4zP6FqF z^M%(yaC-vna9%hcoCCNV!N(R{KICwBoHY1hg2Vl%w7$4t$juH;>=HOEr3|>FP_=Px zY(R4y7>PZ3!2_=Eme?L& z>=4F}9#rhhAb8M`G`3WlaCm<-zLGW*Pp<@3DvMYv){Q}69NG!ftI2H%R zL+KHNS7-}FenKF0D{eGS=xbGItdO8KAfo={27!KtuXy5cXitaQMh}A8irS5c{1DNZ z0EMA3p@gA)QCdW_cSQN33L!tVN8?x#&Ibh5H39_H_4o=Sfyh4!1mzPAg3`lWz-P?`YEhNBMZc{nZ!pM6E(S z^JmUdkTZ7ur}mLxMxmNIKwiF(k2CrHO@y_M?(4tr+y70QQFQp{))DGMDH)9t>ZSjj9(w}$Kn*Bq(aga5;XjofL~c1YzffwdR4nyBr$yyZ?u-)9 zUO${a&V;-WJ;%KzW72ma6R7|0aJ zPY_q=X9=7>&KS~!kat!ZxV_+ZgT9o&?IAypFn==~dKS5Vg?l@QA4m{LC`bfIG{`BC zM38ilERX__a*$e(R*-g(E|4CO0gz#kF^~z6Pasnub07;KKS5}|!LtH{8wAD214Tik zKomeUK@31FKLIY=!?Ge|qgFvt`LZUJmgAfg}& zAO;|2AXXsuAnqW3AfX`9An_n6AeTXMKng&rK-xhDKv4V%kU0?CcW4WUFo-OOE{GL~ zJ%~F<1V|o86^N<7C(aOdh-R?&GzU9|nX^Am+s6fGO7z1)m_0EVhr-E(IKIdM@jNjX z*ovI}eaN2Bc1TB#2WkC%$SxdCpXiCxcCf`65`AD^`2d4)`cS66zdKIN-w9{xK*AY; zF=ek;08Z1v4#fvMLoiC?Lv}#Ekk-x_2q2YFW`|ZKxeC**8#~Z?hM~+~)aJssR9v+I=4%3vp z&LIuVSG1=#107Yw9A43aFoQYm57Z{#L!mz8yAmS0KcL+MxtNvozjZ7h-@jsD`Jwa0 zZ$B(=bdvd<4lC!kj+KY*;J^L!p;S~?ZOF|QXb3v$A2qm#AtD{sN`Iwoh^UX%fKEVD zNJj!1!LtFK5%)sd1Av;~ZwJKk_b2Cy^1;eMcSKYUrM<|F&Qg?e(LRV$CU)P&%EjVi zWuv<$Dv?qL>^X#;=P30-`w#TQqtpvMsVF{_I{w{H4O)yY;}seLw?lu~!)x$LeUXO# z#9`Nq!qFf8FCP>Oi>Zs##VJCG9`K5GF6eTA-j=}ahkpD2FFf?x-~U8$l)u0G|FfnG zPnZAgFB(o5|N8g$_{ZUFLiwY@{da$V<`9Yd{YMRFlKYCa|b@dI6O^=(OJZ))x_PnjVqw_`A%U9h!y?y-yuLp;QN8XH%y&Zoy@&3cd zPoKX`PEF6u&dq=Qw(x!N$Iqo-%Q!0PRW!78^bCxvnV4Bv+1S@`tX;>+wVrze4=*3T zz()KgK_TJIB3neaZW9xiklZdMEwe**r<}aPF2&to10$#sZQ)G^M<-_&S2uSLPcM?U zkFTG9KwwaC$RR81!$)lXefZJPV`1U{x7+`JyZry-{#R4i(A3h_(bd!6V_>+~2)Vp9<~(6Li>nt5ZO;d9|!@y0z z37{Zw3Md3z015+f4AkWJCK-U}JuY_O79cke*@*B!Wa|+HiUFm7;y?wU1W*---V@UW z$^ngm@<0oq0?-Dy3+N0~0g`|OU=UCh7y(oRo&stB6M>q*bf7jc3#bFk1L^^bfcn64 z;2vNt5S>|?fkwb~AUeR%F~WQJFac4368dY~#0eTc^Z$OuGxcP5|(=*&QSAPbNLWCex-*?^~jXu_oc*8tI( zj01?yWNU$0;J*%70OSOg1G#_=KyF|=a074v$OD`J@&f08d_df4m=8c^pa75?xDhA} z!~>;(n}A9{L7*;B2xtZr2HF5O1Koilz#t&{KT6TSt-wU!HsEET7%&eg4lD&q09%3E zfjvOP0KC-5gw4#>a+^8~mKr~t$RcLBwLia-V6ZlESm1!xQ;0Ih(kKxd#D z&=05qi~wo^(}7yR9H2I^2&e8v!#o1A1NQ;> zfCqr0Ky#oh&=RN#bO4$G-GKH$cc35eI4}Z81vij*APo?mzv+SLpfdt7> z7y+aQ#se9F>A=;%93V5W2*?Ah0`3NO0o{PZKseFjrhqiSpFnyb11sbMTnAhY!~>au z;y@mt0&q7_6G#O&JTo8-&<02kbO$m5gMh1n(LnS=&WS)C;AP-$U@4FaZj22;MqoQ| zHE;mP44eS+0Ox?afy`_WA8wRHCy)^+jQoL8 z$X^!LC-MjCB7dM6@>hWVLOReL=}ORFNC!qET^0HZ>A=f~nov(fU8pCb0n`)G7}hC} zCKT2wkOw#c#7?3(II*FVCJs)BL^3J1A>EZzl-+!GpA4aoSK?!*a~yojhQVz1dq6?kS(d9_(PtJ+Sd$^FsnGAt=5l%wFV1djT|0 zB*3zO{Lx%Nbw>H4`62->6bH>2 z1eA*QF=(zKH)=1MZzxYxPc-KwAO_k4p?Qbui7YB;?jg4&yc&S!w=&jfE>gw|%|{7{ zjp~WQB_OsMxP!>;!rUR`_?R2bTS^=>cO_s3pn78O&S;bS6U|{%H&h=Fa-9vybw>7l z%D7;k4=^OR9nEoMYesVh&2!{N^9s#%WS6|#ovQG7L@vpfoi-Q@4wNjnji)bFBwS@J%2f0u8lKTi-hk7^@avrD+8szzh*}1TK zp!+V$*#hEV>q?#6kLdnNiI487X#S!8^(424vSv^mud(efoQ;R$ou;-61d7fhT5;b!Dur{la*Dls( ztnaZlYmn!%FL^CuZTPc1tbSM!0h~7girC4;ukWd4}Y=VEv{?ZY`FtG1(u>*N{8{Sik*qzGxL;vxSnc8F_56e6cx; z<*P|<)1P_$eGELvtLpD{G=iCn?t`f9`YUeK#slQ~qIMw-8#zk(2UpsHjR{(dl>S2Z zc$5Z({5=h}60vgB$>Tuj3$!M%`KM2=KNiPqWzM0})yU(3#W5hSeM;NWSrf|#o5@(5 zJ>>V#usFsm>lNjr0b@ofOYM*G*iW8&SX%Wz;v4_rZ?ZC$C?D*uft71YzN27n-IZ}c zarUk}Uy$3FT>szuI`mXQ{p3R?IuoNlG=?*>IFOy2njP(+knIFT-~+t}C<^QY$^wgl zs=zFu0q`u)0@wz$2fhT7fStflU_S5^@BuId*Z|A|4gd>)=q^wWYy~y|Yk=**W}pJp zYb$U7bo8aCIiMR5*)%o*nKw|g+X0b{hYH9II(q&J1CIfvfcJsO_CpQS1s#n!JEW%p znt_go3;trjVbDE*pMX)o9`IKNE`WX# z*bMq^APqk?do+*)x)hKd^eaFfiggs%nK zgPs7)f_&wGB+$cvi4eXH7z+9UU^?iWz*C@`15<$Mz${=qun3q5tOe#Fe~8ZoYzN%} zmRKR?h0^drD@NVgN{4tgkX3c~TgAkb}r!=MWQqd~U;CPI8!M9?#UdBCGU zQSjdatOeZ#*b4Ll_5fD_CxCB&3&2Dm4W61k8^{j43*-ad1d0N+fwDjn5IYBOF(2&J9l|N+M`RO`fSRE^ zF*^WeEyB)U=yQI^AMG*Fr?}83=YFTfYz1g%g3e7SjvcvwP`MJ&JE*;w-M}8sWXO%m zLg^`P>@y3PKYFG3qfb=+cB6X(X1hS2eM2h@?a9!2$BDed!S-Q9IB`+-nYQG5VE&lZ zi{eIg!rWN>Ft-c2Y|QOS9s|tn`A0q^@;t!&F-r~RMxUdgbKVYTb&>7QV#f{GAC>6!7;X-aZW*fpRhnRfk^2X; zkGPTN6=tWv>O-+FU>dSvAe)vOxy_gz#f^Nw!R$tur4q9zVb)8`rhv^?%npQECo%g6 zmMeB@!mNbIc8J=5);D$nLo1%*_8^ZjX753-6gwPdvBhi+*qC8%%%Y3g9Vl^7A7SeO zv)^E4VKzL>;)~hvY{_lJ+?WNJa(+jjUqu&1$7cU;okZ?Yiv16>8e{f9%yNv`c(8IY z`v5loFgI3D%#B{rc?sFBFe@`=!$Y4|#?G7Q-bb-lqw^=yu~b+%I-CC)j`Tmn(Rmds z9gB~8=eLgRk?2#qD2y^M(cKi;ZISQa{r|iNWAS}qp8ZpN%>VE4kqwg456DevJF?HA zPwk?zP`M}sJr$5G5w#ZUN92V$0_KiiD?V6T6+0ke??kmoCA+r-Mn&cA3aqLoSc3@p;o4F0X7d5*<(CYO)7 z(I<{6{=Ve3hWY!E@8g)=6f4Kw%SjsTWB-0lp)EFCQ-mEfn2SP8`~8Z3dFCIk2o11K zAUn){uuPzRH|0V<;emcQheEP{Z9i5XkR5(+YI*srI)xA(0UqIhF(}h`t>z1YMG417 z>B)`Cf6o`o6}?jYG5&7P-~B0?lm_OaaB3y}R5%qm;5WZNPitBiyHi#9_*Q$yWQN-P z(K}ruo@}n|+?hH+?fR4O?E-gL<}EJOoyCCzGa)lI3~G`!?je>~`zXbsHlY@w3tBgj z+x_5#qjxcjD%l76hDG(8oCb6HhOg(BR#FZVRyhQr4IXyE+mu=L@Co52_=GS>djopk z^N*``d3k4@^QNnPY)_U66xXknyePfFpvpkQz<>lt1Mlx5S-GYN;nb8=DymqoPOj9L zQc!v=7CBuNBl=k%?1DLkqs%K*X_8kUj_B)xrYeqT=S7~-zTQ6AL?$Pp)Cd=Wj3HQ` z<05eXb7Dg5vDJC2LJ7RzOe7R&(Knn2?_DuJO`w(f@r%(-K^Yg3I#@_bA@GkRF$ewJ z1>q`ZB>OHBcu1ZZ9lY=pWVHvs_1w-PWW%Q`Ot$etxLwn?#cKq@{PAg9IR*%yJSea} zm(Xw4M&Nk}|B(jwm^xAACgJ3Z_Ga@=_%^m`y~GZg+k}mpy$k&zkUr}bX^m(RA;9>K z=;>L|ZKgkMyj)D^+HWdA7>4@QIxO*WmJrT6#nVK*fgcvMX^hyCTuPX|Zu_jD0ls}5 z@&2$c?L9)~v23BX`t^{XenOzzeL{$57RSUY_~pCWvAs;M$_bGMdt2Y)pgpR>f~7ku z2s_Q4WJ%LUX>dyidmPdrbsi+pMI00o` zyB{Z^{1KsRIeB^m6BX!2w7*R12(^Kts*DA{lyJjyd{W=)2x@jbERW}w(QbT=&$y7lS2oe5Z(?i zhfw2%p+22D8{a=6;Du-0S$DwvP+fI8$MY#6{E*m#f{!~O{l3QgxE6x%O?v~EIVg|x zJ#_q33&AHVNKj}Q`b$-^VwA3x5c+WcGtL&&f9_pZl3EEq1>-5&_uwZB6W0=dta(OY zN-a$4m*r8$u`k^^nE8z0>)u@@bQJ1m6Shy8>p5X8S#rkZiZs-pdO-Z*b3)AY@x=L$ z5T2M4V6m}{fJ(=uSV?ROo`LyqQ6Lpk)zbhUpY8h+{g1LGv%j=_!n;z;p_6QJ7BQ!d^_LFlhZs`W2E!JF)hx zaQH5!Q`i%R=@jbj#dHeG`7xcsESR5Yo=|wI9@8l#rD8gT7A}}hVL1WQDa_))bP93r z+sXM;*i(n;6e?W6bPCyhF`Yt^9;Q=RD}w11rsFW3!r@Z5AHYRngcqh$h~I|k6xNPC zC&#DICKJ;s#93lGg^9eFPNCGRXXNx0)}~=Pg~kUlox))rOsCLhw3VEm!l@igr;y}< z=@jC&V>*Qq-&)A&Da6%c`d`Ei6V{>e6~t_H==a!>Z4v!|J+c*|pS<4)oD#!qtqZ_S zpyR|b+co-~cotC6&&0C<8NeUya@c{iK=iBe$fm~)ItP#shzH_<%s^ov6Hpw8Y_qaJ zWJ^>6ZUAZmk?q<5$PF|DBAcug5ZPkwfr3DHpb(G*M0;jG;AUVDPy`qOgl!ZuBj8{g zMW!DS(~00f{)jR_wB15mE#z(IK>jKe&e7eA`~xzML|gJ6%)`sx5v6gr$F`P7?680% z&cP%v*qu2-1QhP*vl1RGg*y@~4dRJA0vkMJe>&pn5adU6gkMxaF)7zn_}}-8xQLWX z@IF)@+NDMqL98PvoE)2m2JJ!F+1c@UysD}y6>R>n{U7#<;-pH^2Z|F}zf_noUf9s! zL4S76m9+D^-TQ0j?K5Of^|R)b4+IOme>r@rw=+%5;2z_{(Bd$9iSl$XJkdSuGgK; z&Q6(aah`=Cp&9SF`!KtU!I+xOOCN8is~uyjlytgi_AH%X>2xbweSI;nY^QtrUG-N_ zD*IKxR~3x9_sIBL4QaKpyc#&D+;OWws#io2H)s-J(%sBOY_BPsE8Qg2P;%hH`HD8S z>krE_%Be*ePSGB@+soV}{GO>eCe&;D8UtsGTl~aF$`X$E64eF*=)C)>s_>oZ+t^=D z#-1ql-dJ{z?)q3w=8mrNiK|cOgJi$s*v{lJrgEpVj#RR^hD#`WFr>NLCsA41jnA35 zx!Drk`Ff-rPVB|m&U`*k=YI4$74M@thDh@Uw)v*sA_wF5_c=b4SDy|&_2B0a|7%-4 zi9XKR&=>Iz23 zKc<0@uzf9>Qo z^x*sV$?7v2)%VxGJX2&daqZQsu;h;HhPobweKSKw(@vEgPUclNUelEk_Q>7U?Gt0^ zG2mT&=d1oIIhzm~wfae$q5VTnd6Q>6rGu+owBt*NEj&?0o8{g(?>isJ+`3AK zsqz6AwcvIU+WpnLD;h^3T4I&E++8Q#)?RixqgR~2aPUx3o&6<|8M{xH zuetiKPWGVAr(?WKkYoLL!inBztvQZ1QorW>x{&fWg<{1=6?pG4Upmuyj-~qL+xwFP zp__*KnYub(oK%0)HN8;s+SxOzZ{str>f?t*9()}MEb163Pi=x?ESF&msQN$_t8<$PHp^l4Qf1sy| zzH3L}faR-RN2Vdwsog#DriE4cjTx1L;ca(y-Y=I)@y$GZ7*|*ER4Tc|^v1PPVOqKN zie$R(XIsq&&1#%_g(O29OUm_$4b;5O)+u6M+vKa6O0&-}*Ygh1S|&_VOQ7|yCe6Dc z(pFBU-c&-2rqSJAYcBBE$z00=k5ko*7~*=H^(yN+;wB~+TYBe4nT^T{48sb`&PYUM zwDG0Km~hnTvkUc_z97v7ol~16?(Z&?TsK}O-(8l@ml_>KdoZ0hk~<%Fsee(T=wgdp zzO{AWIG?-w@(@9-D}&YY*;V1_^P`-Z@p$dKxx~Qy>Kh{y)9>16CxoL0>mBYk_T4PB zw*Hu@ttr~-=H;?P3Mh1w-Zg2t4KL0}&*Y)N$1y9XJ#?4ey2;y&^jXTmZSLFbw#s{T z(pUYH_+n+V=o5cbWv;JCh-M8Q%-^gqc~@yUc-FUCcf$1;Z=;&hwm}P8qu?pcFx&Sr z5=M1Rd}jSrahxftm8=O-6GAuYdKGF|8nYA(<|;Rx%}rhXJT+l0Bd*m-SGrs4wC$qj zQ`3<^GwaF!8Ca<1Ew!?@*m=w`+ib9;sMz1IqpsNQ78ac^qP-C?s-we8M` z@a-?{gi?tpj!gHvj3;ji>puCwY1+P3JM4#Zpu?N5!G!Jib%o{pcp3S3ZsVYtsWRPD zlAybfH0Tg4JsD>6Yj*ryP2JM3(4_X4%2_R~i*j*MmGns$gUqUmcRA$d?MaW?y*fW# z@X2Bsv(!RrA0Cn1A4RAI_ULrWrO}N`oM|k> zU5}3Dt>TGO^FCB*>6|_hsL|W&ZYf|S!FeQ1j`^|#@0QnmI28_D`U6wxsH{ZW!qXk5 zW#_mW=U$u7O*W+D)=j=l?fv?`ioP%}f$zTCp!DT!liN;w4t9H5pi6q;#cRDFxlMay zL~hVAi@q`3&TPU=&|%i_?d)CZoVt8or=(~pk*v(E<%Nx7-!li76kBIs9bKAet8&Ya zShBo(L4`5%Zn#49ts-GQ@o7%_oif_n1bhRf=}SjQy7TRBCUQ~QA%S0Ln?Y&uapJu}j->!4e@l4Wn-=1aaKOx7Vm`~3r6ZWn-EYN(jOA0A9N9Zs32{D4!pUg;%e&T5 zd3HswI#{huJ&?yp|FN!x?rvxT%?U0e+H#Y%tY>$3u)R8w#xgRwpV|I952I;v55sDS zjMd6IR!pR8B78be#`pySuWsDRZzE8^w4L`7@iR}|&@JxyGM5d_Gdnq!)4#2~AyT|1 z$-tL=ouv||kkqerA!o|D497y&4{IALbc>(eb>`fY-47O+6qUYc5}2Y-s_av&RdO(< zR<>AwSkCL%WqG;!zMWM0+_KR%=F%lE&r5x9dm;0hYR!(sw{F6@XY)7zlAhf1;1GYz4Q+nhz&Ekw=u@C8^*(9moeHxq4B>Zd37j5w zj<>{!CXe3Rbamfw7=37OU$IKiF~Mcn3E$GKyFQy!Z|_FaJ;DA-`akUkjanG__MW?M zX>k2@x?%do2JJgjbUI)6s%kwFj?~nYd8X!T!KS)xTu+@p{Q)o&4;0us9~iLN@86^{O9Rtt_>?4ts3B zeI$Z+=g58UZ^K{Oir@5J_Z_t=Q5tva{q;`9sr)T1OURglzQ`mSe(cMEjH{oBb2gvH z-fW+Eaq9E?IJsLNA6mJ5m?~ep^tiL*XNG&)uY9`w%i`=ji@YH{KhzsCzWWziE$F_- z&4x$S&4?&RPpvW6o=#C?oVzC0GQW5};oGxiqpvpBLA~bk6+Nu6Kl^r#s`OXQdk>z@ zEE($DH2?bT9{GVDX1DH1$NX3KdM3M$-<5btlVjVy<9SwxD{1_NHIHy7`>(@|TT(7J zgl+3<(o^Mr+C`Fvi%~VK7Lnsc0udd31INu;lcVi!n4D1LULV8a^YUa?`kV5MvSu|Dvu`eiUb~W3eYM@U zq3qoTy3*=g)qAneBJVTzKfAlTn61Q?O|N*r!|5Vt!S2cZ0ci6J#vut`bTK^7CRpqCf8E<~MQ^sMQW_wmoVCFy%!49n`@5_-OhdNq`~0h zFXHw587chsc~0&%5fni(w71F~F((~LhZSF28l7z;i0%kH$v*aBG|*xnOV4Lj=NglR z>;JfVAu{L(MJWyiX<1*~Jsds;9;A6^}8Q%~1P$~t_1 zJ>U4j^87iaAx?u6@9H{+Bf?x*x3?U1(+#Y@%Er?2*tytu>thMeR+YO#bMSSny z|4z&9au&hu`{Sq=>z(Bu`LM+Wx5!(M6&jCNsVDMF^chQ?zrcUjSP=YvUuE3EXx^Defa3)PulHU_15d}oxd|1 zASjc%CL=DWS}dKvHx0k%$y|_Rp>Az0)l%nmM>SWz!>QkbcWpCDOU<;NnHG9WyTQ%S zCain@Oo#2ekM{^s9)C;z@Iq*oi~T(zmH{e$$-sj~;{q=?^N3DRV^UVM1tA$`vy zsv0@Z(%Ytt44fDD`tUDreSUq-$)orEMjo?0>t#QeS6#48d(8#~p@8cV{*FyO>{KB( zzY5!YEY(*-%H}NwU}&Kr#8^L7-UzQTvFnSJoo+o+YsXp|8F?ZSZ=;<#Ie(=iR3wKIkQ`_uxg!)NvZd^W){kNA*~)2}l<6>Z){V zNF4P1QUA67{f#6ila2XBts&2u{Zfbz9H;4M2hsX3+G?Y0V_F;19+IU~dn00=bauEo zYhLv%`vCs#qdg=kZ(DYjZ0;icHPY>YRG+6BiyIObh}BXx9cjjqk!iy=GSv~*ZyNAC z`#!5~QJ1zkKf{g76SU2mJh!K|Q)3{}cy@luL+GsWw&WX9>!U*0ukSD=rH^iHA2P)i zy`kCu=us(M_D}mzs>-hY#FGuNYO;P=n;3KYj_+MJJL21DUp(z^*wK1j-upDCz?yrs zb<#9tA5C^SBu$6CEKkxnS-vS-E=le3_{Wj{19iv8wFR=xzREvx5iul6rrJ}j)tNO( z`qn31uq7+$V_NL=tC;;A_VS^{2j9`H5isBGEu?2LYw_JX*bzwo;Y=>c&ni`Cr`!}x@At3W5w|+pj-lfAs-3Rg*L?bZ)f+t(99;@wimJWo zEfm9Jp;2KND05-y@V*=g;hE7ZEawIjI_|nFFLauGj`ZQOzQrLHucV%@#3`8a$t&`O zmG+x21{dqBewJJ%ia((ixjbyk+cwE5);^hfIP(ax_`JMs?vh&nFUlx)rAC*&8PH_Q5pRb$J&9qe1^ zIJZq-`fNNqoUQrISMd_z&E_F>!)5xWlefDxh=*FZ7h-X$uoS2xx?{kkrD zG|`)!Q;fnB*L#@Qd2%egu&pVXkQGw(82eYYfk zOg<(}F{bbveVR{q*_K21Pkr08zDa)xe|Vd=v^CpoXoolb>7;?Z0RXo zipiwudUy4u#(lhlYd3!xd!QxluJulwZ{=TJZ#AFrzxVAi(>0NudJ6-m~15y6B(F;ym^}2gE z|FSqoYcNsi;H~heQSQ{lb*7=mU7}uJN;zv%*6m|^=;yVOX!iP!uIzBQOiFGW@7zU! z_#E!S>kXU3hU{&hf2BDxxJ~%8=PJ$i>fo_7R^#ZK*2c2BpM%Z(l~>KlBy3AzyYjX4 zp~O&E#L{)Y$A zp7hc*INeHAuM2984bgp)GIZ(u5%2d@y}^UUwCIR(_#J7i$Qlc zG?nnV?c4dFob}f?hBM6j`a2*0%-2>s7{U`bqQ5as^MZ!ehmYNTMhd6bT#S1?OgMO4 zEJ=*>w(NqQV|=s0(XG7fMKLbXa)K2-OO|YN49f#~^(KW%T64#2&KMXvB)`wtWuf!w z_TU@BG^cz*?%27*Kej80d*xqP-eJ3`O)fl|&$V=$=P#MF53hcI#3IOKKNwc~wBUob zSNOezZljV!pUabn2EH799jv^CtKh8nJ4P!B@m$FVH>sE25-Xk!hi(+8x?k)rD!s18 zZ?R`xk-)LXpI*Kw3o;FG6i$DBVABb=6UX*8etX|+BV4wsEOm5-U8`nSwY*pj?^vMU zwJskQI(o^gdHxl`EH}m{HMku4#~T%2>E16i{%k*UX}{UGlT$Ib3=hu}T44F(BvW=y zpVo0v+`MzCDq=i4P~laM>lNCC>>YvbTT*kRK7Cokw_#76YUkUcE;CiTQ<)2<36a(j z9eT4fT5Sh5ZJ>!tHkubvU8{0RCZ=3sq~G^^$DpSab>#I75|_~KYx)!ZYoGG8*QR!a z-K93~Cmz0RXL9IxQzX5<^Hg%{Godzm?xYJ}AF4Mhuaz>Xyf?~1Vtv8jaSLa5gVv`O zpOt<2W2wNznl;Z#`)X?NRy^*ZX;-a+A^-%(7EMn)q%u z^$d?+?+m4P>JhG&eERe~$ZX)J!!%n~;gMsqqKk#jqmjItTw9vCU&mI&9};(IPfR)Z zGC?{nRy%WnzgAI9jcM}2`bB;HJv1iyn`nKMVEmq>`}O(dL8p+k{73H+)TT^N${l!Jo|NoTGQM*zpOr@S zYVg(kPH8j#UhSEP`oenI=3a-2uVGoNON?~M??&Xed`eBayz60`sLWHBGEqSbDxv+q z&hpRf-pzI5$_-|Z0uFkf)jtCF{WJ>QY}x7f%+1lG;@N~LKZBKpYvCjH$V`8|`Ca?2 z+vSZHu46q~`jgOBbNYhXadE5pxI>H1i6t!qml`~FevH3#eE5el-{M;4ylMNJB5n0v z=Nd|%unk%*RK65D9PH1e`7A8-jj?^oi!rZJe^(RDqCv|YTpFtVTfXfnI4-bzEbyjO za)#526zn+R=CfvRB=x~^IYvo=TWg!PZ{#kHO%mZU*epT(P%ar_BD1`qYoU9liH7;>|P_cu!RH4im?4DBj5 zJfHKua?_nN{8eR+;tbVm;!Z}~Gm<&|=>46ftv$RK4~HoQG*6y7R-?!1WFD05jvw5< zFNXKh!KsII8r<=Bb-lJ7QrI#uxx+ZbXKVSMCc(DPx_r)}Ki6+OLuC0@^O7!NgXfD| zI(kw1Q&CiThK!yoP|@4vF9#7(h_-p0`9V#sw3N$<|LkEt%M^v?Z^PVAtlC?`$Nmsx8Utlk^D6uTE$3w-QoZU9X;rJj8Wkekr|jpMrSN=8WQ- z&+gD>S1^9+m|3>yJ8`hF*2CGmh3EP5{6nTazn)~fnj(+s67?i^N1 zJsZR>9@r9pUuT;BdNncMs~BeQAV{FgC6(<9+)=jMr#mGhc1e0X|o2BhEYK9h|h6WH{nD3pnt-V$zkNWzuVk4#;Jw zG|S1(bP%Q&j0lHh3lzF4WE8>zGPWJQgWEP|H!5-T^D&8zP4>d;#1@6C-)#_*c8L+X zbp3#B!1rd`ft_Lwrj=z5-vbNWm5#}{rxtg(Z6FxAmCTL?CvQ6zylXro?4C0&j4x+H zU~geeps%ex>F1|K(gFN2(`P3}O`YJ!045%1n5i?xSjSLpu$FkXXn9q`-jd;Lv##iY z1Gn{!>OiOk^L64@fRxR zR;}MWm*20n7XgMXvo}wZd$(p+cr~rTl2FtND_Btd*>*5-W4se5=INK35%2 zm@CtaaV`6@C-yF}asAyE#>6D!0@kEOo6o8KUwl)C1YI+EMCUS##@443Tw~ME-`E^i z7G4>*vBV-FQMoBWae63v`G;Ece)+3WeGinPNdA2%cAILRNXpEO6j-w>vh+3nw0C#) z>3&}8c(e2M@xKmwWei44XZRU#T=-EJf5C+Hd}0a>Q=&@qL|U(iI7-;EnJS*%I$vSq6!38J{lr79&6;-{e)ipIliHQ1TAiEs!KXTVdk{YRL}~qv z)r!_PvcAT@GrY<1?w#ZGu=9l1aGh|#dwR)<_qX3LeGzm&|K(KHuAh0qxj(7PG=C)Q z?)$OjTm8(NCF>bo>FW8%HTZcC-`rPUU+sEj#nadEB1N+!*uuJ}YF~X1R|bCQ0(E+WC^#_j!)Xy58ZwRetYIwyauX7_LUx)dgzG{?0m+IEJ zXL_H0nd)iF6zzRdCArs*6ltZA&u8`CVfm2bN8+K@EkXMjCC2w%8=>7V?saMZ$!mN8 z{B)54_n#8I6*QN<&z%|%GLH-jTH1Rl+^3c{yoWj8W8tN|$G#0+uCLSdT>}r9+TAsI zX2*R+(mri%k-hQ|adUgr^5zgDKEe4%k%C89E{R>FrxlZG85gh73KHjx?NZrktgn)J zIe!;Bhy1RJK}o6bt|F+j;?P%YDFdbQ}OJtX6IjR<}c>W&eCT)n|VA4QF5#j zSZ0jL{>C`^;OG68vzp3$hs_TcZ(g-ewIsH%ah62fgDJAIh!T!El7Ys@{>; z=QAHf_UbU+ z%};52tP-E`MPD^3d;4M9x1V+&Q+|WGj_{lBZ(exPiXPQkw8~Vycdpg(DoI`b$5Qg6 z?B}c-bf373tlr{R!ggcFamEV@SE{nly|JD3d>b?Y^Dgc@NgF z{67pI&yj+xgBw$sFKr(>{5ZC}=1#l9yyPs$LhaeiuZcBEdmc-EyShZD9hm2BoUNhn z+;I8K{na<6>Y`>l;3tnlKS}l9+&`;3T5z&-erD?HoyeULt2qyCd@1TPx&N+3_652} z6LWpct@zNTm|Mr#eBAf#Eit>8bBSw#aezrVceCZIiicc#nAPlAygT(iu`P=V)s5d{ z%Hi47CZ@NuG%p8 z=Hm^KTQ#}oS}h*$e!Z@~V106)eaQM_!@Ka8FI}lhxtQ!U+n`vp?bXAsIfs28b-W%= zTvD8$_%8JR(49sO4fcZ?e6<(LR0}yh?o5nKRm{XmY>25ge_+tG>Sl>r5y$na{Lcdd z>(}s3#T@Rh3D*kHTe2-3?$K_hebEuIk??s_cyQ{ZYWkPV9p;v|O~$1|5**$>b7yW4+U+yAZdUdb1{vtk}!8Ov4Hepd4z0%JWnmx&Bk{FW(k+a2>| z_2ea{)-rxg){i9)W+^lJjo9$|z1w%-#hXEMOS2G(RPM-To;RF6(!5I1vL>4nUKPFk zmBF>Q)4Rm&Zqao;U-%dW)6)wg;?-m2I%C^7UK}(sQQqruEdH0lq_@o=U(%^}r;RE( zeV=b1+qvre4ISxbqk&+;h^VKRf$h#U`?kXoh%MgDQ#CP*x42g8wV#(xkwwMiMP8}l zlJT#PwyLwmbe}hOe5R7tgXo%+s=ETLcf{_% zKk(Z&ts9|zRY6;;a58G)3)j4G$pz8N?ax&9d{Pk;ygZr^zP2}_WnAwmyFpl#|4pah z^`E)Ax!3Y*1>G&~x^ZO3R|CTX;YOP;6bo@ohfcfPr)F{~J$d`Nu7V9_64ZIsXqGvpSvk4{kH;G-UcobNKY;llZ$Q6{Nc&Ph|YcJ54L*AQ>1< z-RkOBC-J0NJiNVr#Q!blA(@)X+5v|S`X4`Sm;L&#&`{Hu65SxP*R=oW70)>0tJ8Y% zbx&f4E?!?OSC$l%8)kdhZ5zAkRKX_Jd*RD*pUy2d_TnvK_YHOhd>*P1tjr0Mj*Q^m zL_1*|d14dE-`Qka^@p(TfLHu9EQ80TUK5-O^@|7729JwHe7|tLQ}}ghtLvuUntKx`yh@tdi0d0(vi@<+wt9_gb}GZfpSrr6bAjn2fG8WrQM?=eQ1BxQr};* z`c+M=d#%H)u*2zq({AyxX9UN#iaX0RW+k1FwX8qzgw|?X&f>Kh8!A3O`PuTIH{h-QQ}viM*YyiZM3Dyu*+IFNY}4m$ISed9 zpLm~b-Y-Po|Fo@sd|dcONygQX%YA#kue-u0ch@DHZdPvIfLoINpxMqnIJqkdf@|8= zX9kFwAG_C@|H2~OF4DwFHGgJ^`Sn-(UvCH8nL;z9lC5t1Kka=BSWR2k@Y>xZAxc8n zNQGprz1F_pN=4}+l?tKT?xvgFE=34M2q8qF8-)-;2t^W#kV--bAt^%c|5$sso%Eh_ z-uL;w|9QUu|BiXiXs$WNn71*<9COUM=Q-2fdlVZVuMz*mzWzaSNx;Y~;fkn~h5G6P z=j`f>4%4Zr$BJ|CG^bA?%7UrMR>qEo0Uk{$A3Ybte|iveW5>N7*$TT2%JsI5(PFq4 z`BuDM;W$I+>m8PUu%UDLM|!tax^0Sj;WYSh`YFA4xAqOxod5L18t%6vb++}MR*Q=Z z$L)-1MU%E1U^R;-oj&Zh_X>|)b#W5!`GGA1Tlgb2Ue2_zjyAt${>_RwboF}csn&wV zx2`7#y>^~odo4jS_vWk^)osIipNO;B93{?KwJy@sbDuHiySLGGmvIy77nxHp?)?&G zr*KeGb$rd%j`*#s@0!oN8ql`%{?c_m@6OTKkHpa@4jWll9v6jNp0cC(m8IXVf!eAC z3c6#yo@3D_`Jj5egT2#)8@%yh!!?x zkpw=iV=)#$J11d0F=kbK7a|cUuEPj!%GZAaOl*eWa+Rg7O&KkZmE3S`D7$|Q03B*^p@KVZApc$?>`l7)Edd~ zQfvsRO;7*w$@zxhb>aKwmj+|weOIYI8uBq>@UURF$+xaey?)=&eafgInr>Oe z#B4O+!%O4OSL};V?~ioR+}STvGj`&>1xIwj>#wZb^|Y7iQNGX2Jvu6Ro*wO^Y;4k^ z=D1QD)Itx&uU9&{{fXY`lpl|jG;8mk4480sYXG(`tM$v{GM(+k`zYhi&GZP}a<2c( zS z`_JvmcXNoFaq5PRLbZRSljU%Y#KSR0Z- zq5SQ$Z?6NgD=W0T?mzN%MmDY-OdJojm@h#S`&ur}PdChX@l5yL;+_2>#->rL6Kri8 z9jzqAyLmYdcg3sAgPYrn(o*iPQ@5!5Jm*JS%(pEo{S37CY-?%sdT?;O>yF`s(59+H zomZ`@l00xZiW$_-R12QxtxxPbU)X5BecYv}C&oKZRlHAgs=hk^OJc{g*fp-I{Y&0V zd>_)Xd<^^XvC(++m!cr^g@e>`SSzPlt-a#RF%40klU#5t;hIy2qrcyqVMovA_U~0( ztY>pKX87lRJ5SKjD%BV6k;wU8W0ZCB^fr|~UYvO|Vdx~~EYm|&H`A(U+X1KW@mZc9 zBAW6qeCuf4u)C1^ap@;*wexulmBV{t!<-vO40vEd`xG?DsIiZ3T1>3%n(?&J60-~Q zSJgj`dd3+yI`PKlRQo)Q+MNQkq6=3(CDgmUZ0TU`OuKoIb2PwC(q4Mb+NHi^YR_v^ zQ+nB*-8(yIWj1Zck_Hd=1q*^zd-S9)@K#xSZXK;`;g;$eqxO5L{(TkV#Vf-qy}#e8 zYWT4uHtcmK<{X|LwL~{8s6^dzeC?g7P8v7*^t+?CTXp$~=N1>3Ew2e)eZh@V!I8Zd z^yc+h+jgg(nO3x7`s9m!E)*msO=9R5Sg!Eje)8GEu~-0KxTMbP`&%OlZG+nIz_pjA zk4|0mxsLKZ$1v!?UdzaVU$b4uWFPv*Y~8=_(-&UsgRHZsxKhW#fQd3kCDbP2LsenG_9ZuvG|bzIEzr{>*+u zdwS!Sty~%^rhk}XJhW|0Tj0pmej~otjzIHTmxaH&W`9Rz;pzBioS4-~ijMUaKRyMV z-u1FyQJ*mk!{>??HA7u*?+RiS)HTO%P}jQI96dV!L~YHs%K25^FQ*(@66cQ{!&i2^EhE@j3ZkCy18`c1tX6(>8y*Cvd3@pfCE z!Rey#?~k6n${jZ+{+$Nnq`={1{q(zP>tAkcYj8EJyA|1_lRuSvfO*|>l-0zmi{`lv zxjJ;3{b54E-*cK<`cl6{jkU_wNBgYP-;vib$?U<+{3kPV8`eB-a;FYYe7%U4|8~ZQ zlFxo-)68#Ius?3!+`D?eUeJjzoKekACZ=c9UM^iSe&2xHK`A@RvNtuQH(8g?e6Xmn z$A|?#)(_>!s8wcX>UvjI4ZT=BX@AR`F&Z?L!K`g6i+A^k9rB>R{`^fJoF?1MyD>WM z>FA8lkJ@YFwcdaCOCFkFeE-Vj!dbKOMi~uCF&=rekr4VVNzPe4h<&|aq}ok)+sNF0 z>gWU|kMP;W_8HEv>7I6Z$F=IK%RSCTW{%}RRP*VnaAno3Dd0)tX6sHo2V62`ea+$ z%9L?!m)kw2Q**X*_U~#PUYxnlSC?v5^!R*J?))jY)+pxJoPKoL^81v&cjhNl-pxOt z^wNkE9563l=fHCpr7t7=HIueFYxb_XK^-%j8`nan+^_4tUF)+Vrfmvtr!{_eF~?xW!#U+i->voS#vBO9HjA;=D|oavH~Rj! z9lZoOd3^1})*TY7GYW0@7YS-Or7TWfzr#E4RrK&xIjlRe2Y zxAQMbw0ji1JUQp_7waP`GyE2RKOIvaST-{CeVoxj{lPiAO&y*W*{prMWJ=KKh_@{M zY-gkSLz4F`D4eZ{4Bjwz`QYF~*A_gzUiL+_acl9c#RF@jDre_n&9m9!H`cu3h%up8 zUdK#3@Z4+Tg3 z>pIhxuote#+RQZAGx$M#%JpU2wJ&{3s#9)$w`zm#?x&L1jq?|t&UHN>v%UeHmF@eO zfjYj4JflBm*31igw&x9s8>^u)VTaOnyU7cei5B&3(`+lDop#mCt4%$W*?LN6!@ixT zrYjF0NAqmGT{87MwYP9m(1OJKJe&4$J)YI^m|>be2@|8HPO+-(_3So&$TTAEtgCzT zy4g&-N?P0AKxb9q&Cxv^uZoVh7f#(eXk74`eQIr^OI5|!JbhF06JA8MU)R3rqw=z1 zl=7l8A8mS->bh1an{PI(o4q+Lt8fT7Uoh;9ekgD zeqd?hJDcyj_N`*5tx~o~^?d1;QqgFaDRg^m*#EM_<900ml&k)X`*G;*sRv^M-0fz+ zfAHMHW3J{a>mb&|#lvb>j`%9hj2I#LIM28v?ZSuiJ1FOmnqIl`*yy}^kmsHFF{XER z8mxG5($(a`yj!DRt8E^i^EtWX8U1>Sw$E6S8Inu;bBMg%j5k2+{Hp0|NVT{2|Tt|z%vkK+*?efQap zn=`1#(fgz9cCWq_P;29VIO)WOdY>OB65>CaA5jnf8nmK}o;M`9=e4}>@Av2TG#h(n zO6I&9r&D`o_wrNOGp@QRmsqlO`jL$EfsEr{gw!Sz-JVUh%QiE;5X({2R|<=l_gdgE z;%j@n9_#9Mo2{Y?m+7`kCvdgaGu=hMu2*G$j4=kFf0Cj70ZSrsw4ZZa( zk+;8~Vru5sRafT@`~KE%-t`qlmSJI}}>0+&drMnO24J^<0bz9NAXyIPQ__Oi1)fOEosvUABxLEt%v`wG$ zrlqEd9^2l{)o`ik8`guBJ>g5CMfy6fW(Rt60(!Yl=W>wm#uYlBlveIl`_kV*r|+qn zUd@f!=XgrGJ}bjt&t-B=D_Nzq=y40zoON)C+)1@a9iLI5UX?Q0#iYz_5k^IFWB<+@UpKnv*bs{uTTHK>+@9xSQMD%fzUt>ycCWtdz52cHh{ew6 zwX_h6q6q(>#lz}%JP9z|t0A$iRPY$6<{{WUlX9o1Sly|QM#F<2si$9_y>aovIhUFk zqqvb*mg!e-s|$_&%zJ(2n>9z&rkK~;tmEmV*Ao}HkMTd8{cLei>)m(vT4pcZyYram z#=g!bU&i&mX=gNrf===^QK~Q%m`)Bo(Kb)KV$ImW24~hp71pF?C3)`?eba5bu54@> zd?7C;wkFHEZos0~Et6XI-yEwy%lAy z)>xofKKV-G>YDAV7hO-bG5m6-ri~hBcy;}KdWdFb`@D=F^PYY?XQ5cK?ur^}vpu8f z@V1x-)4rMPyb?a_^@0(Pj=UO|q!>VtjZi)^Y7O_r=$Qs@_Ic}fF8|0hA4M<6v!{mc z>7Aa+ay8G4%3XKP=hpsnL+v_hV{Nu47r&|cTvxgv?#>!bEtC1*t9p(TGKPK8xDs?_ ziv3s7s5eLae8d@VD&DS9i663gfP1oYb{4y0_xd=R#m%`BC}%TU8ow=`zt-{G=VhGD zuXuHD^r_lMj-MdjPQ2h%<6_vOYM0m4_dPRSTnSKpt>!sdYr%*n*-0;tp&@x-kx9neb`9G%S^9Pw|LQoO6PhMXV2U z&fT~Py~e<88$Is3{mOgZU%sl}x%?y6FWeqk-5xk}ZbC}m+upluR*XM6eqBrGwC6W2 zScim~E#L;X_+y_B25i(EmfSm5C&TtA?X+W`59i0&Pp&_bcxn6lwt3&*3?3KzC@EJX z{9wi%K0Ssu&cLQ@M$LPtE2oyW#6{eV*oJR>H-G4&)nBUvZ4VZ@9LR86ZhvLY$O@AS zMs8O1i6I8&+j}S2zJC^x%o=e> zbE)dQuXRpkZI8IN)J2gm56`<}KV-nx6}vV@axUkePA?j=)gaUP#^sT5dnijkK6x75 z*IIYpCcR$I3NF~5#8t->(2VSF-&{O(X72EazM<2Cl=R!?eHrp@Q^-a2I|ip8=3!Qk z%gkK&SKqF=*|Pi7%Jy}$h40p;nhqZL@JT||BTZO`^uclIxCZR0IDUY5w{3^~LXZ zvQxG$%H6#*Oz(%J&(+0`OcX}l8QC;y-l5^lyr(Ls>J98(^}C|?-1&;*hIfS%mCHVd zJ31t~&zh*^_n7mc|EGg@cL-AI&};+ds+m!Toh?o&rLU}AAsK?dEZlU~e8;j_uh(|E zegzNvtZNdu;u&+=WsK>(+jRn&VLnZ=TrSm z^wMLOqxjf}wV~Am6%O_9z0cU~)9|aUkvGaOTxDxdb9%kWQcrKZ@N{hE(baZsySDEA z#`1OC68)rT_+F=QtNS+|n;M<=n_Zx)elG=QFB_z19M|u@-qSDBEPXe$D6nTP4qz)I z!z-|dTO1m`rT0sGcTzn-voKt|@@7jrb;rKj``_g)xxVV`iJ+lluS~A?7-%Y#nC-i! z{GOPx_5P06cb#+=mAOb-{dh}y1{9o9$lvKOj-a^=uUu+iTb=98R)5edBwl}wp3a%_ zW&JlQhL;R($g~;q+ApnR%cVnc5A336oO<5c7j=xM4be$?S@GIwGm~@4eN-ztf1;bg zca7@i%HSnYlJD0#j_*r+a&f^9J*~K-XRWrcGWpP2HMeGeda4V&tUBAgkTKS%2Y*zX zQ}?YG_7eLQ_MOXUy`#wbHeCr0Y|P|@^uvlUfbEM zee&%v#X~a{5|BkxANGx)-deN8;mm8rNvPIdiLcEB@8DgQ{+kWfr6?~tUNd!N`l(rM zv#yTwu6lSX#IO0|rH*gUpRR0sk|xw#?9ew&NYTVb)jm2q>xqv`@uXWRt0qnf-(AjI zS!k4{dx){I*?nESptW#mn^MR(*Zw1IYHF|FTxgS%akcz_c2f25aVZ*VoD=a|F0GU_ zO|1;*^&u_C%Iht$Oy{iI$l~5}y`L(^tav?v($Z^KqersUlTa3mRg^#P?C0vyMtj2I z3~c90T9xKzM_oSRpY&{OamtM4Q!OW}Jh^l`(Babr_l>^1^t93IZH}=|Og(EF$i8#W zFgj&t#ek1-8JkwF&bc*c_<$ib(|dmBn(lso6??UIb|$5?`Sq0SrQg;XwhbDg9J4j} z&eTgWV=~Gbxen=`ZY5(Es!A4L41FePedh1K_oQmeUZ6SN#BK2QdU-h&;tVezXGJ8XJ=6B7J79H>i;J6{x_k|e>3#`ZwB}uBm9qs ze*eRv|35rv{=Y7z<}T3A1wjx-{H3eeoNpVD}jN(!*2=vmcTz&0y@9LZwdUC zz;6lsmcVZb{FcB!P6C5|hu;$TErH(>_$`6o68J5Ff1Ct5UjZ<2CoclR;{Xb>3xPk= zBV=jBos5C5)R`t@GB5dl0~zFL6s zo#@WD3=osVBt#<*pcR0m$@|eAFYk}N5YY$)NCY7H$@Y*TMqBpMR}mtM<^4ln%J}4X zc|Q^SSG>HxMH;{2<^49%{1q?nKehj_c)1+%6n<@wTps8+X!}@1!yaO?-K1@T*u4gO47+d z%GDik(!_t`52;@ykaCdAf-H{gHwkh&i6cYzv<&;lU$R}Kj+5;sc}e+`<;uVNYYouW z9ym~E5IoePq^g6)_|9^&v$B{d@C}@kZmujxjXQAFVfPBg6k3e`@t zuMjDd0iGODQY3?dG*HNpJYmhmjpoexH@*}d-*fNyi&+<(*=_yWW@IfFZn`r^_dxRg z9<`KNEBc>{!}KmLR-Z1JeNO!S$b*<{mHHG(TS{@Ue@f%Z$>-jb?kw(Gp02JJV)SDC z{#ePB`h9tBb@87f9Ht49gG#ZSG6TiD%S&gRf7h#_bn?dRJJYqZOxi(ttH$ zi1F7TBU{bhEJvp>HPIQhfC%F&7na2ti8rM;ozJlL8JrWk*7`!`w7|=Qnl|0kQ`ue} zNAJ@fniim;U7R&YHIO;XW`U)_@xnafn7S@|%KlorsaI2Hy$dn+YgxWQ65_QdQY*47 zR#oA0!sj375?=+{XMN24bnb2B{8Ha%Jp|fEnF#WYxzH6NX$TdI!bF`f`;mO|;O+0#i3JR)7&47@5A>3A zkTLn1j!Z`aL#3ace`L(0?u2@F#cN3uBp#ls5y>eOiVl*zMM0V=*x&0X9$xN|R^1Oe z667Q2hUQSHNaSW2zqcq<;`fuJC;gJ!b8G*Jh%LZm06#DMCl}dIKQH2Enrx4!gnWfZ z7WzZvDfxq6Q=0yRU)GCG=FZ65KTPrmMoDHrq1|B;k3Swx?3}1%`vMmRd0?Fx+#x2% z3WAA!Uy4TJCIyY2od%HPlef$r7)Fp>5PtHJV*??Q#gKi#U$Q?WNCTAD3bKMJBTagU z$ydH*f#i|fN#tMoB!1yR($ORNBc~fQcjp`HV;rl0ecx%c} zL=6iMqK5cT1HGso!QRxsP-;+kn1mV}BB6>Ry+lw52z+XKiBOh)n)Q4NAUf<*iX zkHBz|0X5XaUmQja6M>98$VwOZOZ=!_AwfYNVY2qj3l3QjObwBiK_zo`mPeHqK=twn zCToLYMM0qw=|j9$!9eo&mgkZ3k!3lPHB$YrLZtc! zOGLi#;FOFvBwRxFPV5ov3p3rx5At?4#5+VJE2mRj(ETWRW)O;xkAI|y?0~#2LE(WC z|Ik2xk+_peHH0Z|M1?tTL=6#BVcw4++h_y;4?QB|;dPp5G6oO;n8B;N;qb<>H)sa= zezF8&@+IUz_$FThC*K>U!aLpJ@Mf_Oe2f1g5BVao7f?lzhkVia*F03f`NNyPGP7ob z%tUMvQ{W-rocDs7$XE<%GQULnHgPa~k!>RJBubGPwpv6)MI~jG9;!Xnda3vB(>JDDD3bQ{ zzxXFlwnmY;^&ZK5+n*&-et!M8KI-9}wm&PtuuFZf?yQooo}`^}0!TjSj^YG^1>(9r7Aeo`cQkT&YXk#u?4@-^KA5MA?- z^djJM>rxKcvp`5kb}5VGk&C=*SzYsyWqk#{oGxXNc?uw1)QKbMBp(^NmP6(t-wITW zQH*I%Q9$hB+Z^O&3Guy=6yy~^t|0|!0+>67f}{YH0=SH&AZ`G20XzXJ0PXT`auyb$65y$ahY_1?DTq1X z?SUxWu+>wLL}(BHJ_Q*Hv4f+zBmLQ6)#TPD>s5>dU)|mM@5%m}bKE@KETck2VoP&} zxpt0Lj@?q=Y>b}{o*MXYZWfUev4@w$CR}11>g@@+5d@ki1@gNBV6vH$4e3AfD=3Ju z1l}Li3zEKlNVek)&}FztP(BKx2YHSCz2R9zJvx~m=8e?%Fh)@?A78NLkS5oAV>1UQ zJy$bRk_Y`2Cv|O!UvO4ZJ{I6eJ(uORG9&Yv|H>!LYxxV#UYgeiaHJ0;%WLmS=5_j& z&y{3!{S_xI&+QkSle9c{z>$h1E6+*F7YewEr z5fUf~@`f}yr?p`0J9!r_TcJywWs?1?D8|6n>_qW?tu%0%8u%sIh05G>ud$AnqiO zI85xNhe};iciJ3WN@hrRcNZ#iF8mvXE} zP&5Jn$nxd%+AegqK1IU@;IHVx#uSZcfUflJ?Z~!~(dR(y2OzH}t4lp({(>nozK>QE z4GMglkjTz3%bKDA>{2<%V>u1PC-rl4(%?;0<;{ag+gkwNB)$w{IUgC5IC=eD+o@nm z(NF;(dF1r2aySgMW1aNA&_0sSCS5^l(p({y0FXG+#*?wUjpSUcK0(Gy_94HszV3NQUU~b=JLN^DT^uMHVgQm~PVd@35+68CCS$T5vi*w@K<{G{OeZzJ-sphS9$>mzNM z^!#q+uUhvjy?gn^oBp0|wDnhd*ZD{GV`Ijz^zP-)&-#_#Rlmvn83%u*cP~FU@9*i? zPy9;nUcc@6U+G=tHwNA*=1JcwCR_5y{NDuY3ppp`5D)1DfJ6X9mx82|G1A3>@eYK| zjm)1R%OTe%d1%Ro?*_7@e+}fCr2%w900w{^fIEN$AO;`-AQ@mkKmkB0Ko!7afUgGt zAlAu&yZ}=G<^U`NNCMaoPy|p1&Hasi3}ssWk+)X9wl1Ph7fgtx4ZA2asqJP0BA!dOg zVIoU70SOc#BPr&hK#}BM*h&>9izN2q5HC}2Z#c+=m3{+>u?_JK5A4kA0`H0|Ify*G zC;3A`2uH;Qnjn%UJX8Y1Bx0}7s9+bwT-i}1A+h!$B+>=3R-7Cd z0uM8r1_p+BAqJi8k6G;h3d%s7~Dy%aRBAx`T4;KRw zPI!YQNRZOBaFIC5UL^J*&$fcSL}nr3(yosG*V3)L5v&W=$qz)~4M;>$5nAFH6($h{ zIr#^POv6YKkYC6$MXO*KTsS3KC~~xc<4{Y;g6xDAnTtHbec=E|-jbJO$&Tc~Xn3eq zuuq5!vIg>k7(lf1MBbAE!^8ZfB_QvW93+9$gBSP*dm{_TTsCk_XCW4o&!SH!CDtXq zxJ&)r)X6m1+cDHXSlVBtRM{yoOg4;28Tk#xN>8ScD`W}^m8C9|Dd~`&r;w42zo*zk z9EChlv?o3%k!YG@9Zj*ZaS@^Aj)Tl0bk5QzmNamghr;j2r*cUCb1T#2!4G9!Y4VQ$5gE-*FkuF#m zW+=;|n?13Bof2DSdpdKwAVa{4bk&=GU0Hr({Z%JT5^@)r5{ z`uPXU3k(Vl37roHIXq%PWYj`gn@lH~nOjVnY-u&c+Q!yys{J$vN2lq|F0SM+w*Q;L zKV1(x$MXMkb)YCHk!AzQf-^_=cf(im%VbH6G|mD3;>@~C zs*Li+czaM|tJ2MwPP1Y07@S@s#u$2v=t$7HhWch?GIPW*ay^WRO&%VwSYqg=~x z6pga)6b;q)vOTh#r)ykvTtOoZevdNiitPNRQ2zw^AD|Q<-(U6n@3NEmy01fj#Vz_Vn4DlcbYVw zWk7{XNx|M8fg!;nzCn~I%s?pUt;X{R3ljx-21Ze#fZ#B`LAW@W6XxY7f=eUggZ#b3 zAz>jtlJRhhgyRtwWE_DRP+{li?;{G6ICrfLilS0^5^;E#gxn@}mNxR=l!lL#=7XGJ zBCl{bp^55D14b;G9}cyMyzRyQ5wI8Y6@~pIb|qUxLRRur$wm|*3Zw>-fB6O;VQ^g} zWS&TDKn?dd^&-zn_y#^6fnjh@X2Q>McoY7*7T$zk+QggivvZK0H$g5pNc=j8f1c7n z5b}qv4D=SNK%>z{;tu$5#%hK$6JZ6hda^ax2iPhcEsi&b;EDMQ`EU3|LWC;&-M)zS ziH6{P@nQH_oQ+SyZSnbdA$}46iYpRoL_cCEp+_(Y0pU-C5(acS{R>Nlt;@d87IKCB zNl?;zeqX_0!AQXZ0W<)Vi~P+l1Kp37qP?-lwEj4a;1g~{0I`VK$Z6s|LMX%pey4@V4sE8j(%NYqw68P{VM=1qxl0Q-x0SQ5sP*qeN z)j+jS9aI;kqI#$yYJ{RFfwE8@YJ!@hmZ%MCk2;~Qs2l2zdZT`5AR3BF&`2~IjX`74 zcr*b`M3c~DG!;!lv(Owg7tKTS(E_v(EkaAsGPE46M61wRv>t6h8__1T8Er+|(GK)0 zieO5ZDyEKUU|N_jZ34jn`J@nMnPseURwb*7Rm;+54`p-Mlh{Yu+ME#1F5VGd5&6Sp z8hLXOK}Hf93@wHZLzmHmWyy8mF5&_*4}NooXc1P1>C?v3Y-l3d4q67Sg{F*a;fL_a z#C90F5M~@#d5KF&ufr9*@q#!g^oup;a-R*v1qYO#k{BlZew#RBnA zT!Kg9(Rd90g!z)$2K8ogzwmPS7x`O+c|xQ?YNHS#QAXdu*w4sjU10U+OynS~vUa#) zCowbHRhm6sgL@Hgh(+`sjP(p7W;Sys>lteSJ587^JVfdVcnf6TH_Gr=ocz?;Cc=DG4Dyk)$-yraBxyb|6O zUOVqIPlex~ufre8H{?h0)A+eC8*cIM@}Kfw@mu*Fd_{qVKwB_OFjjyH_yRLQfS_E^ zAy5|T3&#n~g;qjmVX`nycw2a1_zLDUh5Q#$L5HC$&@HGFwh=pkHDE8WcI*q*2YNS> zW=J!p5i}0Xlx9hrN^_>org_6yhtU?%R?s%kl4(0>nY4qnleEjU8rpN1c^dd|+z_YZ z)_5Gg9^Zne;OY25{1`r#xK6YX!|4w6Nct-JE_xPyKRu6rf?i0!K(C=U)8ElQ(R(ol zFcve`Fb*+_8S9vPnR(2s%-hUb<}2n8rV?u)3uD=_7PD5d5?OS1EW4ilnEi^~&i=+$ zbMiR_oI*|!N1HqAr#@7|D5}Eei)q*{Oe8DNfIl*1Q zGr=1{yWo>ROE^q87W9!2P8H4&ieN^DfM#wJW(sqJ2Zh}?upn@Ew`c_umu)yEw1 zO>|X8B&!H)#sgLhON%{)9l{oHA99oU-}p@e9bp{gh5rCTX7{i`m@&2#TZ?VQGO?pr zDRu*Uj6Vlz@OtCcu!&sF`d{=93oB< zmx$5yv2-zg5#5iO&dg!nXLYdD*gEWSYzEtu?asc-Hss(OF=q?s1&q=UP7kgojF3Nf z33oMjBR7?s0poLwTg<%ybMZTOAWxTP$(zBO!;9hVtn7XC8g>VJjA_#1Y3Z~BptFx?N_a0=$?WhwcmZC5YZH@+ zWkfY$L7zqcK)=bTWgyJKOpM85x-jFINuZIZKp&qom03nCQ`R)r9M*EyYE}-bn)Q_R z5&ERZ#@SBnMPNnJ*az7++4n#<`)~$wbU7n980aRKW6iPWOy?}-Y~^He@?hjEInOws zID@$cTprhgYsX#6-Nw!4p5Yd8FF|irz!D7S>G6a-D`}6tcuRQec*)T34BlB@Ij@FS z&wIrC!Rx~x#2>~V#W&|W@z?Q>@bB=OVVxy)XsqD4;Edp^;E6y(I8ZoJhzglPzR*=T zSBQjC;8rA@yP>DiFX(*Sg|LP(T0=ieS7Y>t^&*vZpJm3L!}fz-2spDjF`R3hTb#R` z2F_Id3^M?pc0};6CXGrBRS1h|Dl6 ztO-*9OX~tF@^ac5+A-Q`S~cxH_%mv_1#W|<;(7QZTnlCwPGk|M31zw#eG1)^ei8K5 zjIoXJhLO+w%;d3rKreT)hO?)EHm+lDW1nKzu_tqaI7yu2;7K`i7sI@A<;8;@)$k1X zmi$2iq2R25DKr&s72W_J=%WzHqaX>;ras{BU?>B;oEr2MnoT=Jy9VufL!;oD_-LGo zTj8_tAbcsFh989)RE;;`L15R<(wpd(j0|RPmH~@kd9&hKn^|eBqpZ&?O=wLn`#Ad? zJA&Jbhw)5#sDL5h3ML91VE)brYqvp=A~-E55?mK33D*kK$+0M+AXyL%MqN-3@Tnf4 zPtY--J#4VaR+ujqg5AXKV{OVz+<>VH^{V4QCc7n6nNn^lgqVcQn_S z%j9~(8l3|+=oYV$_krihFXrnC)(G|q>I6t7MS35Mh6ZA*u$|a3@N)9$Ct>XOf;W8@ zX3-n=d-hJ4KbqW$Ty5SoelUM6KZkz_d}8u9eVC4j9>&6Wm2Tm#p^sjzCJ;J29Imbg9cio4@};E_dw zHx`d4;>j?+IiPz5coANPSK_tcH#Om{VCfM;mCzt`2r6Mnpact6Jxju#a3$OcKahJQ z5ktfii9|AyM&uBAL;+Dmlo6FM77aub(Mog>2wfL!i5{2Wv0!dGfyd*ccZ)0z3G1RKv>Zw;K@YOW9YH4wkOaN=}GitdMZ5) zJewSPF3f>KdJ(;ZUPdpcSJJEKwe)&=1HBREMKisX-cIiTJwzBv3{{3YL++td8F~yu zh7kj05DXTB$1q`-Gb|Z4410zX!^0h9pP>YM z3@uC-)5DA~0<_Q^w9pB2!@RLT(8Opg7E8dAuv9Dy%f<4sLaYS*_bRL&y!U4C7QbRj zGG~n zrNQh`6mPjCyh*YqexkNru2=<^HM!ueC zB$|nK;wzy9I-mvPuLomKz_^>km^;CEd&5{uV4P!NjFVt|vtVrVVQfoaT&rMA8(}=# zVJwwk9JOGVr3d3jz}T6?xH-X?c{2hT5=Jy5mXW|nVx%&%7`cpmMj@kwQO>Ah)H52% z+of=e5X=YC3Ohaoc6%C_4o1ZcF%;~931$h_z!h`H{IF242><)-fhx>J9hirPFb7#M z|14qdxx&2jgEHCRz?SSe5yU-F2BfhxOu z{~7xZtGNnIovX#w1si7sJ3k)RoNL2%g8iR2?ENIL?~8>!UlOdxS=?N1KDUrt!YzlL zXFa!(+sw`3<&t~(7`Vd)k<8l3&OmDU_523uj!zYKd{lvy*b7_*eu7Xzj38c+ zEJzik3G!g?P$H-lR0$ddt+03KfK^pPs0;QI1v_aD7SauDW2i7%7%NN^rV6uQuU#lC z5mriV40##?6(=f4eIX@O2UZ6v%rQ%tU7;|ql3_*_!CY#BSwvb;(qfVplC+4;><+d) z$B(1V)sR|vBj~vk*R^xc8_7-Nra_wv3a)nhY8CIrRSdDa`2c(^c2IR@^lNW(jA)rxI&?d`HI~)n~nFao+ p3DX?3!v^%j2{gnFG$asoL;_k84SEvG%!9pF1M4e!!u0=C_&=gTW`h6# diff --git a/cmake/windows/template/NSIS.template.in b/cmake/windows/template/NSIS.template.in index ab2e97f5b..0333ec8df 100644 --- a/cmake/windows/template/NSIS.template.in +++ b/cmake/windows/template/NSIS.template.in @@ -793,16 +793,6 @@ Section "-Core installation" ; Install Visual c++ Redistributable ExecWait '"$INSTDIR\bin\vc_redist.x64.exe" /install /quiet /norestart' -Push "$INSTDIR\bin\lut_lin_tables.tar.xz" -Push "$INSTDIR\bin\lut_lin_tables.3d" - -ExtractLut::extract -Pop $0 -StrCmp $0 success SUCCESS -MessageBox MB_OK|MB_ICONSTOP "$0" -MessageBox MB_OK|MB_ICONSTOP "Please extract $INSTDIR\bin\lut_lin_tables.tar.xz manually using 7-zip" -SUCCESS: - SectionEnd Section "-Add to path" @@ -925,7 +915,7 @@ Section "Uninstall" ;Remove files we installed. ;Keep the list of directories here in sync with the File commands above. @CPACK_NSIS_DELETE_FILES@ -Delete "$INSTDIR\bin\lut_lin_tables.3d" + @CPACK_NSIS_DELETE_DIRECTORIES@ !ifdef CPACK_NSIS_ADD_REMOVE diff --git a/include/base/Grabber.h b/include/base/Grabber.h index 954597fe1..d7e854871 100644 --- a/include/base/Grabber.h +++ b/include/base/Grabber.h @@ -93,6 +93,8 @@ class Grabber : public DetectionAutomatic, public DetectionManual, protected Lut int getActualFps() override; + void pleaseWaitForLut(bool videoGrabber = true); + void setEncoding(QString enc); void setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue); diff --git a/include/base/HyperHdrManager.h b/include/base/HyperHdrManager.h index 1683dd071..e10a1415e 100644 --- a/include/base/HyperHdrManager.h +++ b/include/base/HyperHdrManager.h @@ -89,6 +89,8 @@ public slots: void clearInstancePriority(int instance, int priority); std::list getEffects(); + void handleLutRequestSignal(); + signals: void SignalInstanceStateChanged(InstanceState state, quint8 instance, const QString& name = QString()); diff --git a/include/grabber/linux/v4l2/V4L2Grabber.h b/include/grabber/linux/v4l2/V4L2Grabber.h index 3c21f34b8..a1fac27f8 100644 --- a/include/grabber/linux/v4l2/V4L2Grabber.h +++ b/include/grabber/linux/v4l2/V4L2Grabber.h @@ -50,7 +50,7 @@ private slots: void enumerateV4L2devices(bool silent); - void loadLutFile(PixelFormat color = PixelFormat::NO_CHANGE); + void loadLutFile(PixelFormat color = PixelFormat::NO_CHANGE, bool silent = false); void getV4L2devices(); diff --git a/include/grabber/osx/AVF/AVFGrabber.h b/include/grabber/osx/AVF/AVFGrabber.h index b6ba7c2b0..44fa0d567 100644 --- a/include/grabber/osx/AVF/AVFGrabber.h +++ b/include/grabber/osx/AVF/AVFGrabber.h @@ -60,7 +60,7 @@ public slots: void enumerateAVFdevices(bool silent); - void loadLutFile(PixelFormat color = PixelFormat::NO_CHANGE); + void loadLutFile(PixelFormat color = PixelFormat::NO_CHANGE, bool silent = false); void enumerateAVFdevices(); diff --git a/include/grabber/windows/DX/DxGrabber.h b/include/grabber/windows/DX/DxGrabber.h index ff3e6a5bc..23eefa480 100644 --- a/include/grabber/windows/DX/DxGrabber.h +++ b/include/grabber/windows/DX/DxGrabber.h @@ -115,7 +115,7 @@ public slots: void enumerateDevices(bool silent); - void loadLutFile(PixelFormat color = PixelFormat::NO_CHANGE); + void loadLutFile(PixelFormat color = PixelFormat::NO_CHANGE, bool silent = false); void getDevices(); diff --git a/include/grabber/windows/MF/MFGrabber.h b/include/grabber/windows/MF/MFGrabber.h index e8fe95f26..6aa5dbd24 100644 --- a/include/grabber/windows/MF/MFGrabber.h +++ b/include/grabber/windows/MF/MFGrabber.h @@ -39,7 +39,7 @@ public slots: void enumerateMFdevices(bool silent); - void loadLutFile(PixelFormat color = PixelFormat::NO_CHANGE); + void loadLutFile(PixelFormat color = PixelFormat::NO_CHANGE, bool silent = false); void getMFdevices(); diff --git a/include/lut-calibrator/LutCalibrator.h b/include/lut-calibrator/LutCalibrator.h index 8245bfa02..764f288c3 100644 --- a/include/lut-calibrator/LutCalibrator.h +++ b/include/lut-calibrator/LutCalibrator.h @@ -72,6 +72,7 @@ class LutCalibrator : public QObject ~LutCalibrator(); static void sendReport(Logger* _log, QString report); static QString CreateLutFile(Logger* _log, QString _rootPath, BestResult* bestResult, std::vector>>* all); + static void CreateDefaultLut(QString filepath); signals: void SignalLutCalibrationUpdated(const QJsonObject& data); diff --git a/include/utils/GlobalSignals.h b/include/utils/GlobalSignals.h index 4be144493..c15d5f816 100644 --- a/include/utils/GlobalSignals.h +++ b/include/utils/GlobalSignals.h @@ -97,4 +97,6 @@ class GlobalSignals : public QObject void SignalDiscoveryEvent(DiscoveryRecord message); void SignalSetLut(MemoryBuffer* lut); + + void SignalLutRequest(); }; diff --git a/sources/base/Grabber.cpp b/sources/base/Grabber.cpp index 858243496..7e54ff3fd 100644 --- a/sources/base/Grabber.cpp +++ b/sources/base/Grabber.cpp @@ -37,6 +37,11 @@ const QString Grabber::AUTO_SETTING = QString("auto"); const int Grabber::AUTO_INPUT = -1; const int Grabber::AUTO_FPS = 0; +namespace +{ + const unsigned char pleasewait[] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x1f,0xff,0xff,0xff,0x31,0x88,0x25,0xb5,0xfe,0x21,0x9f,0xfe,0xdb,0x7b,0x6d,0xb6,0x7f,0x6d,0xbf,0xfe,0xfb,0xc,0x6d,0xb5,0xbf,0x6d,0xbf,0xfe,0xdb,0x6f,0x6d,0xb5,0xbf,0x6d,0xbf,0xff,0x30,0x98,0xc5,0x6,0x3f,0x6d,0x1f,0xff,0xff,0xff,0xef,0xff,0xff,0x7f,0xbf,0xff,0xff,0xff,0xef,0xff,0xff,0x7f,0xbf,0xff,0xff,0xff,0xfd,0xff,0xfe,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x3c,0x44,0x13,0x9f,0xdb,0x84,0x4f,0xff,0x7e,0xbd,0xbd,0x7f,0xdb,0xb6,0xdf,0xff,0x7e,0x86,0x3b,0xf,0xa5,0xc6,0xdf,0xff,0xe,0xb7,0xb7,0x6f,0xb6,0xf6,0xdf,0xff,0x76,0xcc,0x79,0x9f,0x24,0x8c,0x8f,0xff,0x76,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0x76,0xff,0xff,0xff,0xff,0xff,0xdf,0xfe,0xc,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }; +}; + Grabber::Grabber(const QString& configurationPath, const QString& grabberName) : _configurationPath(configurationPath) @@ -83,6 +88,64 @@ Grabber::~Grabber() disconnect(GlobalSignals::getInstance(), &GlobalSignals::SignalSetLut, this, &Grabber::signalSetLutHandler); } +void Grabber::pleaseWaitForLut(bool videoGrabber) +{ + Image image(_actualWidth, _actualHeight); + double sizeX = _actualWidth / 64.0; + double sizeY = _actualHeight / 32.0; + + auto timer = InternalClock::now() / 1200; + + ColorRgb fgColor, bgColor; + + if (timer % 8 < 2) + { + bgColor = ColorRgb::WHITE; + fgColor = ColorRgb::BLACK; + } + else if (timer % 8 < 4) + { + bgColor = ColorRgb::RED; + fgColor = ColorRgb::BLACK; + } + else if (timer % 8 < 6) + { + bgColor = ColorRgb::GREEN; + fgColor = ColorRgb::BLACK; + } + else + { + bgColor = ColorRgb::BLUE; + fgColor = ColorRgb::WHITE; + } + + image.fastBox(0, 0, image.width(), image.height(), bgColor.red, bgColor.green, bgColor.blue); + + for (int y = 0; y < 32; y++) + for (int x = 0; x < 64; x++) + { + int index = (31 - y) * 8 + (x / 8); + uint8_t bit = 1 << (7 - (x % 8)); + if (index < static_cast(sizeof(pleasewait)) && !(pleasewait[index] & bit)) + { + int fromX = sizeX * x; + int fromY = sizeY * y; + image.fastBox(fromX, fromY, fromX + sizeX, fromY + sizeY, fgColor.red, fgColor.green, fgColor.blue); + } + } + + if (videoGrabber) + { + emit GlobalSignals::getInstance()->SignalNewVideoImage(_deviceName, image); + } + else + { + emit GlobalSignals::getInstance()->SignalNewSystemImage(_deviceName, image); + } + + emit GlobalSignals::getInstance()->SignalLutRequest(); +} + bool sortDevicePropertiesItem(const Grabber::DevicePropertiesItem& v1, const Grabber::DevicePropertiesItem& v2) { if (v1.x != v2.x) diff --git a/sources/base/HyperHdrManager.cpp b/sources/base/HyperHdrManager.cpp index ac39e0dd9..a098c6d0a 100644 --- a/sources/base/HyperHdrManager.cpp +++ b/sources/base/HyperHdrManager.cpp @@ -38,6 +38,7 @@ #include #include #include +#include QString HyperHdrManager::getRootPath() { @@ -58,6 +59,7 @@ HyperHdrManager::HyperHdrManager(const QString& rootPath) connect(this, &HyperHdrManager::SignalBenchmarkCapture, &_videoBenchmark, &VideoBenchmark::benchmarkCapture); connect(GlobalSignals::getInstance(), &GlobalSignals::SignalRequestComponent, this, &HyperHdrManager::handleRequestComponent); + connect(GlobalSignals::getInstance(), &GlobalSignals::SignalLutRequest, this, &HyperHdrManager::handleLutRequestSignal); } void HyperHdrManager::handleRequestComponent(hyperhdr::Components component, int hyperHdrInd, bool listen) @@ -74,6 +76,18 @@ HyperHdrManager::~HyperHdrManager() Debug(_log, "HyperHdrManager has been removed"); } +void HyperHdrManager::handleLutRequestSignal() +{ + static bool requested = false; + + if (!requested) + { + requested = true; + + LutCalibrator::CreateDefaultLut(_rootPath); + } +} + void HyperHdrManager::startAll(bool disableOnStartup) { auto instanceList = _instanceTable->getAllInstances(true); diff --git a/sources/grabber/linux/v4l2/V4L2Grabber.cpp b/sources/grabber/linux/v4l2/V4L2Grabber.cpp index 56275355b..83a34c0b3 100644 --- a/sources/grabber/linux/v4l2/V4L2Grabber.cpp +++ b/sources/grabber/linux/v4l2/V4L2Grabber.cpp @@ -123,14 +123,14 @@ QString V4L2Grabber::GetSharedLut() return ret; } -void V4L2Grabber::loadLutFile(PixelFormat color) +void V4L2Grabber::loadLutFile(PixelFormat color, bool silent) { // load lut table QString fileName1 = QString("%1%2").arg(_configurationPath).arg("/lut_lin_tables.3d"); QString fileName2 = QString("%1%2").arg(GetSharedLut()).arg("/lut_lin_tables.3d"); QString fileName3 = QString("/usr/share/hyperhdr/lut/lut_lin_tables.3d"); - Grabber::loadLutFile(_log, color, QList{fileName1, fileName2, fileName3}); + Grabber::loadLutFile((!silent) ? _log : nullptr, color, QList{fileName1, fileName2, fileName3}); } void V4L2Grabber::setHdrToneMappingEnabled(int mode) @@ -1210,9 +1210,23 @@ bool V4L2Grabber::process_image(v4l2_buffer* buf, const void* frameImageBuffer, V4L2Worker* _workerThread = _V4L2WorkerManager.workers[i]; if ((_actualVideoFormat == PixelFormat::YUYV || _actualVideoFormat == PixelFormat::I420 || - _actualVideoFormat == PixelFormat::NV12) && !_lutBufferInit) + _actualVideoFormat == PixelFormat::NV12 || _hdrToneMappingEnabled) && !_lutBufferInit) { - loadLutFile(); + if ((_actualVideoFormat == PixelFormat::YUYV) || (_actualVideoFormat == PixelFormat::I420) || (_actualVideoFormat == PixelFormat::NV12) || (_actualVideoFormat == PixelFormat::MJPEG)) + { + loadLutFile(PixelFormat::YUYV, true); + } + else + { + loadLutFile(PixelFormat::RGB24, true); + } + + if (!_lutBufferInit) + { + pleaseWaitForLut(); + _V4L2WorkerManager.workers[i]->noBusy(); + return true; + } } bool directAccess = !(_signalAutoDetectionEnabled || _signalDetectionEnabled || isCalibrating() ); diff --git a/sources/grabber/osx/AVF/AVFGrabber.mm b/sources/grabber/osx/AVF/AVFGrabber.mm index fd2c33cad..d9d2248d2 100644 --- a/sources/grabber/osx/AVF/AVFGrabber.mm +++ b/sources/grabber/osx/AVF/AVFGrabber.mm @@ -176,13 +176,13 @@ - (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleB return ret; } -void AVFGrabber::loadLutFile(PixelFormat color) +void AVFGrabber::loadLutFile(PixelFormat color, bool silent) { // load lut table QString fileName1 = QString("%1%2").arg(_configurationPath).arg("/lut_lin_tables.3d"); QString fileName2 = QString("%1%2").arg(GetSharedLut()).arg("/lut_lin_tables.3d"); - Grabber::loadLutFile(_log, color, QList{fileName1, fileName2}); + Grabber::loadLutFile((!silent) ? _log : nullptr, color, QList{fileName1, fileName2}); } void AVFGrabber::setHdrToneMappingEnabled(int mode) @@ -813,9 +813,23 @@ - (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleB AVFWorker* _workerThread = _AVFWorkerManager.workers[i]; if ((_actualVideoFormat == PixelFormat::YUYV || _actualVideoFormat == PixelFormat::I420 || - _actualVideoFormat == PixelFormat::NV12) && !_lutBufferInit) + _actualVideoFormat == PixelFormat::NV12 || _hdrToneMappingEnabled) && !_lutBufferInit) { - loadLutFile(); + if ((_actualVideoFormat == PixelFormat::YUYV) || (_actualVideoFormat == PixelFormat::I420) || (_actualVideoFormat == PixelFormat::NV12) || (_actualVideoFormat == PixelFormat::MJPEG)) + { + loadLutFile(PixelFormat::YUYV, true); + } + else + { + loadLutFile(PixelFormat::RGB24, true); + } + + if (!_lutBufferInit) + { + pleaseWaitForLut(); + _AVFWorkerManager.workers[i]->noBusy(); + return true; + } } bool directAccess = !(_signalAutoDetectionEnabled || _signalDetectionEnabled || isCalibrating()); diff --git a/sources/grabber/windows/DX/DxGrabber.cpp b/sources/grabber/windows/DX/DxGrabber.cpp index b3fc5048a..66d42faee 100644 --- a/sources/grabber/windows/DX/DxGrabber.cpp +++ b/sources/grabber/windows/DX/DxGrabber.cpp @@ -83,13 +83,13 @@ QString DxGrabber::GetSharedLut() return QCoreApplication::applicationDirPath(); } -void DxGrabber::loadLutFile(PixelFormat color) +void DxGrabber::loadLutFile(PixelFormat color, bool silent) { // load lut table QString fileName1 = QString("%1%2").arg(_configurationPath).arg("/lut_lin_tables.3d"); QString fileName2 = QString("%1%2").arg(GetSharedLut()).arg("/lut_lin_tables.3d"); - Grabber::loadLutFile(_log, color, QList{fileName1, fileName2}); + Grabber::loadLutFile((!silent) ? _log : nullptr, color, QList{fileName1, fileName2}); } void DxGrabber::setHdrToneMappingEnabled(int mode) @@ -848,7 +848,16 @@ void DxGrabber::captureFrame(DisplayHandle& display) if (CHECK(status) && CHECK(_d3dContext->Map(display.d3dSourceTexture, 0, D3D11_MAP_READ, 0, &internalMap))) { - processSystemFrameBGRA((uint8_t*)internalMap.pData, (int)internalMap.RowPitch, !(_hardware && display.wideGamut)); + bool useLut = !(_hardware && display.wideGamut); + if (_hdrToneMappingEnabled && !_lutBufferInit && useLut) + { + loadLutFile(PixelFormat::RGB24, true); + pleaseWaitForLut(false); + } + else + { + processSystemFrameBGRA((uint8_t*)internalMap.pData, (int)internalMap.RowPitch, _hdrToneMappingEnabled && useLut); + } _d3dContext->Unmap(display.d3dSourceTexture, 0); } @@ -930,7 +939,16 @@ int DxGrabber::captureFrame(DisplayHandle& display, Image& image) int divide = getTargetSystemFrameDimension(display.actualWidth, display.actualHeight, targetSizeX, targetSizeY); image = Image(targetSizeX, targetSizeY); - FrameDecoder::processSystemImageBGRA(image, targetSizeX, targetSizeY, 0, 0, (uint8_t*)internalMap.pData, display.actualWidth, display.actualHeight, divide, (_hdrToneMappingEnabled == 0 || !_lutBufferInit || !useLut) ? nullptr : _lut.data(), lineSize); + + if (_hdrToneMappingEnabled && !_lutBufferInit && useLut) + { + loadLutFile(PixelFormat::RGB24, true); + pleaseWaitForLut(false); + } + else + { + FrameDecoder::processSystemImageBGRA(image, targetSizeX, targetSizeY, 0, 0, (uint8_t*)internalMap.pData, display.actualWidth, display.actualHeight, divide, (_hdrToneMappingEnabled == 0 || !_lutBufferInit || !useLut) ? nullptr : _lut.data(), lineSize); + } result = 1; _d3dContext->Unmap(display.d3dSourceTexture, 0); diff --git a/sources/grabber/windows/MF/MFGrabber.cpp b/sources/grabber/windows/MF/MFGrabber.cpp index f46867ded..b6f6f8ea2 100644 --- a/sources/grabber/windows/MF/MFGrabber.cpp +++ b/sources/grabber/windows/MF/MFGrabber.cpp @@ -166,13 +166,13 @@ QString MFGrabber::GetSharedLut() return QCoreApplication::applicationDirPath(); } -void MFGrabber::loadLutFile(PixelFormat color) +void MFGrabber::loadLutFile(PixelFormat color, bool silent) { // load lut table QString fileName1 = QString("%1%2").arg(_configurationPath).arg("/lut_lin_tables.3d"); QString fileName2 = QString("%1%2").arg(GetSharedLut()).arg("/lut_lin_tables.3d"); - Grabber::loadLutFile(_log, color, QList{fileName1, fileName2}); + Grabber::loadLutFile((!silent) ? _log : nullptr, color, QList{fileName1, fileName2}); } void MFGrabber::setHdrToneMappingEnabled(int mode) @@ -1008,9 +1008,23 @@ bool MFGrabber::process_image(const void* frameImageBuffer, int size) MFWorker* _workerThread = _MFWorkerManager.workers[i]; if ((_actualVideoFormat == PixelFormat::YUYV || _actualVideoFormat == PixelFormat::I420 || - _actualVideoFormat == PixelFormat::NV12) && !_lutBufferInit) + _actualVideoFormat == PixelFormat::NV12 || _hdrToneMappingEnabled) && !_lutBufferInit) { - loadLutFile(); + if ((_actualVideoFormat == PixelFormat::YUYV) || (_actualVideoFormat == PixelFormat::I420) || (_actualVideoFormat == PixelFormat::NV12) || (_actualVideoFormat == PixelFormat::MJPEG)) + { + loadLutFile(PixelFormat::YUYV, true); + } + else + { + loadLutFile(PixelFormat::RGB24, true); + } + + if (!_lutBufferInit) + { + pleaseWaitForLut(); + _MFWorkerManager.workers[i]->noBusy(); + return true; + } } bool directAccess = !(_signalAutoDetectionEnabled || _signalDetectionEnabled || isCalibrating()); diff --git a/sources/lut-calibrator/LutCalibrator.cpp b/sources/lut-calibrator/LutCalibrator.cpp index 7ec8e9b64..e56057fb1 100644 --- a/sources/lut-calibrator/LutCalibrator.cpp +++ b/sources/lut-calibrator/LutCalibrator.cpp @@ -95,6 +95,22 @@ class CreateLutWorker : public QRunnable void run() override; }; +class DefaultLutCreatorWorker : public QRunnable +{ + Logger* log; + BestResult bestResult; + QString path; +public: + DefaultLutCreatorWorker(BestResult& _bestResult,QString _path) : + log(Logger::getInstance("LUT_CREATOR")), + bestResult(_bestResult), + path(_path) + { + setAutoDelete(true); + }; + void run() override; +}; + ///////////////////////////////////////////////////////////////// // LUT CALIBRATOR // ///////////////////////////////////////////////////////////////// @@ -1511,7 +1527,8 @@ void CreateLutWorker::run() QString LutCalibrator::CreateLutFile(Logger* _log, QString _rootPath, BestResult* bestResult, std::vector>>* all) { // write LUT table - QString fileName = QString("%1%2").arg(_rootPath).arg("/lut_lin_tables.3d"); + QString fileName = QString("%1%2").arg(_rootPath).arg("/lut_lin_tables.3d.tmp"); + QString finalFileName = QString("%1%2").arg(_rootPath).arg("/lut_lin_tables.3d"); std::fstream file; file.open(fileName.toStdString(), std::ios::trunc | std::ios::out | std::ios::binary); @@ -1523,21 +1540,25 @@ QString LutCalibrator::CreateLutFile(Logger* _log, QString _rootPath, BestResult { MemoryBuffer _lut; YuvConverter yuvConverter; + QThreadPool threadPool; + + std::remove(finalFileName.toStdString().c_str()); - Info(_log, "Writing LUT file to: %s", QSTRING_CSTR(fileName)); + Info(_log, "Writing LUT to temp file: %s", QSTRING_CSTR(fileName)); + Info(_log, "Number of threads for LUT creator: %i", threadPool.maxThreadCount()); _lut.resize(LUT_FILE_SIZE); for (int phase = 0; phase < 3; phase++) { - const int vDelta = std::ceil(256.0 / QThreadPool::globalInstance()->maxThreadCount()); + const int vDelta = std::ceil(256.0 / threadPool.maxThreadCount()); for (int v = 0; v <= 255; v += vDelta) { auto worker = new CreateLutWorker(v, std::min(v + vDelta, 256), phase, &yuvConverter, bestResult, _lut.data()); - QThreadPool::globalInstance()->start(worker); + threadPool.start(worker); } - QThreadPool::globalInstance()->waitForDone(); + threadPool.waitForDone(); if (phase == 1 && all != nullptr) { @@ -1566,8 +1587,15 @@ QString LutCalibrator::CreateLutFile(Logger* _log, QString _rootPath, BestResult file.write(reinterpret_cast(_lut.data()), _lut.size()); } + file.flush(); file.close(); + } + + if (std::rename(fileName.toStdString().c_str(), finalFileName.toStdString().c_str())) + { + return QString("Could not rename %1 to %2").arg(fileName).arg(finalFileName); } + return QString(); } @@ -1779,3 +1807,56 @@ bool LutCalibrator::setTestData() return true; } +void LutCalibrator::CreateDefaultLut(QString filepath) +{ + BestResult bestResult; + bestResult.coef = YuvConverter::YUV_COEFS(1); + bestResult.coefMatrix = double4x4{ {1.16438356164, 1.16438356164, 1.16438356164, 0}, {-4.43119136738e-17, -0.387076923077, 2.02178571429, 0}, {1.58691964286, -0.821942994505, -1.77247654695e-16, 0}, {-0.869630789302, 0.53382122535, -1.08791650359, 1} }; + bestResult.coefDelta = double2{ 0.004, -0.002 }; + bestResult.coloredAspectMode = 3; + bestResult.colorAspect = std::pair(double3{ 1.08301468119, 1.00959155269, 1.10863646026 }, double3{ 1.06441799482, 1.00700595321, 1.06831049137 }); + bestResult.aspect = double3{ 0.9925, 1, 1.035 }; + bestResult.bt2020Range = 0; + bestResult.altConvert = 1; + bestResult.altPrimariesToSrgb = double3x3{ {1.62995144161, -0.159968936426, -0.0191389994477}, {-0.556261837808, 1.17281602107, -0.104271698501}, {-0.0736896038051, -0.0128470846442, 1.12341069795} }; + bestResult.gamma = ColorSpaceMath::HDR_GAMMA(0); + bestResult.gammaHLG = 0.000000; + bestResult.lchEnabled = 0; + bestResult.lchPrimaries = LchLists{ + std::list{ + + }, + + std::list{ + + }, + + std::list{ + + }, + }; + bestResult.nits = 229.625687; + bestResult.signal.range = YuvConverter::COLOR_RANGE(2); + bestResult.signal.yRange = 0.858824; + bestResult.signal.upYLimit = 0.572549; + bestResult.signal.downYLimit = 0.062745; + bestResult.signal.yShift = 0.062745; + bestResult.signal.isSourceP010 = 0; + bestResult.minError = 212.883333; + + auto worker = new DefaultLutCreatorWorker(bestResult, filepath); + QThreadPool::globalInstance()->start(worker); +} + +void DefaultLutCreatorWorker::run() +{ + QString errorMessage = LutCalibrator::CreateLutFile(log, path, &bestResult, nullptr); + if (!errorMessage.isEmpty()) + { + Error(log, "Error while creating LUT: %s", QSTRING_CSTR(errorMessage)); + } + else + { + Info(log, "The default LUT has been created: %s/lut_lin_tables.3d", QSTRING_CSTR(path)); + } +} diff --git a/sources/utils/LutLoader.cpp b/sources/utils/LutLoader.cpp index baa9efac5..53018a8a9 100644 --- a/sources/utils/LutLoader.cpp +++ b/sources/utils/LutLoader.cpp @@ -41,32 +41,9 @@ void LutLoader::loadLutFile(Logger* _log, PixelFormat color, const QList %s", length, (LUT_FILE_SIZE * 3), QSTRING_CSTR(fileName3d)); + { + if (_log) Error(_log, "LUT file has invalid length: %i vs %i => %s", length, (LUT_FILE_SIZE * 3), QSTRING_CSTR(fileName3d)); + } file.close(); return; } else - Warning(_log, "LUT file is not found here: %s", QSTRING_CSTR(fileName3d)); + { + if (_log) Warning(_log, "LUT file is not found here: %s", QSTRING_CSTR(fileName3d)); + } } - Error(_log, "Could not find any required LUT file"); + if (_log) Error(_log, "Could not find any required LUT file"); } }