From 3c2b45560835040a3707d7e4d6a00e35c5820ed9 Mon Sep 17 00:00:00 2001 From: ramin Date: Wed, 26 Oct 2022 09:50:57 +0200 Subject: [PATCH 1/2] added image filetype avif --- filetype/types/__init__.py | 1 + filetype/types/image.py | 25 +++++++++++++++++++++++++ tests/fixtures/sample.avif | Bin 0 -> 34010 bytes tests/test_types.py | 6 ++++++ 4 files changed, 32 insertions(+) create mode 100644 tests/fixtures/sample.avif diff --git a/filetype/types/__init__.py b/filetype/types/__init__.py index b3c0327..79399a8 100644 --- a/filetype/types/__init__.py +++ b/filetype/types/__init__.py @@ -29,6 +29,7 @@ image.Ico(), image.Heic(), image.Dcm(), + image.Avif(), ) # Supported video types diff --git a/filetype/types/image.py b/filetype/types/image.py index 39cb630..2d4d269 100644 --- a/filetype/types/image.py +++ b/filetype/types/image.py @@ -356,3 +356,28 @@ def __init__(self): def match(self, buf): return buf[:10] == bytearray([0x67, 0x69, 0x6d, 0x70, 0x20, 0x78, 0x63, 0x66, 0x20, 0x76]) + + +class Avif(IsoBmff): + """ + Implements the AVIF image type matcher. + """ + MIME = 'image/avif' + EXTENSION = 'avif' + + def __init__(self): + super(Avif, self).__init__( + mime=Avif.MIME, + extension=Avif.EXTENSION + ) + + def match(self, buf): + if not self._is_isobmff(buf): + return False + + major_brand, minor_version, compatible_brands = self._get_ftyp(buf) + if major_brand == 'avif': + return True + if major_brand in ['mif1', 'msf1'] and 'avif' in compatible_brands: + return True + return False diff --git a/tests/fixtures/sample.avif b/tests/fixtures/sample.avif new file mode 100644 index 0000000000000000000000000000000000000000..f3a841bae5f857d75c8ea510f2c0a7027d0f03ef GIT binary patch literal 34010 zcmd42byQr-7w3DL#@#J=aCZ&v76=mD-Q6X@-Q9w_1rHLO;BJ8c!3pjXf=qMo{mGm4 zX5Os%>(yH4)Tegss`}Qh-Sj!V761T{nY(&98o67U1Ca7k+gX{j*;yHxD~hs-0RT$4 zotdlAOCO}rTAJEA|BV3PXl3I1FMg?Qt&IOQ4XUG+tKDCHAjqB3%GSZ;r6mCXP{4}? zauKNjfMqzO{Z|X+GXS6#Kv>ku%Kk4UfAtVT8fGspFC&cHS=q!LY#sg*K=AJ#NVlY? zmHEr{;z(%aZ1(pAkQq%(T}=L35;7dQ%gWK&5mM(`Ihr^?Jh81@9L-*aKvaE%tgsFN zbVn;sD@YB1;o;#S6|#{#n|J^;@(Ze&IM_NnIy*pSN0w2rvUh+&2LL;JS7#MzF)~dp zZ8EqC$XW;hEWid4YvSUls4AuQGMB8RIGGE?>4pDOZWjIu1u)AbqfAEjAN&6iVVF2N zLxK-dhIn(Bnn896fPx`x>*4D7Vn2g0wz16%LqWf=GejVS@n6{DZ)W_<=WiByVN*MM zQ;5%tW=B&y(--cCaJajh8HB+K5Ds;>GV_4&9E2%t-RvN-0^dOx+s@3$1pxjE6s4<~ zi6w+tA$DYEH5G9PzX1SvWQ+e|*E~6L+w4G_v;sfWP)0JZ@$fIf*0fRD!jXe=ZEtosSl1N!&5DImNDUOssm zqfyB6UxQPg6zdCuA)X};^yrB!jR9z%MAuV1keC%fB+x?UIVlM z6TlAe00MvrAPL9;N`M-m1?U4NfF)oDI0GJlFAxBP0#QIbkOE`^xj+$64%7hkKnu_T z^Z?(0QD6#~2YvwSzz%Q-oB=n$9}oxx2SNd1fe1jPASw_8h#kZW5&}tr6hJBXf-;2Llncn~}bUI!n6e?!AUV?mQaGeHYL%Rs9`n?O53`$I=VXF``j zH$(SB&q8lNpFuytpuiBpFu?G`$iisCSipF|gu48Y98?7-Z>!ouRh(!lb- z%D`&DTEqIlM#JX7*1~qfPQz}&Uc2g~DaPRl#+^&A{!z-N7Tl zlftvZOTlZy+rtOKr@~jjcf!xW@4^2;Ku4fL;73qGFh%e}h(jnsXhWDp*g^P%h=E9h zD2S+rXpIIF@9mfVNzpC zVwz$GV-{leVQyi8v0h_|W0_zDVHIHwVC`VTV$)#DVq0TJVOL{MV4vY&;&9@;$MM9; z!ug7`jtj=6#+Ajj#f`(Q$6dg^$0NoQ#WTZ;z^lQV!MnwOg)f3{h98Mvi$9NlPe4W> zNnk^eK+r<4N(fCzPxy||gYXmK0O8Rq>{kM>OkPF4s(-ai1Vuzoq(bCFR7f;NbWKb` zEKTf4oI%`2d_;mvB0^$Kl1$P`vQLUdDnx2UnoQb7dO(IlCQ4>YmQL1Bc1BJ_E<^4{ zo=-kO{)d8wLY*RzqLyOyHR5aD*XFO2U-!N~qa>wNr1Yh%q+F&#pyH*nq)MY2q`IZ1 zq1K=dqi&)8MT1WxOXE#bNwY$WLMu$`L|Z^RM+ZyCOJ_ruLpMbaMbAZVNuNbO$pFQ` z&0xil!!XSV!^p>I&se~?$b`%!%H+;e$+W?Y%dEg0$lStw!a~WS&62<}$nwO>#cIo1 z#QK8`lTD5-kgbjFf}Nh-gguLWjst~5isJ*v7mjmI22L~1Pn_Smu(%Yt!nk_59=UnA zow;kc_jxFJ40*D77J0FGm3gCihxlOl#P~k&b@2V>=jM0iujfA%U=pwqs1W$|hUSgg zo1!;cf)s*Ag872$LS#aQLU}^#!sNn6!Ue*cBCkbEMM^~WMCnAWMXN+l#8}0g#hS!! z#rehk#JeTH64DZp5)+b`lIoI~l50{FQWjE`QfJa!(mvANGB7goG6^z^vc$3`vgNX8 zay)W=a{cni@~ZNg@|z0u3eE~`icpGjib;wqZ>iqezim+hlw_5Xlvb5#l%15@-@(39 zewX!bSA|W*S7lHYOVvQNLiI*XOf63BhdQmgn|kkiwD-F2%irH>NN6N#tZTAp`e}}8 z5o%d!ebI)~ey?4keXS#@lcKYu%cUEtyP!v-=czZWPpEIJ|J4A^z{sG%5XMl$u)^@c zNXe+c=-OD;INSKlMBF6JaG}(0DOwcURY|mWKJkk7@g`h=}#lEGmWvbVgQvr^BZFh8v%GVO z3&=&!<%=sebz zZ-DQHpQvBHKgi$MzxTuI55XUHK1zQq3qTC82^bG#4NMHY3epH_3nmW!7`zoC9a0&J z8tNRn7$y*w8x9?A6+RKc5s?w`6loec62%&o8ubuu5b7Ly+H9BUps5yu_(DIPZ7 zK7JuVIH4>NBhfo?D@ie_IhiauGWjaSAZ0j}Gc`92G0iP)JzXLFO9o{|e8xkjW#)XA zSXON|QFcW3ZH{Tq%qNjgHMzvOQMvbdR(ap^rSqE$s0&gHVGG?0cZ=Q^4HokjmzNNh zM3p?2+Lx}Esg(7X^OToY5LLugLRGp|?pNtnO;t-&f2m=r$*;w&jrt6HcKdu#XIQsT zFJIr=z}ryMNY$9#gw+(;3~KgjK5MaTS^uK-Wx7?awYN>6t*M>4y|jb8BkL>9*SJo^ z&fw1HF7K}EZpZGU9*dr>UW48reVTo9{qOoG2IL2ZzDa%S8x$Sv8WJ4p80H^t9pN2m z8RZ^r9^)Eo8s{2sn&6&jp5&SQGQ~I5HvMM0b4GZkXI5hN+nns&==|IH=>_$L?~A&N z>)%bk|5~zLI$w5Q{`2GG3d~C6D*9^b8qr$8Pr9GA>)h*KHzYR3HdQx&Y?*8wZo6zh z>;&(k?56IK?v?*y|JAWCwLf*BbFg#hc=+ci^cdqf`-JwS@l@n=>`e1)=iK@H`6Bv~ z;Ij0J^Q!k+`Ficf?&i;J6X*>B$8gZCQudw)D0;2zQ+=^opjSTnb@K5cuyWR|pe=VE*Dd2*3J=TOmyQj}H`t*&t)F zA$1SrV*iKdA&dp}_dG8?R$fm|<- zNdKxuO&yHQ$doM|Tpe629URGcm{|dKR#q;4HdcN%ZZbA*el8w zhyR*29`3IPDOPqiR&e~^nnxh3K>x#Q5C$du?E`{nhf4T+?-wujM8v-Y-9s2E@ozg6 zWFOG~*byNNm-zR(V2BEYfA~ca;y?bF5TDRQI3OHiBZM%J_m3VnR#s5ne_{@m_jjyb zjtu-ShJBd{5?@wUj+aeyu#vH|@pG{AbMpPa+aSI#XZunh?_&TRME6VmQeN!x|I{z- z|9=!%0Q^r*y=?Vgd3OPc)4%fW9>V{fcOb~yDr8##n9exgq6WiSw`e`TO%a zfG#H`D+Pd{K#*=o$MZ3O{8wTbh${l1=Mw<+uNGkX5i$Yj`3DdTAVc2l5#WRfsD z5Rou&(2$YQaPYCPaImoOF_8Z%|5SfB{^vUg1qlfS6$Kp?6&)KD6&3sChKl|75RCtm z37)$F40ym0_y`7308khpFb3#(6_Um9&;1}_h)Nj96Fa0p1iutW4naY~z{0^JAR_(s z=it9PL6AWGs}mgnL4&|h&`>aNu<$ToWDZCt1{j(glMP1noe>s=Qvf?Gc0zug*lS80 zl^$abPUpaBaX6|()w7Lr6BjPrg8Cq8i6k{s$=*U&ZoC=wO|y%J;J#V6txGAIWKxtKz1C`JLB(n?zf7x!*4AZG?q3;mZSI9M32za)^e zVM0R`I8k81um>byzbNQYnLgv7G~RFyOcYneF>&EMr-FSE07uQ$I|C6>h-WIP&h2Wp z`ELpTYXvm_k?_0>AcOx}69W(iE}Lf*jo%pIl`0$9g>o7t9iu)274L1TI^a;KwiC`Z zyz!KVCPwP3%GeeGn*C{c1|-{O9Sv;O^q6jOiQA>x z;ijj%vYPOO3x71Cd;{j-u!PzERP17mf3wS9!sEaQi|~F$ zrA^i5qN-hI#Uu49XbgqPlDvCVxcW~Nj=fQOHi+ac3r}1S6=5rw!e^zZC{b2!LCqh5 z#sT&219}GKjfyN~B6gxIWie%^-(d*fhA~ z$lQAkHsi&FV_SuwJBA$og$BC8hH$nsBmqhknZ>y8`hh}u!mL;6+*>>(BTo4-ULLz^*SV2lys1|$jQp~e9Dr^+0I$R z_+3Fq_dI=Z5Cwe#JgBeOrm8(Ii)0Xya6SWk7L*yZ2=)L`+h09Y<1yA;Wq-<#OC+7u zzcD)-)VTU0EUA%8ho6)RTQ4={*%uwDBm5Xf&r;BTi-bx5pUzAiLmF<}O zj}KNHUM$O_kmvE@TJE;iwPtZYIhW>yqy!~C=(gobNt%=D1rp)OC(JxGZJL|x8X8?A z>*p=6-ekAHfz3h|I#=R!o^aZqf$R_ag2Ji~6noB>&X@M?Z{2Q8w}rsfO#`QFd9QL$ zRE#sId*V=RFfPyiZ*NT-((#OSb;Yf)JP+@y)snu5DwJB`8RR`03?CBA8NF*+7@9BM z#a{?$UC{hcQGIn<@l{+vC|jV}sQwvHHJ6g$E-Opbsh>Q{Ep{lr7oOBMQ02#yIIM2# zES~G^i~p(kWj-Eo-+VQ?vikIM`d;xFh<*|~X{)_!8y@c|M0k`eh(>ZZ412$D?>YJ8 zGtbrZsq=mG<2V1fC(AJ%aRvyjK~5Ed1eeRpZM zhTlyQ+uZ7imu}-~xKz4WHbjZbXTn`HLlsBNo{pp8&+`w?X#*xC$2;4haIINc`ln;} zNG=B--XG5Ey=PG>+f!E^4}+=szK6NU7VEJmRMGPF=XvhLhoJYJ)mLk+2L{vkdJf=n zlg}1933|yb#Mf!seoqT6vpy=YtS9tH7vXkD%62WT(U!fE z1N2&2ewU=ibfyZ${A_uk>df&udInnXc)e5&lXn1f(S*n8KGISwgUnzfRtjEMT$ZT0 zXW)6}A`f9hv2po?P>xDr!|tkz&2UAc%y}1op!v+Xzb?e0qT;yM_+e;q&h0=lPEbkaSgwJT!m2W zxsGQmqco)mdmM7Vt-Qf>O5AzU_SU15KdoQ$vQt>g?_o<8H1`R=_RJr6LI>4WVekx7 zT65Y@0d^7x&Q`)?W1-K$&os20$TfRfXn^?4HQ?B9W)EzS2qEvJ>QJSca&+WQ5Lg-i({&h5s#1k=Js56%HFo&@B*-oX;5lY}y)_`B(zIi~JvWYskt>nDYYQhDFszd2|; zlgW1CdJp=eI~gv5e1WS-LhSo0=XJ@o?a@KmzWUeS4zB8TJ)vIr_AZ3;(`K6=qO+rQ zeHoLI>gv*_ zwshFLHGlXupdsYU4(dU0oN7f%<}KbAzRL3SLT4jDZl!<~_6cR**i1uJ?CS6TUE)U2 zsD0qV;HEJr&uDT*7H3O(P*GWa{|q!f8jdrax;z7Py7euAzMfn3l}CG*U%qy9aGT}v zFg=Ps&t7T=9(cpJsO%gbwLJrsiYt?e6MN$(LiUr4oIV{Q)7J)cB|=deDSN^`~O#|zuZ=yXvGl1@-Q9)yPfc38EdMN-8t1FdgdX7FB)-K9C?oBL(nSEnyg`%5rQ zmSqIyR^gv|Ors`U==uw`#(rrcLH~6#7U>`W)Pr0OQ96x5C7@p@Y zwI?cT?wbrzemj3Tn5fMEl>v$gEOVJ+|7NwgV^%n4YVKdQi#4*@mef~6$@Jr*OKRgy zjSJh%MWwUmovFMr)btH4QP6XTHYLnRyPK`$!}z4(o{ljA$)jXkQ| z=^;etOU-Mjmc6jt-v;fS=;1>bsZB-xCz*+$U>Jc*MqNjtvjO+q1S+To zn6kD@h%t)Nj`@w>iK-Z5tUr64gg>nMdSk4@{j)6$KFhB^C>}U}*?y{((FZ?cP^SqO%lU@jp*OS) zg82N_Ne-7vcwu7`-5c{|mS2;bmYSac4tL<4-u9fiZSI!m_Wb2_Ey06Rp|31=pPp=U znZqnj(3WG}lS!ia@jL3r3Oi<1Ht47QvRk?k$SF^q%7M?jOXjqP?WfI2G#mtOYnOOG z+PvR=C;wC)>ryuXFaJpEOv^-v%sI)b5uX>Z+xr2g){CJ zE(-~e(Fajd6vPNc)Xxnkg%YUD@JZ&9{Ki8o`#)D{SX=3UZ#%!;JR>51ow+|7kw!#C zOWMX0`Y6}(>nYuf6z7*pALH~=4zxA3LDiF=x!EKybDZB(M6tb)=-?~!?nb-kz|Z6A z{qgGix;z)Zy|zx3o&|KVA}k9+lJC!3#62VD7R@#{cR+)40zvCU>iE^})pH|3dc{%> ze*I$_Lyned4L0T{E^$wz&Zpl%ch~J}_mRBB%9Hk~`k0!F=eH_Ui#`TYG!M>gUn|b9 zt*cttlM%OJD^!)l+4(+>+o#38|C!&6KTd*}AQ9Esu&jhTMQWv)=rBt%$cwI)e=ed- z82lLuVFMJUEQo;IVQwrdRDeCplnDdI*TQ)9SdATw;p&xTD`UHpXIix=&GmDI@jd*9 zl_`6Z+RtMc8!!f{!%A#57b}cjjHj+cWkw~h;?xK(TYV-CREZ?FYFedSwtMP^jieLP zJF#1TI~#3Rb_A~bYXykfZ%Yll;Z3c3t##p`b=1&Pp5#Hv6<6-0?%NN$65?bhqMi=v@{18miR<9+y>=FH|7%lx!2S zpG~&PRk#9tb7p3g8Tz-mVR%o|AQBawiT#U0YBadlMBr`)t*RJ=)E>mSWDEnaErZ0a z;+vnBDqLe57Hrfp*@Mf*m7O`2_it;{*S=3g3Nz^ouIfdL5UQ(osB-@ntlyPa6Akvv z-iyv)di>7y$Gj_P6pLKI-FqI1OE2arRDJ#iN%}i|By;rIyv;**S->WPwCnXw^kcM* z(`A%M76o>Zv8;W=M_xpoKEXGSiFti>>e;exuss88YA24ITiixsz32zBCb0SWV4{uv zCGF&{Vz28XGM&|6+2jeV0eKLbrxZOyZHl@#r3`LCaSbONAyU_3SCix(T17W+qFM|F^8kIVperGasv+#mhSqkzN=DMPGv_M*bezE3+@asFsWQ|(l*!aE%WOm-nyMfb z^Zr1!)tlSuNOS59inH_b@}JaIB8_RMS0RJiFb@`|_?a@q$#HT)kPTIegt3S)bEOp3{o#gO90P3QOC9r_Z&b9h~fJ z^CnfBi3Iy2_~2u_fZQ|>y;It&>10ti_XNxqr11^uT(sk#kKPA9cIIlbrt2w;E^cCN zJrc2xo?hy&w|VqHJ$Sx?gDohOpXM{+62b(NHhb|?C^q5(4miT{iocgW3-xyWDZ0TZ z;$rZOY#RRbi$4Eec%N%STgD2>F%XQN^Dz?Co@0Q?IVVr|Zu0Fjxe2Az^krUJ@94B; z=@ZIj`L@)Lt)};dyC2Fu;7$w`69#JCbrCEusIw2?G)$f zHju0%mRB-{_q#<+OO$0ncN{Z}=YV|{L)&0Sm}9U|s0^tuSH_;c>n1(%;^>~kuQ_Y~ zvcr=Nyk9$w@2(j8WECEIEs?Ocs+!K*h}ShlZ;;W^$CY#xXZu(MRj`T~j+o~_I z)PfXJtK}>&TGc|TzV$Fie#1AZZ+R0RA#R%8eToH zFu6&G;D0dk{JL~^if1F@K-<1Py^YI6mNQnp2azz%F9kLD1a`EX1nCl|v9cW3>**5` zeX1NUG*ho4?Q?0@9aYt$NL|cRe~9-|nn~(A*F;GVF3NoPk(#*CNUgu7=aR6~z_DF)1TR+-IgE6a0eZV+Jdl1}O9I z4Nzv}`A@yA2NyIT5P5xeH6Ov_2-e~6eI=nwMy49;E+!dt) z|L1<$H}&XQv~h61Dl!N$zhrTWuV?T}+~CL?=TB+wsyYe_=*f@7v53AuGe0CF7E_|} zeG;qdjPR%y?~6Outyva{Q!OKGs8m0?MZBRIEhQXfH-RH73BJPOJHkl@w=JyW5~vDm zPl02oO%#MOM(aQB8tgx#B(YZ9m`yflOE+CNRaDz2NFTobJ>($x`}o06TyP!3Z#>T^ z(ZdI0ZY!$&jHSP-wMC`>XE{SghHkDw?SKvVwuK)e!4ZetS>|2Y%j=t7t0ee;=j zT0`H9s4@7vo+jT69e&S1NF_B4Gx=hCp!k81iEEhliEqPU*ff5uZ>qz(;Jy3%uKLVM zYaG)7J0D7#0Ym)v3ST!rNB^$ZR7I`Fh&jBkpyYOx*Q|#>^n#J0{lsXkH(IZrQON;I z0(eQ#MS2OF{1OUBl5V}qwC8aY?gv(c)7#vkYnGD}+m@PVjaZ_?qW zNMy#72myXGNvA=yyx)xMObx0!Q-%jf_WWl}?c4+m!Y@>h`dp9D@4Jq~&QlwNzV*@G zL{lX{hda!qWdd6!H|yl!M(bCW(hllGK9><>X6lZmL31D>@G$MubX*aSEtDwW#~!D>HPm&YcXJJNSpcj9^n+)I6V1`;08f)tq-}RPBIpY;{ zOUY>O>dIOE$&Uy}<2jYHQf1`{J~Bt%{F^mXHfzY|{)#j^jj+EF$AZ^CzH}*5xBOxK zP1$7!KAQhp$Dz8Quor5w_k3upt4b|+*=DAS(7nBClsD(L*-{c*bL#}XuW2Mtfmz$g z^g+3{P=C){mDf$rzE^i=Vd5>#dHA%Mkh4GjCuEue1D2B-x28)LY5fVb!RH4l<8C8j5qQZBk;R9;2+( za2gewtV#FX{&vdocyvV;Jh3|5<(_Dq_ppqeqp2G;a=jtyxh#GE zKT$Sb&kOsJ#&2hm>(K>v$CpJ$gvip97tHgRK6$Ciz!I?H)rWpJnL8(gnSVXv9U74@ z06jS%S6=Jq$9p!1H&?JJh1`={8lV)S17(G82~DK!mPi#fkQ-#z6_z!Ph6~m{z?DLX_OxW_3)Ba(*d`jMs%SXUlwFHk1Zq2k@Dp`(>C z%#TLzA@yT?<7P5wAA0WV3Z4D=vgks78p?ppUklUcn)K@$EK2^k>>y7ql}0n+{P8)N zY;Iza0)~Lz@+q8wPi`tX#sTZh(2vJdRqXHSEO|{w_Hr0y#!Kd_{_g`TTRtAnU2>f; zIHWFYzz061E#}_9llznv$`G>qhVjZ;oFU!!k*nMX^ zFtAwRiRZyy>$n&sDI3-WgLhXxyKpR5$$kB$xmF(5ptMIxv$o$;x8mI@WXU4dXaWAD zxOQG%+m!7ehUFVpsmzhE$j#!9Up`4CB(VseHLKC@u9PQD^lRl+XsZa142B!?e76)9 z-y(~-eiF<60p4}m7u^y&>~rLLTOG@rKXz27QPjkZ8swiu7osD}HhwRqnl{@?SaYlSEQFDS`czlj;N4D9Y zT?0+(&-*7lGN-@R%+Z5I8Ik6ztUuQFYHO4`18;=6M2Kc+Xtpz##fT%>#g#FYrFIX$ z^NY3oGU&HZ)LdaW?$z9ouF37CI&=OJhW7V&1?cY$I!RdTn?_Az zxMCs{$C!V{Y0d@g2^aQ5&aHXJlOpU@8sTb%#151z;iRvqD7$MkIZq`G``OU~Siam) z77;7IiaDS#ReOp?DDvS8(Qf(XR+W!rxn#&rsgbMeR7liF$4hUPkmk_CmGpKIAzT0b zA>mlws|q5ujy8(6H)@kzK2usxZwbchf1c%j=?CWzCT-J4HekjbTUK6%&LxaD+nYbl z4Syjk;<~g&3Vr{pQ*qUAfMPG3PA&o^zQOW9dc2_n>LO0eThm@iE^iEpqWVn{Gyj`e zqC5@tgpcx$G0I9G8HV4BL|*fcMkGAEYqACEgbs^YM&Sg93NT4)#?TJL#IuWu!K zhss5CGN4F3V?vrWz#j4q;W`(-RPA+16su|I^`&PLjl5MHdNAj^3k8DtP?~qHFc-9j zQu|c<I&{Nhl=|~;T;9&nkOaN8$7Sh3++6LnX-Hy(q}JFq?uyg zXk5xPA0tCs*96fA5Zk)mjKp8vg!AeC<~%_f*EY%Gk@#dWA}#gQUjiO4bQYS?16Am1 z1Z9p+6ZInAh!yQhyhbl7+4sZk5EHf$v37H6R(_5&&tba}X>2`kZPJ zV#!C2pg0GKSD*){5MOv)u?ELO!a`{8po(m`m+Y?M=f$;S_`r(pG2FY&L7bW@8Fvi3%cq&&26OEY_<%oy@Q>EPGiDPw(B15Y6p3MU|8m4Yw)Sa#4fGw-VQa zH~J`pG&vy_UkRjX9Twl9L1rz!zMG zN)xGfSA9i?U2`-cwXB0u#L;pUo1BM!LJj(uL40DJ9wV+4=ENoVB^fao=HRj_0Df)V%0JtK1KbfSn{Sr-uE!yl!+s^RwM3 zK1~r$-(8p8VsY$=oV*x~Mojv7s9ypQ2tU|#r&V0|z2N;(ks{FIBl#v1DE$d;*3K%h zQ+#0m%xtzF|CL*?MAi4`d$#I+p%r(52N#Efb=9i438Zgn7^1$D5|W4ogh)3e;<)Yj z?#6uF(CJ6-1aEzYc2sSikD*O4P(gYa*TGsFuaR2fDD5UfUvsqdzy#(`AZ~tdKKmdv zK~PJ~X&K~wpP%nM+$oG}uLT$*q>PW3&25M(KNuBDq5QnN9ICmhy(V9o3sh}))mO#L z$gjsO>VnGXB#98`MZ-$388BJZzR$brnKAT0HJF#znT}OJCaJ22x|9gDJ0F67+rrTw zA|m~YD!<+hZMI3Xw++*_pEwXpDP>=TFOo09vCy10>Y?<$Y4Yb-I7MJ{LB#9a1JMIh zo8b+0e{G%8l*0#=X?vNbe0%;}1@>RI?(n6r4T1(nh-m7s_EU(%d$G|&$9xSNZmUIR z25pvcE3l8UV@F?WY@nW{JyFh+>nhYhDbCHul}a~c7pWu>9aR#7mNi)zKlk zWC1f?&OGl=u4LVSJr}=0VV|&j_)^=?lF)(}Xhmf^GOj6m?AVI~1?PTUP51pgs!B!2 zS$ue1g)MzDeN+vIJEkI%T5H`qjv!)HB8vBdT;{(9o*u1cCDe1KB?xTtdhg}00xgb@ z0YA2kP+mP~y^jIK_Z1yB3bz?cA=I!c7ghC_g72q!R zC&Gwgf0>F|O!z=?N|4;Bxf=QayU|Nx*eq-kgjX;{+@1QhT^%KHovW5etcS zb&}*x2GvFAITF#4sLNYKi}I$+k7k4Yi3>=%z6CqgQ-W>D)Tit&R3}Cyu3f1RAYiT6Z!?s{5MIF_jDm z+j5S-YsIbbO4)HghPkTqX(riK$%55LUEllUu3@90H56|>PLE)Y?kF0EF_ds|b-rf` zhg7yujjZqY!&3!k?E_^vN+dLTP+aIk)KawstBph=@IJNQ)nGL4tO_W;o%vo!{=9(W zX=*OqsQDDK#hd8W7{5+S5v@Ahyz66MRAmraIgUDISot>R)!4Q4Wi1_b0i0yyD{+c= z?KhQdSJHKD4QM-I@A#}?<=gotHK`TuTVj$)zJ5-vRKj7XAM)Lo6SwVf4mbE6Ao;B+ zA6W=WX!dRTP0b}8k2+dO5bIM>mMnAc(2KI?Nr^BrIl{q zbd9r{5lm~V*%IvmqhLMdEx~rJm8oFktMM(5t7RT_N3NNfj(~!ZqoNfovgsyHk_b9R zd1ZRnBS$vX0Ep`+tuzF=9Rz_PxOn+S~x9apPdZm$l5 zYwfSKnE@zWvUU;oH*V1+?t;t7b^eto!;Dp|(6xQRYa>G`KMl+x$w#y!kU^LuN~l?` z{oNUp&RQn-UJXF*z%Sj8UTr4ym`)gbcOm(!N%$qqv?8HSR$9-m`OBsRm_M+(D|ZB2 zLj&EzQgo!V-=3GnU=j|084!Poe8smnZJeI6uep&^-$x@4mqIwR;3!!Sr#|jO3)OL* zj~gj|N7E{JhO+J)^}4w3jaemf*%sKeP87xj-Os(BCDsQOw6|`!x%D4WTv> ztm}L-@4*GRgy+a4#@nK1i7?~2;>xWmj811Rw^w;oVgv$9_wK8hUa!tNhaTELv)Ty~ zSG+1o^}j>za6i;j_8$FRB~n;>>vtp=aJTb5A8CGughum$N_NN~y6^1{^rBihpW4u6 z9>!e=WhUGXyc(r^`Ej0H=5Kz`apdye8FD0krxe-w0f>Y(7DjK$#oD*e#Yl)2 z7aro&3#j2F|2VyASeM;b(Fq@gsg(5jbmp$(HI;rcKvFZ;8};qTmw0_mvVCA0Dj7|T zoiJYU;_jUiSV$9ww6^bc??rx4;8EaW6INa&Zos!Jm-tFct?NZ7xu1UsqlMWzX9Gc^ z+p6QX`_M1*wqQ?msrGR^likb`01tfZ1TTHa$^s@^gmX85_ku|8)d zUWwMxc)c!``?#SBX}&CMv?$}o66twu&o$<4Y?=S@L-K3nUkg{q?0>GD@*=DWPerN{ zOHF>K*Gy+yM|`%kPE2}}qN}jzmdM*TyyPjObc{uPVGxEN4?5VX^MB* z9dW6_73W>hWOR<1E%X!5XZ>6XMYkSCik`=~sYuG$eMcpa3T|#H55HScU-6A`O+nsn z4|WMgJy_hvu8l@?H3UameH9z0cxGlaRH|vu7J|5*NLM;-0nW!zi>FJk%*cU7aPseL zo}%b*yAe7@#I`qPD?P4zGLu^|qOmr#)nL)UGR&cZt=~|=tb@Vp0OPnep+PJzi;?N~ zFW2Q3rbq|V+oF|AB=#zk+7?Nl1M5Dn#&5Vutq~mSH>Rmp!?L2_BoZ11Go{PD3af1| zAdUZ!(%pu=T3|$TiHvppdj~{j%OFo!nLObcC2v&NDL^8CwWnHtfVa9&!+C^xF~!{0 zw)X>GS~kn=L^~&Z*%qyL4b}3s9wm3m!Pq7~U?=IK4Apg$#!iYgz(y-4YK9}4{4jx-D}Fife`6>l~h+W!0%H}@X!8{ALG+cU->@ZDjp%N5#OO0@y=tS zu3>u-SX!Oq=E@@^gky%3EJ-Sio7j8B3LAey*BgGbm6fQB+mhRHS2t_Y?ol|r`lUZ( zDc;|zkjzWODvtgjToN12U|sW`JYFHJB-@(3mzU>kFTRU@NEF)(g- zUZ<_vMNRUV;M$N;Mw(@iC-rO>IiP+By&D&kbBXZkr-xp>S6`$<*E7b>YQj<89*Y#BiQWXe(c!6o5Gm5ObHphVioO!X=^Nn-C?lna{>?<0^=IBjYWXi&IMX{qZTY z+mR@C!=5yBm_C_r)!UIo9b&|d`bU&6*HbVnewJ3zZTV%@r?(UAm?aBAUtX!vo5>?j z62N)W3Esf=@{iC;JJE(RDlr^}Wb~H1c3GSB#qCNE1R;Tt*+lPw)>RIY_wE~f(L9x6 z>&^U2r%bIRbjx2V`Xizf<%iTcxnr;hWQ3q-Rc*{AoSkavj)gPVuVjpv-NM23LGRJ)0s$M{? z>%64@{Rg*RNEsHp(eGh#ZM^}!4{pUJkgPjRPlFvRi6{}Se;3u8d1 z5SC*x*(Db@V{V*o0~L$|P$9nJn}uXk5O<9YZ9QuKs`m1Q{`_Wqe^E@%H~)-&nMSoOEeDs=|`jsgD_ z0)3MYT@vJbgD#x0cDRoUcO37(7cz&j>UJk~bHKkF+H ze3rwX`|&*d;e8S;A~rPf>K)1vw_@^pqj?|4kP-AJ=@_2}u>#E&4vV^x2Itele)rqd z2bLiC!4goH+^#(7*B*h4th_x+Kj3uPSo050#84ve%KkfE>I`c4G~U~eyi0Cz@gHk$AW$a zEIO%!NHnf*?3%9Swn*@6mA^Qae|Vw@BdsA?6|>j(%l2qg8ywZ`MqiJ8*j7Uc!EeHs zJ4HB2nQ4d3fTn!gkr;T33|ovh6;qotVi@btj-)HVYjtk=)zH6VcP3pnO@CW=PbMWcHV@BP(ZqfOw5VFbKV}z$gHl)~?x?eY$S6|2? z_&k^2MIopU(ibmIsp(kI)hv7aZK`XOwcU~HO7GV*IdnHJ= zhUlwvug_WfP}jQ3<$^%8K=mr(`POOFG_v!{Po_J?6ePO%M~wK4fjd=nY`OMyW-!P5 ztBnBaOl!!0GP0{v7zyLpb{Tom^nxqJ22FH6nr}So=x%Ob$v~l`aGV6wVu5R=*cOZ$ zn|UXib{-2(-{j_>`Eq&_tD(BABT$Phgv~A`7~9uy^+hP`CSV;%HD)3D?dExUnyr{4=aOqkKoBM0T}Qo?Uo1y)jT($nIuUK^T7 z*1^yI#`h2~Rns{zQzG<2 z==$}^H-eJ~zTgmns0RkUuEXAsr~Xm(%M)7A?xl|`Vov4(S{_~XNRBb6Eo9*(Z~tiI zaS;fv+FMHxoi(zBz0NWqPq6riLOucu+n;F=4kFpyCLk+2dXA9)>EYHcwSle`jF+yzxiCt}Z3Th>%3-Ru{ZO7QhJpVYB>U%Z%w z-T-&`kjSG~;TP10 zD;_+H>KcSun0uI?k84l`=0kEEYazaR@iJTq^70=8?)EIztvorT_ICOxqqAh|6bUT z1GN~iVW)5_7VZe!_|SF`BEl4E_BFbzN#p#JYyg+3MkkIMOMOAJTlEa`e&O7;%j(-)z#yRCxpXtm{e z&-On!{C{D)JqDmtQxwn3&$wybNzP3@4C)n*hcUo;L*WpXWEf`+F;BOrPc{$l($1%h zvox?X4)t(5H<4SFXmUK{t(HjmK5!3&#u4+-avF^t^Qw%&PENzPj=fqb1h;)z1MYvg zaW$Z!vInk1&8h8m@=Qn9!f+ru?&%`hM;C&WZW9BVMq7_(2u`h68aML_eB5=koL5BE z`Y$lxek6pxrvoc%26a60O~!ka#cfM+Sn1WZpGrUB3Ex4r%AZX-)%Nu$WEGe9w!D$2 zv>n9%F@gj1=;x$%*=3TKJ-oN*lfvf^N+!A~qf6ST$S#x#cn0f`ck-E2dQaFex09CO z+xIv`6fw|?S0#f((3sQU+Sh7Y5$Zd(`(|ub1h-VEhW*+&mXtDr~^gZ_TS6bla* zMdXaT%c_eKCe96lw^rL4vuKyFFyFcV<8peV`>?>M8Y)!94*M|)m zMGZtLhcx1iA|VtW^~~WGj8&1N84yehQM1R-hz-uSxvv%Or+JPzA_Y7@+-tSKy8IDQ zW%SMT$KmVRfcaA@6w%aIR8wne>cCc!@da;Y%yZcHT0do8>QlFoWV8E+g#ua+zEjUh zurR`=QMciza6zwOlkO(IuO9jeX2TS*dDl#_!l%)#){NS8Y|MC^=TAB&{odp3neE@W z^8~&-#Z6f3|8P27c$L>QM!A|!@Vb>3R~(wvAd+8iLD=VqFKmzFRm_T#ggt9)$j+_} zIAoG*j^sm1ae!(~$to$|+3;iO7T4{%*LNqThaU%2Zo zkU2S8j#OgvURYzrw_)oJyM!-?V7kn$+3WFwc(@Ei*P82Y4A&XFYd5tPz~etRvD(AI zhQa-;!=7#~{xOQb@AFAw851ctPwMw5LRO*qCNa&$>={k_BM?T=A0xvGzt`Vv@!f90 zW;*>LKXUmZ)^TQu^jQ)b1Se&7oT{P(T>nP^(>^T0olx{qjb=o?+vv7msJ%;~l{G}cud{(&c*sWHi2%kCMmdDOmlb}8j*OTc96 zkjq<^BuW>{3ypgTCXpfxgXlJT4>+)|@m0JZOajV?3lwZrz>%yIh^^J@mYKw)l*sbU z7|m}IdS|Rh72&8^Ct7d3(J|(wc`Y7X;8`zW<`73AEtJ6d^|i7yB)g!mf4;xnhI`G# zY`Ecq4B@da7LWKjoQ{p<|DaX^|GcCHAHDE=J3~I z=#5E)gzlYG&)NLWvdov+bJ0Ikd$W4LJR3gV?E{ z`dn+W;2**ItPk>xi32q`k#ag|P(n{Ydl&~f3*Zb;4>9`-jB?GsMHIBVnX!g5uxn~U z2t8Z(BOI9+ic2aHHzQk)gCgdNlS_6&Z*V5MwJEzvyLlOqCYv=^n1+$S6O)ihmuFQ| z<|3cdUI%YHvEQR%>%0$vzK3`7s2)opTVCM|3d(0grN}9Nb zNIz`wqZGWRn*@+y{wANF%>VO~ZCRQ$olMoka!gO6tw#2FX(G$wMR)|4F$p~TFR+FM zZ?x$@CE_zUGi050+Tfsq%eyA2F(-o1d?p8O9@)wJ|RPFvZ7kh;P z4ZaTkH9OY1Nv*R1+DP*~mQX#_gr)8=O_>+#Y9_K48Fbu=v*^Z?cVMpA#LO4gg%#L2{Rk z25c=aL{6L;!2g!EZ;1m%V?VwYG?P~?vz|l zL`3dG?sANr{q$kyd3u_4&xHN+CO7Y2^_|J=R?r08n^qFZj9jj0t%<(4kuEn5n&ba4 z+^}j902cXQ$z7=4RKW|du*@%IGm)+g>RyYYX3==PkNB_(Q66Pf;zKL{N4MS=^m8s4 zAv?5xt;P=m&0LUQ;aMDQ6Pf)mP0lGGehAB2xHU)k-c|>oU;r|EQC|N%sh^?o4WROm z*ARNhdRIZB$cbcn5lP4cUu&FBxm2*OWn^7B>CRB07map7`G9xD81yLu8zGM>w44Bo z9}ej^@u{V;=wdbL#S(w8d}-uN-~9L3=zcF27Av;)*O#*tYodjFcEWJ+k}|x@#O$G| z8d%a9e;@Ba--5^hK^lUU2kc@O`#w`NWA~6_Z=GjV0GguyB0WAaRu0n>__|_?6+yvt zXfgA;(a?3Dms;X}Bk<8QCrN_!&T{pBE`)caz|Ie%6{nfn^Z?t3&d&6POU-!}(gdr*Pe>1??Tu2EP_aV4>n|0}6uMtP&3ZVHSZIZ&Tgd5AW)D*}TfMLE7 zYW`QC>vjHNg-F-EBp`UrW>oI0l(t(cEJ=S`hu69Vt#{Fr0XWJEBu0^T;_(EDI~6pe0u-AKwX|d+Xu;;P+-lZ}pp~E9{_a7P*C^jj3qACDqua84n}!9#D4B=Wzs3DLUTmdSb3#g%1jgqomzsu1 z`Bbuh!%%qCNBk#upDo7!$te%f1o3kh%gX{9oQ2r+%T3X>!t*CmC>YHSF~`@IjlDcS zRGjymE^d5o|2$fSeC&@wVQSSa|5ahD;Bb6B1W`Nv{3&jUtFjpHQ`eyyCvJ*+3;Cw| zIcKMtzc}hK(hmudH(k|FE)ktCh&0M`)LW84G1~xW@GR(YXy~3L{K*oezO9wWS{!`j zxQij$!Vv=~G!XKktoXGzbd#EeKAG__0M{<;9OI@~LDQq58=qaj-liBU3T~3H_-qi= zMLv~;2;d0e-R@4xlu7a!*D0aTA%WbLL>qIn_23uyF|?{N_v$oOl|z4Ry&(^#@Je~^ zD%=A00?;>OTm5zC{>!+^tBJ)Kr0grQ#{JZeV}ucHxl@j(k#D(cDD}kS6chi-jl2Q#4opT zENym^PePsq{g7264~>CjuQ&1|-5^8rJg2GT+ApEa4d9+C_ddG@o^eo(awO5JO@gAy_?fLP*5?Q_SJ0ybF=@K*v z26;BsNH!ZkdRBGoukWH9D)?|?E3fivXdpMAFio#yT&}+mdNx^5jKWP z*vwE$;RJmKiNxN@XwHuFXzzBr`HdYZDwCZPf*8mr(pRjbG00wz#JWrCHd-RqS%Hxb zyvj=}y6mRBe=u28IWEyQ77GSif8!kJH?P*;vepd+@zvUPeZLiw#_6%B>C6w)OgFPP z7m5zKjbn}?_QIqXl8UtzFW@-H@RZM6>_Ra>ep!SECSvMS5iC+Gi7)y6 zxE)pW&!i!d>c!Pw*0yG<9eu!ADFZFBk#Rb^zkvx-Ob4fC^Cn?#vLYZDu_XOe32-Fk z090mJKtz=G+6 z|Mn8DI6A9fqaghY7a5f^k{rdR6MDB~yHDMX@SvI^%WcuntQsH<=;duyvotdb+dY>~ zQ@^)9cV!fAk=~6{v+Eo}X{81!aNFtn!pjt7n38kdq3x@awfZf$P!~?2`g@sWjFN;vt{NHv_7Hc~10zlHdu+t}N zlSat6!dI9Z+zAL*cii&Xj6V2ll)DKG0Rb=<0CUtZ*U>7#2wX?969rWO zq!Rnn+_0mJYHk&*ldye@XS%cfd8~;BL7b{G;KFmRGCdD;(F?2ImFiXVFU<}1=fD!R zjNeK20DO^px=d`f*Nt5sw{M8aT$|IgBp;|{>l-8b7J`apeE@P;KyUG4NjuC0d?omrEEKZ(XMe&%HBdj;4T(E+L5>NPg>wysShd~3 zaT8$Pw`|ux4;>!*{&QIfQtsotm~?c=q>du?I26}cG(@$-7ppf?5bzZkp>o1z5!7QFna+UV2qv;-j*|!yQ^d`-BK(wb<7@OBgaVXv zla{%=q_FaX?Z-U2n*7YxLH05wh70=0`-r+ki;Opl3lQ>^rL7c&ORkgq$r$P?nIRjn z`65IqYq)OqSWhG;j#uj}Es$jKOVUHi=A3R&Uu2atUR`2`AYs;G`7bkU;$41zuW=3{ zKiTy2uMUg&@UH_qgi;78o5aGph_gz5>OrA^c+BG#5_t7TcaMxJ+SbGoCB(P(+{&W+ zNw-^pKZoMV+wViw4tjFeNIEb2o|F3q?u97 z<<4#sa{TY^+eQM*EJ`;CA^KUB!OKTAaqrh29o9M{p~#H$ef^FQ+F2c^DM$_VU1mAg zWG!_JrA1)9+IaV&;5ob@*VSdAMuFW4h0dE+1}t}x@nf01}>qra|K>qDaEh2spnwOM*TNh#1l` zk4-L1g785$i~ zslte;1tRO_C9*FTyPgN+BFFuI)FrW?PU?H%Cd*{aHs^@!5*XP;NxPeJ;OhW7gA7^g4m7j4ooWMR>xopL!vd!dYG9`YQ(%@jl= zVL~ITQl5h^t(+H^H~Z(_X*&Zge>+l^ux!BBiUcqhZ>f>wO=<9nnG=DYo#aou(Z=s* z(?V2-R`E6zn?Q(?Oeg+$z=1vem4#0$ zp!zBsK!;9wh5rY{IFz1qQ;9I0Tz{egUxTXo;J1vIi#!1{cDeD-DRi^B^oc-WaOlwT4W48p(rhSMf;ygXmN93vq`ipeQN>oCD-psWB)xYb5{g{tzQDtwKwGP#L_ z?JREE_Y`J%fD~-{Kr6WnjRuJlQfCr(r|h@bXNj9`2wWSz+CSd7uEU&`puinI^HAWW zscU-oTz1}BH|MsoFy;$}Y+n+@p2#YbGEK~v@z9dgzc6kV8}=^SH$Zz4p|K|5pk$zS zv6%@qiIJeYE#xmf$<<;H_4`I7kQN=j+#fV6;yuzuEqd=>L4cjXYjxVB*}1JCBHE~ad_9-uwI~}U272tOqLNBQ4> zF@e{V?6CJ0=XO_89EV3QG9Gn)etAMO=ud|-1%se{-o^AKluZ7XLYkH}Xr1;b*u!de zePLmKEL}Por&+=xT}F11a^U}AMcK25eW zm&V{!d`}jnQb)eOO5+FsX5}S|BK!#m&gq<2DspR;l|+0dtUWRHH+oWdhVcjKLFLEx zphC@@Y$dhP6@Ba(t^s^|HNEILe#5>1!S4Xkl??2e>lLdw)iN+(VA0?`4K4xOaW*@>bOs_?BjDnt6)k-sP0 zw9Qd16nI4fR^9MSrmw!{+fQ*0bCdJb>J%MK{}D6hp9?Awqqc9YsaTQ;vf?9OjaRI- zV8Q;vF57kv;kDeMM3x)?!eymmpj0c90u6c+hzKnrt?u<|@}4w7Kjsl?`4wP47dfR( zTCwO0NgVsJ4_WR9Uh|i-MHG@?Jg)%FyPpJR1wlS>6l7~9@q*)zY995{zU+)B8^+|+ z=gnID=EN>=D>MNb^ocM-T9s@V$tDi**pRu-y}?grc#+-{-UZhrM{L#e+?5@B35--q zDHm)S1x)k%J25j#$cca`a3(yuC89oVH#qE^r(o9Pha?w)1mwkd1Of<#VP1trGjiUb z%`B`cu}|J4sRL2LPRFnvuRbOE+%=Y?N^JXV^mLURMw*zeDidJq_Cm>v0ey?Ku}-O; z-23&Vccw<$OGN!{%gLXLEwN5<3pq>NrLXnoGr zVfngft@#`56q#SmFTkMW(Ri?Q&46X-$TrJE8qOdRmXK_bu*>1$@)dg0h#5A~SGocC zuwLooIktVzfuI11_Z}5n9B&F?f$^-`i4%EMY$9jpS_8|2hKcqwG+vH;TRw-kS;W|& z$xUmGoeW$*!whp!pVHUJZeGbcvxrHIp-`{XY>Z)<1FuKDJ412pujfdoT+H9*X~;D6 zg!8iB2gF#l94S(*{>WMpp1Hb1897@03M*tevy9rHfn8B|d{vy4ypv?;`T2O15CBfh z;f%gaqPL%zsI>WDO182D7Ij7i8y^mo0~l$a+{?^@C{8rxpjLE$I(o`EUel$W_mHuw z8-nks(!%Nt5OBtX3^>(ejf8BEHSR=Le&+chZv>O%c>%dO{n6#T)J~<>a=X9HHm1We zKDQBG;o7OUhlFyDo%0Ubrk@3At6)qh5Z{{&L{1B&N}==Zwbz*d7^T{RT7)VSRK?I& zc9|1Npk91fryh*Trv(P(9c=T8mW+&bJ$&N()w21e7F1NQWs#18?lF{Z2ucbwD^2#L z%#zGwCvS(9fyg)oc=i#hN}+VlY-u+P0ABwemf&w^m&$vrinHRb2LBMNQ>% zgPdH6-xDUueG=`O&?aqnuV_P2Pm4B_9-EvnCbyQlo1yM(ig_UR7u$mOj4yfNTJ@hl z|G;)^*pimf+Z(|L6W`XpG*?CVzye;~+G5`#`cUFBuqG)j)}dYtEw#o(XrjS}Pa3m+ zQDlhWva_1b)#WcU2c(VvPYahztO~%p%Jje@D{N{EEk8&XVX<+n@M083mlARsjE-Cv z*ds^}4qI$r+Lv!KT-JTiElYF)Gj%834b#Gt@^x~{@ky32kA3WSyA72)TAJcEih_S~ z-tTVh74}N|I#pZ>`@VN)EYg_S8cGX`R^douE`lgBXk=g3iuLXrIWPR6;WTM36q^IN zb!ir=ugY9`Fl6wz))%XPgcp`@I=$`w(hs-?Pi2ZxH-q5*JBlqkOv;BvNBiniByECN z0aD1A%bCdGPc`m3{hlr2NO}`Y5C;iiu0f1M5(!s~N0K>417xR+Cw=h+)vI&4AJ`2) zGvq@9+W4r1J0}q#mmOMIq^s&5tRBEn_>0{^sgPSyouheWdHFAlG8VO=sr*5k=J5(@ zxB8H>D{GpgD=x4occ|$?Xz>QmQGzKGPKVJm-4DQE0MDcYrgHJlqRLCC^MIYLfGr{~ zb0U(*%m&kjoug#ru;jDS8el{%Z5oV?52tTYA7THz1^br)Cyq>DF;J}50=sEizrkQ! zIIRp^?6j%-2$zBW8!jP7bQr{rl+!omZkmLI!@O-2BL^^|nl2H8<^sdvV*rVJRbZTp zh3DTA1l;6An^ldf6Hpnlk3F+mj%kP&)5Ma$EV$#7iO(AIZfXSopi%l`ta4Z#@Cu`{ zNI~`g-l7@?l_^~1t6?Hrn6bI98>AF15l1jtnOasH4)uJ6+@EuhaMRfxV5*YeT;_%< z@4)xue5^!6qC3v}``#fWNU^vd52wxUx&n|6ve=@yQ7#1b1oFb1FR9RUQp&4oidFzM z!Lgqc+blypTBFd2ue|rhg3ZPjU_w6e0W_{Ce-P`Dkcm7@zBf!|0wCmim+AE@vfz6! zd&*fSi*i3E@leVhma|Jwi)-wC3)F;EEI><(Pq?NkpMyF~P9va-FrKBLfDy==y^bYT zSgJ&|GrQV(mu|HK{X9yXzSFua1Vh!!w=3cw&n-)Vz`)$1+V3&GMJZ->c2*=agVk{l z(hiuH`9aGb1S zLH6^(dgrV^3p``gk*$GHvf=>WIJ%^S!@Zs=sI69ROq3;VZoB5L(xF&bmnN=nLlD=XHWM8)MEPi^N92OoR`L!Xqwu z6lmzy`sDV!(RdBv6UTFDZ>AR!^mS@4)T>IQA+w!8w*5r{KOF68^$DWqO^qZYn^83d zF>b5SOh#=XYDg#RL`0+Ng{WT{UTlb8nBcfuWeDN^5<%u*cztoLGbQZEHSqYGf(xuG zIJVM^ce@)kri=<=r^F|1OW8;D-)2f+5pJBJJ?fuOst$oXTHnrZmJNdl3eYzMYVmcV7zIIed2YR$hwLaWE0prB*@!JEJeu55nce~ z2YsWdE~6AYs-G#s!9`suDwCtT6;i+WU8=C0Te*8lGe_Cuf$(V)0g}!_kAjI_0Z6ly z_l7m|L2KtM5_TsyaNg1h_pqu!pG`xYdF3C&N0PLGl3gdm-&xAA8V8=&T&C6@G=p?J zE_`uK$cj#-^vAO)Nam@SO?08Rsy=I30k$_qpJ693+B8p*@zAItKO&!>9PHr8={*J+ zq(lE!)g1BAXHVH!!VVCs2yKHtv?rtX`g7;8?IlJ!u9bgJ-n;5r+j_{PiAh0Jmb{)_ zYlLf(=w%Ej?%=!A6~AkxVNyV#EZi+~his2+D}2W`((sGDAyS^GawMNlcyrdjCSe#n z5rI5hh?jKDc~Zci%3la;)+#P%J=#)4Q{9tBha2>QmurL$teBz8kpkoS+AW1a5HJ;k zXor$ez7=_)O;zhrS)WL$3!aRZ`Y8jq9s@R6TX21I21tGsf7cDtkW19cbDb5{$D*bO zr=_OBwy{7PP97!SqXaVB)hkftp6H0p%x7&cp%x$5mV9q;lqlmvf4h&7s<;@(?ndHc zww@kraZ3w5hwN)LsDvNXzU3d*quwDAjkNFk71!d7C7j-O{5`O8)_|k#QwzWY1i@mmshjIjy{MW+V|TC6blRYlYF|aUy?o3-P)3{bU&i!sU<*&V8`C z4q|Gc6T<>$O!;yDdQ;~8ipZ8B!5DBD4E25_J10MTSEIqdBIXIFo_YCub%Rldj}?uO zHXAC0vNTy?|EIzxw(cWy_o$xYQM+g*f#v0@W2a!sygEe=TMnI2k!lol9NOje7|e+A zKfvwE#eMQjg?YdbY@kt9Urry)39r1+SaN{zJ+@R(3H(%{CDgvR@@Pbfq?p2Pc{yFF z?NehRUE1o<6vrWzL7)N3`m<|(fD?ceT(>27XNv>Tnh5f7loCY#uAI%RoWjYNwzL?< ze^s$EV-KEdUfQlRtN+~&@hSa=jinoJQ)<1kr8)qkxtdoBmrFo42k_LwB~@WwI=k4a z048f)RVF1?*yQTmmqmgIAcL(gk;2;ophz?IL)W913w|UL8W~%t(>k3hkC4s^!P>|| zy|Z+hT#2#hxBb_QYxNC1$50!%B{5t-PZRR>-gx}N#%TMGLC*XF+5*tx+L;`N*YIsQ zY1<7!d4u|4sQQc$1|~ZCvv@0O)lkP&@D)QxZ^DicMUw`LCm2;`ORL?`1!4j2?efxUC8OVlYDM`P*--h+kHy7aW= z87NjvoQMDSv}p%v01JfwWTgNRvFYE--A7RG>;q2+%onRqj5^VY*GjPuQ#mq*)>|5< z56)@%M5EuZtEgJG;hZ`L7>-jt9!~nW#5e0~Mcxw|!r=*@7rK}olsNK>Do0G?q|M1& z$1=}!N}xOHyR-(X<*Ww;Pz-By7+oV>c#6M5Y}(c2l$;yEEnE*D7z-$nXQ2Injv>gWJ?8$<(R$7D<+N3*B1MI<~)hI9qzKE|A73%i~ASQ80>6za@KZMZC3( zW@~}^)y%}1yI}~G4?ao)N$&L2bo%@NL(=fDx6pLgG@`*kuyMEuXq3UyS=dMx;z5gR z)&ph!14pMGI(K?ng(06Xr1!{Ju4zUXk>MbWP?NF!aXc0%bi)=q1%D^UkfP*b3hI>( zj2>e-Ej9C%T(l#~Bxz8X#3ma5pI`*R{MOb=1PEq>m35hB){oXCCuXn!jN(D z-np~GrYzm#Vv=I(Y*9>(h#p40*2{A;UMga~85ccR1!Yzj2K8&M{-|K-g>XkQ#CgA0 z>7q4#U0kGz!HhGge1t9QD6v*9qCkp!(TL!yerofdwhFrfEQg`okgH{E!WNNM8J zrbo56D);2D?6j3!2x1ue;U+))QPI}xrg7a&M^!ne|E`tu}=xDSAuXhKNpYCt! z{PTq_w^3{DQ=pdv=}8a53WBxUpuMv2*DDn12;)-(Xb>H7jfT{OU4`A<;Fv&%b7xp^ z3=X8dZq3`?udkXgzM16S99~Re;*+Ag9(1a(G#R`Fe!G&T1tlw5hV9P543x6L&^0Y6 zr`MwqI)Fyim?4V=1s!)V_hH}meXY4sR}HG_*R=zX3_YQ04qPB?fP2t|zy-KO6gxZ1 ziJV|)1ZT}paYJdgbUf)KQ}i6mK@bOVOf-nZim`H54ZrT)st%?2$3 z(1VPsN}fAa>!D3Kb?c=m<{kQo7PW50d#?Wt=t&2`q-ynMhnXCl&hKD>P!{z5y38ls z<69}}CvmaH=IZAKx;Qmz3EWxp=awB0QZ72o4;qfWV}W7J5_Cx3rutETojBde8bIaY#dSnPrfpm}o-KA#BeY4? z2=FGPQ(RY&RjSlcW{qXTan}lE%j=Z`zxLdfK{Uu5)&RjqUA-tk$$a)tx&h0jS7R2o z!!AG=TO*JmYja>l)bPHPoC!|fk4zs?%6mXR^V{Qb^i6B!My7>Cw-IFmf36FQD@pD`xXsz-68uo7Qd>wu-O; z|CNXFlN${u2gSH-#RD6e&3~v*6R&5{3dDp_Zo;n>(I7e>T>44T`bW)$S0ug{k4Rw) z4`Stv@99&=)Bynj>SJ*7?U6zvHJ-*u0npu9KqaQ>!$_QsQfPg3x#zt5p3Yx4;-Y%A zfaXQtS5*~@uk|Sl!2eH>b(8T?Z^_fNPDzR*^cOcPGJG})if?ko$(R!mNYZ>d*_2$g z-jYFU7LmU!2yCnXYuz_Uun#xDFs?p#<?=V7~g!%Irg=yO(D6rBh zf%%YgoSjC-?>db9XBmRda}KN~3b z1Rs+nQ$6?{v(g zZ!8FOdNm`1Ca%3K?UW7oytZ!gh7Vu`aje@8?eJ`e-4(MQ?%>`ehplVxmF9hbUU2WI z)1A!PN+-b{ZF>e?jiCgO&`||w9dbx9$_eMI^HFBy5580gaRum3x22l$k9p8Y17L_n z|8%ZAtb1gSJz{*(Q}93&_xsP!KW?DH$lHndu0cmFBlzvPGXzGXF{I|pU`M|*SICha zD0Iv=S4)NFm!!CDDaoN*nb;MVh{mW>27GjnHom-hN+ciJbeU%Su@C2k6nfARgeas* zD%SLIa1Ocbd#ype?{gW<$c$99u;@6%c8Ui4$zFQYlz70=56O(Rno3LsG>jB%z9BBl zUfpBYJn&TbT$`%bxq8&I=}fT1vK4{cZms7W<#L8e7QtgnN5UQjO06EMc4fy?;h;uU zIiB{VZ(c$`8*R~x*UiFi0L!<~W)~Xz&haA1yJ2_VGvXOPb#+Vu!iRhhV|aWL)qx{P z`&eI#X2VEvAvoUW38_L{4hnMhr6=aV!7gz$@f3IvirxPNRp|A845j`HtdN?jxd#DF)H0F*&??cj?7MO=jq@s9*cF73(8;E@QT)s`gy?l`KO_mDIJ-L|2kMW6{ zUOmSK*?e=c@_--bv!MoJ@+(*ubo+WNqkoDpd)uY(R|(PFg!vESPrxgsu!e^#4(@+Q zE~OMo(u%Hb(V95$=?q&6^alAz&xMlDMCJv79G244BPb&&UU`$C#tP19%vasw+l~RH zXA|5V*v0_~t`HbVN_`{f{L=Ln|AcJ*o;wziOqpoYurRT4pvW!XoSji+{zMGRdgs1V zO4KMuR26UtPE=y{88AYRQDx=O7g@#oC1)%ZPle?`=q@LM(9-u7Q&?z+x9NfyJ%X4z z0uisS!i2iTJwhMR*fqmoaBDL*}YQ zsFIn4s7374&qz7=fNZLo55@KfY0lViMooEp1Yd_B>%iEDAqP?2um$*nY4X+z5f2?J zjVAy}!td{}b7GbdyCv))!27m6~=%U3E^w zCoK@SfQaG`k0-GFWOP(R35O(7EkAQ~qrK*}rjdZeb+oWW>+vwN)VV+dHR{~VoM#02 zlzdIDLRK#7u$~utNPU{3Vb=Bpd!ml)syuozyKgyzC5p#~&li>q%PzZ@`5#c055^yG z2Ouf7c;DFyjq+${imDo+9edNgvWJAx1?y!sc$|YIE3N0^s)Gb4tfS_^y`>@VHE3uo z9z(H~>q~$jOQI>9Ood+H*>*nW*W~k;eNn9LJfC&c1ZO0r8cGy-N`lf?g!vc;s+$vp zf-1BdgXmf4a49zc7Ym(t)LS9X_CBYGmi%e2<{RBCd1-AAQx%)keQ6wz`!fIpiD17SHf8If57dUn0-uJrj;xsmJG#@%KG%~wh^vB+svZB z>-=}t%;pB?m0;V6&+B~HA?ibKV)Gc5hw2-X&o5~vN+Ct8HudEWtFn4Z9o%0nTJo3* zMNSI2bV8oTRZd07nS?YIcsXvh-DaJnY(D|YjoK^wDoPsn)prjcNzZS@2QTdMN!l7b zF`FrgK#!^b%JE5B5*=w=S&d$d00| zXM0p_9#(5&tfo@idnz>%(g#-AE2QIZ ztJ|sV`$%Ap@J3G}4d}i;XT$IKWyj$nhaZ|}LzQ1&3}i^V;JDb+00M?R&>-+%i?B93 zb^WHz=BP8$|H3Ia1&1F_C{nfRAZC>VO2FKzAx`=mjUJ?MMRNlZvKiS<0}W;Fy;<5S2Hjb3U}~wkXEvX(RtBN+Ymk)nUw<1&J<} zd3E_c_6Jq$fa{20QX-kCSN}TYA7GI1ma9hXCwkV&vJJb}d*cH0wQ0hI&5fR&=hjZs zhW!0L#91Kw4y#}9_`y;iq8H8Dt|E?3WQPhg*%K(u1M-+=6GGNp!`=dqr?lcipx9tH zfWh6Y-A&8|_v5z8^18wJd6oU(T+?k4ZBzi8Rc>_m)Ho4_T$$Y&8i6XQCwPMiAqyc8 zn8sxLMwIdnSAO`5@EQ7^%Y#R%HZ#%icCL`Jg8g^!I9LoWcy=;DvM{t-^q0gZSd`4< zE^2^cCtx_yGr-hv156Tj0dltxP}kWQjprS56+NDrjA;Gi^dC!fCjCNf?^tLX%om?w zHKc#83=Z7}qGlyCm|{02AgUx5xXGk~npqJ{O%;iqt!ETt0^AD|-ij&!NEyfwR2NZn zdDJjYk@-2Nh#!U@3GPU*Fc=nHk`5cl(aJ0vVW`u2IWF$AE5-0biKPuC}W*0({(Gmtn6~}1ZyBx7Nem=Tfyz)XEUU<0SbI9$I za63n$0_~8o_SLq`=(>2Ns2*_Kcs9dwPaIzN)#Q{eMFo@l74Mn?|YqDHrMxjw?{90*8;Jf;!YwquPP*$y0@L_v9Yy zxNZjClv5eI#pg9JSDn{mo=yEYI>{zU`I=h~CF7Ov&ON`NXix5nMJun)V#?XGo1_x* zDvw^R2PtO;c@iNxX<^C628`hqggbukI#fuArA!z@^wchR^X=>!-d!!C|qwS2fD#; z{oL&v!Ff$i1YKQ*wbzqEGG8q_jSnX2bKSniTm6t4--vsPFV)O)if{OFm)oFv4%->E z_?RIU;V;!A}S&sT1jM)^6Ul3;9W+F!*BZAc@{h-U&M4qJzX24naH2)I_G z*A0h;X_gpbvm|%p<$vB^v`367&yOELXUYCuk@zfcjMP%P7y(;w#to2({)rLS<`6r; z!_v5YPz?YC?Kq()PGaW&*2cjIYiF^;jm;NYW&VWAr}V71maWga+{o0Y0p{^fUwVm_ z|ACkP(j|5E)zxHrxde1iQL+Ie(%n~*<#*zw}e|BUah!=8tUADP?paPF{_gi zfKfQ2Z=Ntvl@L}I)be9g5e8YqB6edh#nV_0{eGi9KePgZWg}Zpa$+YT-Hk<>J&FH5 zV~Ry^iMvc6o;TYsAo85`Ry~qZiJQ265V#d3`#V-?nZ1A@!dgJ|L6u6bVFhpMWC)+Fu$;RC> zbt|lKc2jMT;a8ULTr$5)>8C!Vx|Y=Vg@P3+ci{<8)$Ji5iJp*w<8{Y*X#vjC_M{_ zr8IdWxQd=R)uFoJ(u#Y$$Saj$Z8ZKog@j(ky8JeaKukq=%ztIi!uBAMHvB%>$IxoO zlt@{#JE}UOdmH{2HWu2AAP`UH4}iMu?K8ZGvNJeMFOdWj46~;>r3rL3%bR=t+2(+g z$Uw^24jXg>f)9$_d#_p!hmsG3ES8EU@9qTqq869;i)7L`kao#kxV%~`DpXH>l; zGKhq47AKz8&idEeqLedz#r_eShl?6e+%8|D1{(h&aXdc1B`qEef3Dl~sI0F~bhqX` z^)H&SOS-TX*!VYowGI?TSO6fG;%Hr+r00+UbOm7xTnm;Uzh12BbAAKE=*_}{9xfwqm+y5%bqBB0IX}3XV2CT6V?N5isCWiRq zh53axMW$!Twfs;}0gc8$5iOWWr|aa}pbx89e-LxNa?2LDByY8bvZvT^IqLcg(c*to zF5BRVua_N>L;D*S+kx$YwLJYe!^$<8pM;`5ZLr<}Z$nxPAe~ImJon-7YwH492dQc? z-dVTbu!IE0L+LLj67&lNZn!1fx=Z`>v>aN%vDhBH_XJt{+Fs()q~MLXE-w%}<}wcH z7A7+!91moLLrYinAQ3SZ^^B?fB9Qr!o4J3VQPUgB=)3qGVcu0b6UFan1>cB3c&4Nu zc%leyL-k+0eVwU5`p33LDrK`E>cWtS1gRub@Q3y&EP;Z04aZfof`MNO3hTyolii3q zo=Q=XLr)y43chNFgREG38-44PH`#r>BfIbB^3XJ>;$)vK$zW13!xuUv3fjK5x)A4P z<FXql#6xe zQ@)QKX8C0XwmF=QfhR||Yi|4QnvsVxjJ*bh2YP<3`wNWZ-Q;DF)?TL=2xnU%#!VV{ z)m7mf;Qb)GyPfLg(9_t4Bdj>rf?a`B(ZD{Nj1_0Lx%8nNfKIl0E~o z(DGi05v`wmO|m2U8%qErXmAvcZafpS%oWIu4ThL-9aUsfUe3)3Dl47Z`6-h!8lO23 zV!!7Cjikn86H|WDq$F{1Zy>582qHXOLZ@3ZavPy1dtu z7_4yMU6=AV_b__Z)G%VO#Xv_q{MKn5k#KQ7v?n!x`bXv}e5{JuiMIRn+FQpF(x^=E z3BQu5!Y#n<)pCxn8~$#V86J2Joo0+3v7eUmSc@lh1zC-1= zP_u-z>L6>1sxKM{0X*=ccr^zjaNK1~35Or7lOXY^(=klh$gTl!`Fg~*DrHunm3^$q znr@ID1yvy7_ijIF1SbgoDR`Fe1JPIr!z*YCjr2Ax;otm_>hBbFsFX||B8j0@AaH1u zgY+IYuh7dqM?1E2Vc1JapC{2^?NHI1^S;~BP1|&gFsBp5STX`o&v5|hwh!QX*gsUq zh<5Xe(kfcH>3>DeIpH&z)2qlvZa>cY2>&*unB?=ML>l{kgiB4V5dlRLVQ*gQY@$In zVNA^$TN3rlv1D1l+#CThA)E|6ZdDI9OHF+4Q@~i1d}(A;!1LO z$e7#+v|9C6D)xSAam7N64q098@f7h`W)4pA)*hnlo;|P=bLiLqb^_)y7;ZpZIXi9f z^NsRF!iQYQigbN9$8H{08?VB2jsR{F%Ba5Z0^>n&LEWr-KX*)pkr|Tf6tu6DOX>!@ z2Uzv@ABFKNP}jh_P|_TrpB>MVHbvELFMk?RzVCB17H`8Q^EKI^8L}df4ov<`czPi% z#^B!rvAHFAer-dH;jd6w7VU-1BM90+G}l)D^??oFr8CB25O>GqM#IHnU|vly;?zB|Ew(pX^1&OM_*)&ddmGtQDn9+QAj`iMH6QtNM!M<=LA zh;LX@lW(81@6}oOg^!Q}@z0a+hy{={LcbUJwyL#J#ZWBfsdtG9?_!aAIfTDa_aP?9 zeKy4Zmw2@Pt>5^s9oT9UNWVyXZ zmA^>FmsDzP{lQ}So6=&Tcrf&%jPIPF7jP`yY5J4Sd0;ZHrGoiwa`D;jsPNv-OTpo_ z6rk9Rg;zLYLH&kTh;3H|p$}k|z8+dEzl`10z+E^#${OcX6+G?m%k7~;c+=fha>ECj zl_3$m#~MpVUJuivR}5=Ar4Arv`~e`TC2l0`2B$1WI<2C29DpN6U;^;2`X$=i&ebFm=}vvkX^XCBTfduz&(xn yA~ec5zd5U=f~!DH2aNE6Bv%S;6v{(sO-Q*?puMkNti1YT5#l{6Fo5y8Qcac?&;Q5( literal 0 HcmV?d00001 diff --git a/tests/test_types.py b/tests/test_types.py index 0919aa3..dc5967c 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -44,6 +44,12 @@ def test_guess_heic(self): self.assertEqual(kind.mime, 'image/heic') self.assertEqual(kind.extension, 'heic') + def test_guess_avif(self): + kind = filetype.guess(FIXTURES + '/sample.avif') + self.assertTrue(kind is not None) + self.assertEqual(kind.mime, 'image/avif') + self.assertEqual(kind.extension, 'avif') + def test_guess_mp4(self): kind = filetype.guess(FIXTURES + '/sample.mp4') self.assertTrue(kind is not None) From 6ce5641629c03f75cf176baf253989fec5a06503 Mon Sep 17 00:00:00 2001 From: ramin Date: Wed, 26 Oct 2022 09:57:31 +0200 Subject: [PATCH 2/2] update README to include avif --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index 0c7db69..3612dce 100644 --- a/README.rst +++ b/README.rst @@ -77,6 +77,7 @@ Image - **psd** - ``image/vnd.adobe.photoshop`` - **ico** - ``image/x-icon`` - **heic** - ``image/heic`` +- **avif** - ``image/avif`` Video ^^^^^