From fc217d8aae95f15cbaddf32d906149427c74e87f Mon Sep 17 00:00:00 2001 From: Anthony GAEREMYNCK <1@anthony.sh> Date: Fri, 31 Jul 2026 09:48:11 +0200 Subject: [PATCH] Add HEIC/HEIF test fixtures for upcoming heic-convert-based decoding Reuses libheif's own LGPL/MIT-licensed with-alpha-512x512.heic sample under both a .heic and .heif filename, verified to decode correctly via heic-convert (the library the image format work will use). No suitably-licensed HEVC/mif1-branded .heif-distinct sample exists that is compatible with the pinned libheif-js version, and file-type detects both extensions identically regardless of container brand, so the duplicate content is sufficient to exercise the heif source-format code path. --- test/fixtures/HEIC_ATTRIBUTION.md | 16 ++++++++++++++++ test/fixtures/sample.heic | Bin 0 -> 8284 bytes test/fixtures/sample.heif | Bin 0 -> 8284 bytes 3 files changed, 16 insertions(+) create mode 100644 test/fixtures/HEIC_ATTRIBUTION.md create mode 100644 test/fixtures/sample.heic create mode 100644 test/fixtures/sample.heif diff --git a/test/fixtures/HEIC_ATTRIBUTION.md b/test/fixtures/HEIC_ATTRIBUTION.md new file mode 100644 index 0000000..3b1b796 --- /dev/null +++ b/test/fixtures/HEIC_ATTRIBUTION.md @@ -0,0 +1,16 @@ +# HEIC/HEIF fixture attribution + +`sample.heic` and `sample.heif` are byte-identical copies of +`tests/data/with-alpha-512x512.heic` from the +[strukturag/libheif](https://github.com/strukturag/libheif) repository +(the reference HEIF/AVIF codec library), licensed under the project's +LGPL-3.0/MIT terms (see that repo's `COPYING` file). + +Both filenames use the same content deliberately: `file-type` (the +content-sniffing library this project uses) detects any file in the +HEIC/HEIF family as `ext: 'heic'` regardless of the actual container +brand, so the `.heic` vs `.heif` distinction in this project's code is +purely about the declared source format taken from the upload's file +extension, not about decoding a differently-branded container. Reusing +one verified, cleanly-licensed sample under both extensions exercises +that code path without requiring a second real-world sample. diff --git a/test/fixtures/sample.heic b/test/fixtures/sample.heic new file mode 100644 index 0000000000000000000000000000000000000000..897d470339a3f4ceeff5155e981bbefceea9f648 GIT binary patch literal 8284 zcmaKQ1yoeu*Y+KTW@wO*lrDiG9Xf~ZMx}<7p{1ljxV`)Pvjf7}<1YjNH%A+Vl`vd^UJ2ZzD(wF}* zM0My_aYsiN^h9X6(NdycZ2y>{y&b%51aB1ol4#98B$1n=7xG4XGa4qbqnn2t0Dw0g z-E3UZoG;o;0R%=<{}Ho2;PUG96aa|9mS_)ZSr7z-LfsgEf#jPT`e)XHA!~(J^2me! zxc(1K0VW0zV(LAv9j@Wlhe`B0RF3-Ox;8W0ONc&WBpgN z|F?n=Ve5(B4GZawXUpnoV3L>>UJ7E!1}HUPj$1Awb!6zZZ7 zg}N$2Z}vO@bh!NM?^=L9yvJxh`CpDTAAP_g0HE>Xznt}R0C*P#0MxT?RvuP==0Tq} z0K*P_Mh?mWfY1~G$VUMH-~4ah(7GEvP&^F)2IyRA3 zy138_|EGvJ(M9yX6&)nF7$Do0RJBJr==s0^I_F>jgXDi#5Wr#e*jM3Zw#ObWFr=HU zJEa)MqHD&kYIa?+ef<*|Riu$o&!tu}Z-l@y5-I>0~JlYd0m z^BuNPX2wBR*ks|B2eyn?;>)&{BWlyhJndmZWrHCmFuN{KD&FYY^4wsSJmcU>*JP}T z=_LeJ?@y+ufueABU+-;cYo*KOie!f!{KG1$s!3AA{E=sPh06RbA>zw9x4MjwFG7&w z%{y%|VmRMcwlAfBL~+zK6ZwwxE0Bl#S2+F#UIbhXMcY#O&%ub7m2vHO{IwFzgr}Sj zMCBZb!w8R+ykHV%87?-Q#;+P~$8rX-#W>`4!b9C1Aa0`~VAjlF)T2DoaceJz*Y~#a zR<`8Es91t(!7>(JNe1;ruW#U1Tu&r0YlNRzB4?QOJ5)Rj8rw z>x?4(ZLNS2O)}w{t4`(psd=hUb+0um&I!?&Z${UFcPCe(dDoNf-U6;<~<4dKX0O5WeLy^deR2u>?nS7F_GfnQm-yGht!D&fO=wL)B~2qQ}x z$KFL9Pnt>2GmGjNLnQou8!C-V|AtA{TyIl!&eTU~yc3+*IHt+$M}J)UKEls|8|A}iopzcSz(-|6Xr7`CR-7F2tlA4tqa;_4$^f(zCj-&tNXv^n=HB! zF&jm2j5x}6G$nO8&BgX9A@uG^o{}f*stk`wf8t@Mju!jSN*av1mhD%tUC-MjA1>?Y zd--LLvFba~Y)4&>2x9Gw<%JG3=rJ_reaxW$tqY>_5xIhq`3HkcCDR9TWF=c(@@xtG zG^e-JMWe%GoN~npVat55x{9Mb$chSymtSn& z-+w1ZIiFf!mPb^cpso9{RQ;FgNn(hB5f`wCcgR$;y)yN>(WDT|RoDqi6arz&p`^pt zV@R|1Q;Hd5(>P<`>Zhg~=0XtU6Q+ZUD-Q^_u@JbXM=LCI&uW(uCzDb*OR<2I@5}JA z_tiGHvv0Qy(QfuI&FsX*+dsIX)-n)Mx-S&^GwI{7YELUHD%SsUvH+SVZ;5vhk_>qcq)mPaWJkXVu8C{^8o-#HTo7l_zKdJKE%n6Qs(vsl-*nAv7vE{0 z&7iqj>fDlf!C|?7_L`**KrBb`!PQi_FHyl`|c%XgH8Bm00sw zj(XI?WGN-G{JrI=u>;cOjpFwQ{o)Vcks=GdSc3P@-IAY)Fn&GorEVCMsIwGll{&pJ(Y(i`{I`p%gV8FL`l|c-bjW)Ods~f z=T{3G_-q&)j&G?esyTjxqMfT}q_wGgIQ+nw_KlUOx+kY*@*_<{cV+EvReH#cFFuvt z9X`7k-YzHsPw2Co2(BrWhRZPEL$$stwl&pfD2wVOxQP*kj+WFyo^0F|yqqD4UhyeC zW{R#QHufcLN>P7Am~PjPpM07|GOKE%<+-er->lynjUVliW@`AI4Ao6EkXPrwUcci1 zu*s-`s;BGrN@2oK`HN1H&wCO9O##g!6B*OPdv0^MMh_EqBzGl$jUO69bk(HySAnM9 z>SbHH0|$A@G@Wq*Agob-zeRriHTg+deRfRR? zZe0j%x@yN{HLf(wb}_M*Q%}&r5XK zB&AQapp-Ih-IQiQzqt-$$_*arw;{;%bXOmQMAKXuNA3|~;eVyL3I%O&mAqJzd@m_j8%Z(~eTr*$|++u^0ReZj#~ zoeQ-R9}`70rCfoz4^D@4$11ac&q}lWMeD$sE7J8GUaayx8pQhmPqW+r9gGHstnH$ucPi+l?lyK(eL+HrjTbQgi)?-;U#z5 zXv$#}vG^RAB*kwj=yi7F(gCoIe$}kYN7a_Nu4g{^h75m+CW2pBj_& zeD5b2nqupc*@B6CS<;UG*{jz)bY?*%DT@rL8RFH={_U^DSPiL|pGU{25&7>`RZsbOV91mt-gR zw{b!sSaH=7zr6G(Gch0snMWwC<+oH)36@sg*iK&ql*WGzozxD*IJSbQAwPBB3X;`` zMUSX>YGrWdg+WZQo-t_gK*?qZ1GRA`?s#AoboxB?iqdRCh%62a4}5(UY8J{ODu8DI z;J$B0x@Vp;4+;2)uErEFvJ9#? zkkxN@j<^z}I+v_dH4@`GgDtrt0(LdXNMQn{@)&E05Orp5u8ErKvoqUW(6)FSMR^1sNCrypQWMa{Ial~ zhiU#Ci<>Yc4b(Xu6#w2FypIh4Qm-08ri; zPob*U=bXh&k3Ch4N3vfKSlm8oy>o}bKexh_-uWx`H!$Tlo4X7M_rd+4-?dlkUn06m zN#1q~J8|-`39h@jyw33r*z?fEc{M)<${v2tIi29)6m_~!UZ9#34>QTZ=s5{iaHtH& zr2)@8z^pOTn4>v&{N$9m_ktJ>jFXrsz zmCxvx>jH*kh53N9Oe#=Ef7#x6-TqD!5t$cr<-#pC&~ifV9YUAOg8Wh*59teoi5Li0 z(9HZRZX2$W46)^p_k+fN#v@G>2DpbmZ}HSWNhMafyjMtlre0$SFrVuzhoJk% zJ#;Tq!wGst8%-fRIiBlyyK7%@N82FY!s;A-PJ1eLH4)~wrg|rz}#MXc)YBli%11CVeSf!S1cC$0L zJii-$u47-ml$^|usR}_HzhnMPGkf<|@;I}mw14>P{N@x$aa~X(&MT+HmICE zoChc2W8Rbd(DW)ACm32YWQ%`1RqU=r{IQPps?zbvg{)0vXoW)wKk8z!M>R|OcX;|Ca1-Yu>}%K_m*-PAHrmKBN$#c3Wxt2Z@@8!|y2OjGR9r#kcXa#c zNUu}i&n1dCEG#3S>HF-Tci@{I9+{4|0#!#fZ1?B|0`2 zbE~;`is}(YEcd*{)3E^Qr`sudFHT)1%`9Sn>g$|736~2Za=chf zekRjRk71C_Qg&}8ZjPBI+cmuDIa_Vep-79)Cb8*rLGNXNOdd}v;KIgpuN%iEyFzY2 z@PxxDcsW$1tthe(i;zp?*#p9|7N~S;g+Md~Ckcln%ltqX<>ectCH9Gs23AL%E2L_p z?exzggnWBe&r^%^LS|{xeIMxW#Boj2*4Ez}5%|q^zw{~1k3W%D+*xgmjkMv!zzw7$ zkGd6MFGtQ76nguy0wKyJLr^;=gkQv?Id4Um&dF|n4)5+$woLb$UJ&$_VtgZ~`?Y|~ zfOe??TP#-KYxSCljq7>IHU3_Dk$K@VX_un9S;xwl_!+Caqi+)#J-G`NQt~HUe=Qvf zj<)44bq2Qy3t13f&UV50?Q4nFf)gjk-fC|l8S#3LioT?nGL^Ro>XB7@Zb`P?J}DE9 z=-j{@u@8Arx7a^?+jq!OBkQoMq&D=QeksLgX8opLBBbOY6d&iZhu!o`ut9c<;~aFq z6uX!5r(aT^``a%KDj^IE+}b=7cJ*!z1jZX_2$Hx4`f>)NF8Q8U_hn3}eD|U(RC@S4 zJlU6JqpLhG$;iev_1+|yV_l!K=oVp%`GX`Ezdm7_^|)pPMfSDI9fQKXOvSp=6&Z|y zh%sq*KK&?A`F*T%;}mtdg?1DwHXiR#*r&EjH-wBrZK4z1E@f*@*PZLXz=p#u?}x86 zv&l9{(reS^6_2Q8(~f-~0O^{PfPFcJ!rt{KnLe7ej-YHEtLTFP0%6VuZd@w<+S%(_ zA6*+hH+=E-QZM0nKq#1F3v6sr;#AFOukfDJiuJr*g9TH}$Z+J1QR;oadY0v4*%>j7 zzgkV9M1$RsOtWwK3(}i)a-o97Uc{W#n>4~=$Kij6UCetbRW7t-(b<6_u_Bc(#8B1A z^qbsnPWgO<@3w36sKJqEs|Oa@tfM$7>OK{VZC+-iS8b_O{B_&CJd13)VU!Jy_0C(a z`EvPtGcd^d*I#ZMJ+nE!PBrFO9i;4Y7jUC0j`4Qj&f7dtJ98t+d(RXENw>cc~xc_cQTYOhE?)QjeZ^21|HT6_=)BHh8QP3ske$CD;{&I67^a01dl%9-H!*w zR6URHE+y6p{JN?VQyLupBU)G=aeb7}N;sh;kePp28~th5{cv-wY)8nZM1Aw#r*I}4 z&Mz`_s4di)dl_JKS|2kNGY+cGVWZx9c>2MD_FMDHkQdb92&B>J(n-@g`eM<0!aX<* z_dE)!!_oZ`8G0Ji^N_svQNst9fdaK{7T!Br>~%sOYnSzf$S+cE4KUH}de6JF^+ z=?vLVkGmNvblOrod0y-TGr#Wp*MyweQ`%p$J@8hx{dyL%gx#Xm%eXLxXu z+JVjS{2YBaM}Snv!hv*eA-Is;YnG{R^`%tE6dK>NhXF_-1af$1OEs&VBrgKr`v+CU zZ40^VaDzrnx3#0N+7sp@hVTB(j@OCSuHT=LkCDi5nomczWrZ>u^!*4e?UGB7^@KL= z{^*h?+TIqaiqR0GUh&|{YPk&~<~5CX`O@t7G;4YFYl|?B>tN;6pgV#XP;KSLwujHM z6`xs*?VONob0!ICO~>zy#YDn8p1k~i@@hNhUuY5E)du zX>=Dfw@Zob>o*|OYE0wUw(g>xTb-v~_6I(I@4LIth5ni% z;>l!AHZ{D2%m{f4akl<`Vt4_0{8OKJ*w-j8*$N=X`7omyex%y_Ab49^KuBv` z=O7@iE!5=cX|=&3dwBdTUiZ22i()5nR&RY<@(YW^pH5x1cO5|drQ$*Yi=4KHvW)zU z%c=LQTWod}vJszO+fgrUKz`7&Tr+E5QS__7U_HROOW_n3Jb#4qupg7t&>g8^f-#T?Hl-8PgB}pu=?kRC3T>Y^0VC3^ z8|}jEcEZj+&r6mTN)-}xhj8b@k5W^KGxm1Mrk%-fUCWBQKa7D+8zfw1+ETeppD)bt z+g}adL-s4sCX(_?U`4Q=V8ZfYQ9X0Kz02m&DNY$$2Q^d@q*NsLsQK(nC-O&iBwjzB zdIJ{rL#^?A50?K3&;QjI!dSPfFq%75xH{m&AI7RvdWH2>$YIHDbOkc|K_-<6`68Si z8}3(`sGQTX_S_G3_^TDvMwx!W@uk3G^9@4-j;nd6)d1!Az|K;XGZcp1QWj~n;Etc2 zy5Du(IQl2xd)rG+~+=nVPJWSF)$>JT1ur~xBD5g2UU$YrN)TI363Nk0DMG)K*r>Z zFtND$;Ht`Q+Nd|wYoKi*RSqBZI&&5|BkCF{iDFSqLqxXQ-%-4`D+1s zB&6{OSyu}T>=AO$^q2AGhQC*T*8$un^i_X|zcUHOG%#M({66im8B9FQ?HI`}tjcWq!{!d6YMz>)Z!(5ac=U)^Z79yN%tFp~=K@KV{yGZc723 zNJq?g=$hql0Eu@he98q+E-9D6s+cff|e^x)K zPn`;OBxg>sUTSMU;B7~H)&z|=btnIZ7ZAPBB?VMb-)4dl3FMO|2dJ$DfvGE4<`Y@}N{j z0wzxCDLdyrV6qyk+#qfj|IA<#PJPtuX$l3WV4(Ph9FI2s%O6RTKGc3`vSHPY>z!0* zyDf{fGUCCub8}x@CpPTP;1AsjGZ}p(Qy5>6SV~l~I&5tn+bIarlLJwpJX z;?vv0b~Q|c5xFL;66o6xs`(e31j_*ofbM_tXp!CCX|tbjZ!7mc8n9o zWgrI`LYbJ$()v@xrt)`(XfJjKOq;o#<=K6$RLmkf?BQ2I%_>jz()CGd^fdW*&kG#0xGvN)*q@$7qX^g9E@O6<(*3z{RzqGx+-e^5Lu^$5Ek#+Q7@ zoq~ac>H5B5Ac2fz9sW_le&GrW?M7=nDo4Bk9+#-^xg-?&GNMu|d*9;x9i%_t5HiU8 zV?^tzfbXN_y6qhq+x``s)s@zQD2R25XK#NU7X5+4K=lhZxEU6X6({1Tba`M7(gKzd zdH!no!=gQf*1d(;MO}Kf`mg|rtH$sWy+M?p=?^k~Ec{gUUzEMbcYt$4=r3)(voeIy TqnR~-E#3lPk!TqJ;zRxqtT}DB literal 0 HcmV?d00001 diff --git a/test/fixtures/sample.heif b/test/fixtures/sample.heif new file mode 100644 index 0000000000000000000000000000000000000000..897d470339a3f4ceeff5155e981bbefceea9f648 GIT binary patch literal 8284 zcmaKQ1yoeu*Y+KTW@wO*lrDiG9Xf~ZMx}<7p{1ljxV`)Pvjf7}<1YjNH%A+Vl`vd^UJ2ZzD(wF}* zM0My_aYsiN^h9X6(NdycZ2y>{y&b%51aB1ol4#98B$1n=7xG4XGa4qbqnn2t0Dw0g z-E3UZoG;o;0R%=<{}Ho2;PUG96aa|9mS_)ZSr7z-LfsgEf#jPT`e)XHA!~(J^2me! zxc(1K0VW0zV(LAv9j@Wlhe`B0RF3-Ox;8W0ONc&WBpgN z|F?n=Ve5(B4GZawXUpnoV3L>>UJ7E!1}HUPj$1Awb!6zZZ7 zg}N$2Z}vO@bh!NM?^=L9yvJxh`CpDTAAP_g0HE>Xznt}R0C*P#0MxT?RvuP==0Tq} z0K*P_Mh?mWfY1~G$VUMH-~4ah(7GEvP&^F)2IyRA3 zy138_|EGvJ(M9yX6&)nF7$Do0RJBJr==s0^I_F>jgXDi#5Wr#e*jM3Zw#ObWFr=HU zJEa)MqHD&kYIa?+ef<*|Riu$o&!tu}Z-l@y5-I>0~JlYd0m z^BuNPX2wBR*ks|B2eyn?;>)&{BWlyhJndmZWrHCmFuN{KD&FYY^4wsSJmcU>*JP}T z=_LeJ?@y+ufueABU+-;cYo*KOie!f!{KG1$s!3AA{E=sPh06RbA>zw9x4MjwFG7&w z%{y%|VmRMcwlAfBL~+zK6ZwwxE0Bl#S2+F#UIbhXMcY#O&%ub7m2vHO{IwFzgr}Sj zMCBZb!w8R+ykHV%87?-Q#;+P~$8rX-#W>`4!b9C1Aa0`~VAjlF)T2DoaceJz*Y~#a zR<`8Es91t(!7>(JNe1;ruW#U1Tu&r0YlNRzB4?QOJ5)Rj8rw z>x?4(ZLNS2O)}w{t4`(psd=hUb+0um&I!?&Z${UFcPCe(dDoNf-U6;<~<4dKX0O5WeLy^deR2u>?nS7F_GfnQm-yGht!D&fO=wL)B~2qQ}x z$KFL9Pnt>2GmGjNLnQou8!C-V|AtA{TyIl!&eTU~yc3+*IHt+$M}J)UKEls|8|A}iopzcSz(-|6Xr7`CR-7F2tlA4tqa;_4$^f(zCj-&tNXv^n=HB! zF&jm2j5x}6G$nO8&BgX9A@uG^o{}f*stk`wf8t@Mju!jSN*av1mhD%tUC-MjA1>?Y zd--LLvFba~Y)4&>2x9Gw<%JG3=rJ_reaxW$tqY>_5xIhq`3HkcCDR9TWF=c(@@xtG zG^e-JMWe%GoN~npVat55x{9Mb$chSymtSn& z-+w1ZIiFf!mPb^cpso9{RQ;FgNn(hB5f`wCcgR$;y)yN>(WDT|RoDqi6arz&p`^pt zV@R|1Q;Hd5(>P<`>Zhg~=0XtU6Q+ZUD-Q^_u@JbXM=LCI&uW(uCzDb*OR<2I@5}JA z_tiGHvv0Qy(QfuI&FsX*+dsIX)-n)Mx-S&^GwI{7YELUHD%SsUvH+SVZ;5vhk_>qcq)mPaWJkXVu8C{^8o-#HTo7l_zKdJKE%n6Qs(vsl-*nAv7vE{0 z&7iqj>fDlf!C|?7_L`**KrBb`!PQi_FHyl`|c%XgH8Bm00sw zj(XI?WGN-G{JrI=u>;cOjpFwQ{o)Vcks=GdSc3P@-IAY)Fn&GorEVCMsIwGll{&pJ(Y(i`{I`p%gV8FL`l|c-bjW)Ods~f z=T{3G_-q&)j&G?esyTjxqMfT}q_wGgIQ+nw_KlUOx+kY*@*_<{cV+EvReH#cFFuvt z9X`7k-YzHsPw2Co2(BrWhRZPEL$$stwl&pfD2wVOxQP*kj+WFyo^0F|yqqD4UhyeC zW{R#QHufcLN>P7Am~PjPpM07|GOKE%<+-er->lynjUVliW@`AI4Ao6EkXPrwUcci1 zu*s-`s;BGrN@2oK`HN1H&wCO9O##g!6B*OPdv0^MMh_EqBzGl$jUO69bk(HySAnM9 z>SbHH0|$A@G@Wq*Agob-zeRriHTg+deRfRR? zZe0j%x@yN{HLf(wb}_M*Q%}&r5XK zB&AQapp-Ih-IQiQzqt-$$_*arw;{;%bXOmQMAKXuNA3|~;eVyL3I%O&mAqJzd@m_j8%Z(~eTr*$|++u^0ReZj#~ zoeQ-R9}`70rCfoz4^D@4$11ac&q}lWMeD$sE7J8GUaayx8pQhmPqW+r9gGHstnH$ucPi+l?lyK(eL+HrjTbQgi)?-;U#z5 zXv$#}vG^RAB*kwj=yi7F(gCoIe$}kYN7a_Nu4g{^h75m+CW2pBj_& zeD5b2nqupc*@B6CS<;UG*{jz)bY?*%DT@rL8RFH={_U^DSPiL|pGU{25&7>`RZsbOV91mt-gR zw{b!sSaH=7zr6G(Gch0snMWwC<+oH)36@sg*iK&ql*WGzozxD*IJSbQAwPBB3X;`` zMUSX>YGrWdg+WZQo-t_gK*?qZ1GRA`?s#AoboxB?iqdRCh%62a4}5(UY8J{ODu8DI z;J$B0x@Vp;4+;2)uErEFvJ9#? zkkxN@j<^z}I+v_dH4@`GgDtrt0(LdXNMQn{@)&E05Orp5u8ErKvoqUW(6)FSMR^1sNCrypQWMa{Ial~ zhiU#Ci<>Yc4b(Xu6#w2FypIh4Qm-08ri; zPob*U=bXh&k3Ch4N3vfKSlm8oy>o}bKexh_-uWx`H!$Tlo4X7M_rd+4-?dlkUn06m zN#1q~J8|-`39h@jyw33r*z?fEc{M)<${v2tIi29)6m_~!UZ9#34>QTZ=s5{iaHtH& zr2)@8z^pOTn4>v&{N$9m_ktJ>jFXrsz zmCxvx>jH*kh53N9Oe#=Ef7#x6-TqD!5t$cr<-#pC&~ifV9YUAOg8Wh*59teoi5Li0 z(9HZRZX2$W46)^p_k+fN#v@G>2DpbmZ}HSWNhMafyjMtlre0$SFrVuzhoJk% zJ#;Tq!wGst8%-fRIiBlyyK7%@N82FY!s;A-PJ1eLH4)~wrg|rz}#MXc)YBli%11CVeSf!S1cC$0L zJii-$u47-ml$^|usR}_HzhnMPGkf<|@;I}mw14>P{N@x$aa~X(&MT+HmICE zoChc2W8Rbd(DW)ACm32YWQ%`1RqU=r{IQPps?zbvg{)0vXoW)wKk8z!M>R|OcX;|Ca1-Yu>}%K_m*-PAHrmKBN$#c3Wxt2Z@@8!|y2OjGR9r#kcXa#c zNUu}i&n1dCEG#3S>HF-Tci@{I9+{4|0#!#fZ1?B|0`2 zbE~;`is}(YEcd*{)3E^Qr`sudFHT)1%`9Sn>g$|736~2Za=chf zekRjRk71C_Qg&}8ZjPBI+cmuDIa_Vep-79)Cb8*rLGNXNOdd}v;KIgpuN%iEyFzY2 z@PxxDcsW$1tthe(i;zp?*#p9|7N~S;g+Md~Ckcln%ltqX<>ectCH9Gs23AL%E2L_p z?exzggnWBe&r^%^LS|{xeIMxW#Boj2*4Ez}5%|q^zw{~1k3W%D+*xgmjkMv!zzw7$ zkGd6MFGtQ76nguy0wKyJLr^;=gkQv?Id4Um&dF|n4)5+$woLb$UJ&$_VtgZ~`?Y|~ zfOe??TP#-KYxSCljq7>IHU3_Dk$K@VX_un9S;xwl_!+Caqi+)#J-G`NQt~HUe=Qvf zj<)44bq2Qy3t13f&UV50?Q4nFf)gjk-fC|l8S#3LioT?nGL^Ro>XB7@Zb`P?J}DE9 z=-j{@u@8Arx7a^?+jq!OBkQoMq&D=QeksLgX8opLBBbOY6d&iZhu!o`ut9c<;~aFq z6uX!5r(aT^``a%KDj^IE+}b=7cJ*!z1jZX_2$Hx4`f>)NF8Q8U_hn3}eD|U(RC@S4 zJlU6JqpLhG$;iev_1+|yV_l!K=oVp%`GX`Ezdm7_^|)pPMfSDI9fQKXOvSp=6&Z|y zh%sq*KK&?A`F*T%;}mtdg?1DwHXiR#*r&EjH-wBrZK4z1E@f*@*PZLXz=p#u?}x86 zv&l9{(reS^6_2Q8(~f-~0O^{PfPFcJ!rt{KnLe7ej-YHEtLTFP0%6VuZd@w<+S%(_ zA6*+hH+=E-QZM0nKq#1F3v6sr;#AFOukfDJiuJr*g9TH}$Z+J1QR;oadY0v4*%>j7 zzgkV9M1$RsOtWwK3(}i)a-o97Uc{W#n>4~=$Kij6UCetbRW7t-(b<6_u_Bc(#8B1A z^qbsnPWgO<@3w36sKJqEs|Oa@tfM$7>OK{VZC+-iS8b_O{B_&CJd13)VU!Jy_0C(a z`EvPtGcd^d*I#ZMJ+nE!PBrFO9i;4Y7jUC0j`4Qj&f7dtJ98t+d(RXENw>cc~xc_cQTYOhE?)QjeZ^21|HT6_=)BHh8QP3ske$CD;{&I67^a01dl%9-H!*w zR6URHE+y6p{JN?VQyLupBU)G=aeb7}N;sh;kePp28~th5{cv-wY)8nZM1Aw#r*I}4 z&Mz`_s4di)dl_JKS|2kNGY+cGVWZx9c>2MD_FMDHkQdb92&B>J(n-@g`eM<0!aX<* z_dE)!!_oZ`8G0Ji^N_svQNst9fdaK{7T!Br>~%sOYnSzf$S+cE4KUH}de6JF^+ z=?vLVkGmNvblOrod0y-TGr#Wp*MyweQ`%p$J@8hx{dyL%gx#Xm%eXLxXu z+JVjS{2YBaM}Snv!hv*eA-Is;YnG{R^`%tE6dK>NhXF_-1af$1OEs&VBrgKr`v+CU zZ40^VaDzrnx3#0N+7sp@hVTB(j@OCSuHT=LkCDi5nomczWrZ>u^!*4e?UGB7^@KL= z{^*h?+TIqaiqR0GUh&|{YPk&~<~5CX`O@t7G;4YFYl|?B>tN;6pgV#XP;KSLwujHM z6`xs*?VONob0!ICO~>zy#YDn8p1k~i@@hNhUuY5E)du zX>=Dfw@Zob>o*|OYE0wUw(g>xTb-v~_6I(I@4LIth5ni% z;>l!AHZ{D2%m{f4akl<`Vt4_0{8OKJ*w-j8*$N=X`7omyex%y_Ab49^KuBv` z=O7@iE!5=cX|=&3dwBdTUiZ22i()5nR&RY<@(YW^pH5x1cO5|drQ$*Yi=4KHvW)zU z%c=LQTWod}vJszO+fgrUKz`7&Tr+E5QS__7U_HROOW_n3Jb#4qupg7t&>g8^f-#T?Hl-8PgB}pu=?kRC3T>Y^0VC3^ z8|}jEcEZj+&r6mTN)-}xhj8b@k5W^KGxm1Mrk%-fUCWBQKa7D+8zfw1+ETeppD)bt z+g}adL-s4sCX(_?U`4Q=V8ZfYQ9X0Kz02m&DNY$$2Q^d@q*NsLsQK(nC-O&iBwjzB zdIJ{rL#^?A50?K3&;QjI!dSPfFq%75xH{m&AI7RvdWH2>$YIHDbOkc|K_-<6`68Si z8}3(`sGQTX_S_G3_^TDvMwx!W@uk3G^9@4-j;nd6)d1!Az|K;XGZcp1QWj~n;Etc2 zy5Du(IQl2xd)rG+~+=nVPJWSF)$>JT1ur~xBD5g2UU$YrN)TI363Nk0DMG)K*r>Z zFtND$;Ht`Q+Nd|wYoKi*RSqBZI&&5|BkCF{iDFSqLqxXQ-%-4`D+1s zB&6{OSyu}T>=AO$^q2AGhQC*T*8$un^i_X|zcUHOG%#M({66im8B9FQ?HI`}tjcWq!{!d6YMz>)Z!(5ac=U)^Z79yN%tFp~=K@KV{yGZc723 zNJq?g=$hql0Eu@he98q+E-9D6s+cff|e^x)K zPn`;OBxg>sUTSMU;B7~H)&z|=btnIZ7ZAPBB?VMb-)4dl3FMO|2dJ$DfvGE4<`Y@}N{j z0wzxCDLdyrV6qyk+#qfj|IA<#PJPtuX$l3WV4(Ph9FI2s%O6RTKGc3`vSHPY>z!0* zyDf{fGUCCub8}x@CpPTP;1AsjGZ}p(Qy5>6SV~l~I&5tn+bIarlLJwpJX z;?vv0b~Q|c5xFL;66o6xs`(e31j_*ofbM_tXp!CCX|tbjZ!7mc8n9o zWgrI`LYbJ$()v@xrt)`(XfJjKOq;o#<=K6$RLmkf?BQ2I%_>jz()CGd^fdW*&kG#0xGvN)*q@$7qX^g9E@O6<(*3z{RzqGx+-e^5Lu^$5Ek#+Q7@ zoq~ac>H5B5Ac2fz9sW_le&GrW?M7=nDo4Bk9+#-^xg-?&GNMu|d*9;x9i%_t5HiU8 zV?^tzfbXN_y6qhq+x``s)s@zQD2R25XK#NU7X5+4K=lhZxEU6X6({1Tba`M7(gKzd zdH!no!=gQf*1d(;MO}Kf`mg|rtH$sWy+M?p=?^k~Ec{gUUzEMbcYt$4=r3)(voeIy TqnR~-E#3lPk!TqJ;zRxqtT}DB literal 0 HcmV?d00001