From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/winmm/tests/Makefile.in | 3 ++ dlls/winmm/tests/mci.c | 75 +++++++++++++++++++++++++++++++++++ dlls/winmm/tests/rsrc.rc | 25 ++++++++++++ dlls/winmm/tests/test.mpg | Bin 0 -> 12288 bytes 4 files changed, 103 insertions(+) create mode 100644 dlls/winmm/tests/rsrc.rc create mode 100644 dlls/winmm/tests/test.mpg
diff --git a/dlls/winmm/tests/Makefile.in b/dlls/winmm/tests/Makefile.in index 1b191cb5747..2b475dd89c3 100644 --- a/dlls/winmm/tests/Makefile.in +++ b/dlls/winmm/tests/Makefile.in @@ -12,3 +12,6 @@ C_SRCS = \ mmio.c \ timer.c \ wave.c + +RC_SRCS = \ + rsrc.rc diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index cfad9a77da8..9399a0fd284 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -23,6 +23,7 @@ #include "windows.h" #include "mmsystem.h" #include "mmreg.h" +#include "digitalv.h" #include "wine/test.h"
/* The tests use the MCI's own save capability to create the tempfile.wav to play. @@ -37,6 +38,7 @@ typedef union { MCI_GETDEVCAPS_PARMS caps; MCI_SYSINFO_PARMSA sys; MCI_SEEK_PARMS seek; + MCI_DGV_OPEN_PARMSW dgv_open; MCI_GENERIC_PARMS gen; } MCI_PARMS_UNION;
@@ -139,6 +141,31 @@ static BOOL spurious_message(LPMSG msg) return FALSE; }
+static WCHAR *load_resource(const WCHAR *name) +{ + static WCHAR pathW[MAX_PATH]; + DWORD written; + HANDLE file; + HRSRC res; + void *ptr; + + GetTempPathW(ARRAY_SIZE(pathW), pathW); + wcscat(pathW, name); + + file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %lu.\n", + wine_dbgstr_w(pathW), GetLastError()); + + res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); + ok(!!res, "Failed to load resource, error %lu.\n", GetLastError()); + ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); + WriteFile(file, ptr, SizeofResource( GetModuleHandleA(NULL), res), &written, NULL); + ok(written == SizeofResource(GetModuleHandleA(NULL), res), "Failed to write resource.\n"); + CloseHandle(file); + + return pathW; +} + /* A single ok() in each code path allows us to prefix this with todo_wine */ #define test_notification(hwnd, command, type) test_notification_dbg(hwnd, command, type, __LINE__) static void test_notification_dbg(HWND hwnd, const char* command, WPARAM type, int line) @@ -1426,6 +1453,51 @@ static void test_threads(void) ok(mr == 0, "close gave: 0x%lx\n", mr); }
+static void test_video_window(HWND hwnd) +{ + const WCHAR *filename = load_resource(L"test.mpg"); + MCI_PARMS_UNION parm; + MCIERROR err; + HWND video_window, parent; + MCIDEVICEID wDeviceID; + DWORD style, expected; + BOOL ret; + + parm.dgv_open.lpstrDeviceType = (WCHAR *)L"MPEGVideo"; + parm.dgv_open.lpstrElementName = (WCHAR *)filename; + parm.dgv_open.hWndParent = hwnd; + err = mciSendCommandW(0, MCI_OPEN, + MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_DGV_OPEN_PARENT, + (DWORD_PTR)&parm); + ok(!err,"mciCommand open test.mpg type MPEGVideo returned %s\n", dbg_mcierr(err)); + wDeviceID = parm.dgv_open.wDeviceID; + + parm.status.dwItem = MCI_DGV_STATUS_HWND; + parm.status.dwReturn = 0xdeadbeef; + err = mciSendCommandW(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)&parm); + todo_wine ok(!err,"mciCommand status hwnd returned %s\n", dbg_mcierr(err)); + if (err) + { + skip("MCI_DGV_STATUS_HWND got an error\n"); + goto close; + } + video_window = (HWND)parm.status.dwReturn; + + ok(IsWindow(video_window), "video window %p doesn't exist.\n", video_window); + parent = GetWindow(video_window, GW_OWNER); + ok(hwnd == parent, "expected owner %p, got %p\n", hwnd, parent); + style = GetWindowLongW(video_window, GWL_STYLE); + expected = (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZEBOX; + ok(style == expected, "expected style %08lx, got %08lx\n", expected, style); + +close: + err = mciSendCommandW(wDeviceID, MCI_CLOSE, 0, 0); + ok(!err,"mciCommand close returned %s\n", dbg_mcierr(err)); + + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); +} + START_TEST(mci) { char curdir[MAX_PATH], tmpdir[MAX_PATH]; @@ -1450,6 +1522,9 @@ START_TEST(mci) test_asyncWaveTypeMpegvideo(hwnd); }else skip("No output devices available, skipping all output tests\n"); + + test_video_window(hwnd); + /* Win9X hangs when exiting with something still open. */ err = mciSendStringA("close all", NULL, 0, hwnd); ok(!err,"final close all returned %s\n", dbg_mcierr(err)); diff --git a/dlls/winmm/tests/rsrc.rc b/dlls/winmm/tests/rsrc.rc new file mode 100644 index 00000000000..b5fde1c39ba --- /dev/null +++ b/dlls/winmm/tests/rsrc.rc @@ -0,0 +1,25 @@ +/* + * Resource file for mci tests. + * + * Copyright 2022 Akihiro Sagawa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "windef.h" + +/* ffmpeg -f lavfi -i smptebars -f lavfi -i "sine=frequency=1000" -t 0.16 -r 25 -f mpeg -vcodec mpeg1video -vf scale=32x24 -acodec mp2 test.mpg */ +/* @makedep: test.mpg */ +test.mpg RCDATA "test.mpg" diff --git a/dlls/winmm/tests/test.mpg b/dlls/winmm/tests/test.mpg new file mode 100644 index 0000000000000000000000000000000000000000..97bb1abae1d6f0676b9f9484b9847c587bb7dd89 GIT binary patch literal 12288 zcmeHtX;>4<_il$>7C}K}QG=rbBC<vVMT58kL2yMzA)tha$|&F{xX?ibS43IDq7py^ z1tkKbxM70`2mvETjSOnQ2#D-!$kJW6aDM;$+~vc)AMSHMO`7ghcj&70sq?<)oVS7? zq^I)`5<<$!xsM>EXNWdzsLTUxZJm{srtnIe%4<7B`9#SyM45gKo|h>hhWY@s8N&8s zL<4b!?+Bs`Cg3|sf4DMswuZ42X-HccQDqtHuSY_zT3nsO>a$o7>uRXSTd20owsgOH z?0x?0HP`R4SdlCXBu1kxxRR6|Hj23BA@}qSurw?GSjy5xW*|GekWa`bUCo6_)nBE9 zrn3<mqL@}$&r)`6?IS5wst4tLrD<DX4f7%%1Z~p0oK%0I?+PlD4kCMyN~JdS$`vXq zh#u>Qn##+-sg-k+UA0~Z8ebhJZJb)|e)hK@4TtzVaArzeu)%4!nJoY-RU*BfhqI_E z=*vLly<@G$v}_im(wf9lbJcXUHw#Agk?16rw#RByO{7;d#na4uukw_~=>c;tHHJOV zo4Q)Jmozb-NJi9h%2_I!*~;0gy%8H@(mo?&(p4kn1rJP+9U3dwnkutQbV#mml`Bn7 z8`{o2Y;sm~`Lt@dZF-h+9@}jpJC+srXeaY~WnF)aXw{srjijh4m3H%xKn=B5m2;2~ z<fL-;99AVs6In_+x8y1*J;-&Q(gkhpg|q#FU+#Ok-}%RD&p#*ULP@_;!@!jlp<x_o zjx=Vgb|kynlP>69z3LV*omJ?1L^=1}jVn8p&aXaM?B!i|8~fCd?P`fU*0WcJpXn*H z)B}yw%uTaRMzixb1(zx5d91tg+`=>vp(zD!P$r#6-WL6(q3#;5O^TX-S|3r1EicrV z=^C5og#;r%NNqYSBj_ek+Tl@@2Xj~ylASiiG=B50?7y=A=sm!B_!F^279y`m4@eu; z5bdW(w({T{WS^3rj%&8|bfnjTwZ}^-ZYJ{Mtny#1mIV}r(L3WT&-U{hY>s*s61f`c zm3GK#)*hu8W2HdLq>>;O^N%!-ca5Y?OPhpxdR8Q5Z9Sd(?B$hOEC<qC<v|@+*Q=I3 zGZrG<LsJ&m&Y7P>X0r_A7nJTWE7;rcX9o9o_#o%T;e!zHL2}B2^=ztif2bje6H13k zg*GWFnr*I2%#c;cab!>%aX{>B5Kf+UiWjn9S?_J_YK`3S)&BDx!#9L+lO`Qc1&Pf^ zHj-G%5A@;#4M{%wNHFOxMcq|xqlHQh$&H5`RYd}`+-hdLqZ!jY+@tI)Y6_nE`}~5D zFPLCW;%NH$+235>9-Gf(V9nE5%_}QEs~^>Sm@K+9w{`8T6?$tP#NGX}RQcMR;E{92 zx3qoNzb&ydxVTq++PbxBwwp~lPOgkw-QeR_hk&5hTLLGYVS4(Gg)bH=oSg70RlIQY zkMmAr)1Hwp>xCJS3cru<jmzqK7Je`$B&}xJPEg*@7d;lcIW@#?IqgIKOnhHM+Zix5 zcUh-;*8X$OpiHufrJj_Il6GaBPMp3dbH{HF`YjGy#)e=0^$2PI^#~V9h9`B&W54Ne z23^n}zrMtUc}CWF)Y}kn!{@}cDI;fNYj&l7vdne=VzT73&$R`vPj}sOQA=JF>^pN` z=3e@_!+XJ`H4sGjUwxhk9016Fx>7ziMc&?W{`#DgTUaa1H$8B=b^q0ruqW}X@Xf!y z^*AW4TyD?qdJ&y+ES&P@kd_ZJ_!{2$LV2n#`1kd%1^%_bKNf(Ps8pBDLzIuG0=(^2 zZ({|okq?04HKNRNfdBF?ujbyDOQXl8`t$cipet{EoWppxlKIA;`R1Vciv;s`Hw)es zljW5<XeN*lmBxsk4yzTQSEm6q+X7*olcC;HX{D}M0Rk83qK9>W>qZqKdtsYVAdSrV z3PjX415*pr%ObLfBO-t0&ndsrn?wCZ7mM1BP3wb<$s7^&tLUrbQLF08&w0tqhAMCN z4Bn1)*~YPQ2v2-PBUTH(u79N*&Mz5`y}5CUNshrx^x8u3L_JS-7{Ad|MFIw37EtTc zXf}8)B|3<9qNA}Z_={*Zm<!B+roKt}%zNX+81aMXeDX-}bmj1!AFihY{MQ88(3bNy z)h6?r5~szb$Gp&sU#UJ`V)#&FXd-@5_MtW5YwT<!LhB%d=wxdyQ80+glyvVfj(?L3 zGI8C}%6TEO%Eo1YGiI)c7}#AscVXh-IqAS~S|nw|^wZNc9G|k*pM3Rgeyb|;6he2n z+P<oJC88HOZT@GKquJ&)lE*((^+ZRequ0jd&$qb+tvX#reF!jW&F>YtFLyshUt-VE zM<ObCc4#BOz$>hlw$gI#zNcs<_8fa^6ZSBT`f1@$PP@N_zl%iK!c#zs5UiP4$v;P+ zY4~uZd-V(5@*lc;X}O0p4~c41rk`O4FxZS#Do(~Zc$0nl9$bbgI5<_o$88igV8QeV z&s$T6x}F{P$#D!7-an_=t#jmcqWSYT#kB$Bbryq$o|s+ZUmxFyszy%&5l*f3wJ$J{ zo}!l)Gcu{e;YNGnlD@xi-xPYur4sal9?&0}<sRVf4O?RH6a9{U2c!PSE-oAR+rTAb zcZPcz&1th+`1$@+x0w}NUNy^4RXH8&T$j+>&nSETnjoL(Bd8rX<#}B?R^0=x`SEd( zpL)~6Dpg#{%V0FxZ2&gF7Yuu3Ft8YNkOmHcWneKd2aR?w3$d8~uURe!K29?=p#;4= z(E7)&`+HL#e0QBO<511>W-!3Kd_T*+YFG}uM*;bVPNw%q0zD*N3@+bm2HDF`_uOL# zUCP|Ux5uQI48`SR>|L3Gm<$lq2_PfO=y?5tl2_l^A0E1$9ct%Ytcc|9+9NeB^0t($ zbIZyx57n4$aoD%e<c>ovigw{3Q3gUzpEe>7NkPNMBMpAS-WwijCI*Y*=UZWz7H9!Y zKx}n4-kI?M@W2O9iRgnyAmK9yN>`gFu5x*F|H|&IA(w=7;}#>2%q^!i{Wn~kW_SO% z2_<KtaxvOP0JIALx}w2cEgDN~9aSs4%MxVlGOk}YWwkxeo>%f(MDPhdV5HIP7-?jJ zOn4KzaNhuUHZgeAEsM=LYrZ@O#B~aHcPab8%-!QJKC9ym%Uo4c7UV3{5OQP{FcK@F z0|fg08Ocu|L&;@shnv*W!!mZWhgxg~>L{;y^U*PM2$fJ8f-Xrq!5BJ>j!=iGLqKuW zv&JOJJ8_ZtO<z|)c|cj3VNL1Un_n-P_<96$RNO3_R#!)L5gxHs1S*mO6bIV3EJJmL zBVaGBz`oP{<(ty2HA3h7gAozDYH$lA1A(>!t%Xqsgn$FjuEAY|1z3nM4+ARr>XP5I zv}dtU^>)%<0RQ%?x2dUdlH_nbL@BorzKR@nkMqMKg<(sDUJjV{!`1-pdPDDur%S_l z!KXm)yGT!JksM7MAvog2ws%>Wc!FSN<TU^xj$xyY)ge1-BOU!Bt%^g>gq%Oj1(HPj zxS6zzU;qq*A9|WX^TJFpiptR8prd|aSqBBCrfbD(PV@)`N2?{a?K(<tv0Rpf@+6PW z!|4M!${np@r1jHl6qxbB=1iuX;D{7HHh!_7Q_HHH^2RS>?0rjK%Uy9DG+Ze<2Bhei zn(Be%+-OWjRRD#5G~3ViLF-x#bqep1<NkZ?_gc>6V|i*RU8sydGYah|_yagqD3_Gh zrydd$^!zk?=5+-CjgCVPfAC^Dw=t4|0`9Vkh=YQu2082Fw5T$w9F^S&{h90d9uOP? zDDbhp3AR;E0!l+@X6GlfR5h*TAucD`2TIpG$>Upxq7raS0;qBYgZ>Ouj}rX)m&y)& z9IYE3t!Ah&@=c8G8yM{LJr-V$`znrFY|3$~Pom>w1xL~PBlITox(yJ)VQAJyduIjM z*HapA?6=$fcA_j~<M}VotDj$8-nkPD>M`Z0P=+S<fV~IH<QZ~omNYig>Kj29$qqXI z@ywPgw`_7Ksb{dcyQ|M~{e80GarXeQArc8@=J7j~v5BAn(811cEnPdmWin~DnIRDs zXw0If+v_vT&Y*oS`$JKACKCs8K;@1>ob-bpg8ppmCd0=B*bEUCOU3LavZ8@d<Qrl! zYvQJv9{702=fKA-mr35Cf<V`m+m@SifdKG9&tS4vzM(PGp-Ja2#Fsg3bD-n?Gz+sO zOFu3U`0Zh&666sAgN|OxlXRRRL>+R9&b@b3$q=xZ(S5wMgpG@^gAsm=Gx4(@7YUCY z@}9fTCmB2gWgw$7+tvDl7?SA+@U7>g)3=`ZzfE0r9KMttrHf)rSDi-g)`<F-D|hZJ zs|Vx}fI|Q34U-R70h<X$Xo7wCe~<s^RS?SHjy-EFz1$uMXi|oh@#%1Ulkr$;&&}h1 zk3m3zZqW21;l<US2<X`3ptn>6x(4$7b_<O1*Eqa!4<D(SqOKG0fbwj6=C+rp47(-8 z%0~c4MDT3Ba9FAY^VVVty&F&yGQNS{`>9?or9<ohch~j{W$SuM+#>6)xg7*Qz)#St zp%(pskqRcjAUYy>%bT^}taw|sir7~-Yn^UD>Dq-C!5Mv}fX*~<Z-@#5fJg?Yqg6Dc zIC}F0nm^@sCZa~r-~3+j{Dd)%Nq{Wq9OaeM=IJUeg>h5FJTp&p1dN~~hi)CpiF}SJ zFhHGPTnxG(?*bCa%kbNe>~>XgmKGf-2ozn&Q_I%}pWoU10OTQpS}wQ3PFNipP>AmR z49uj<0Xod8ST`lrC{l&DgzeAX6;Q&vaJ<j$4A<Z73{`<nVAAq;b3)5M(g_hkSKy<J z)Ou6Faur12^!MW?+rC#Nzb8yB>25G|a3}S?V@l9OoWKOQT=cx*`UL7NlD%=L$3cPA z)p0!!G|pY0zL!m}x2QPM@v7oz)KI|FoYiy!#Zg=d8S~*UqXTb1hL~Znaj6oC(nR4m zJ>R?&`QHhzc#`nK%DTcL_%36uE~9UH9ty*pk6DqQ8knl(c+1s60f9;Zb&LQ)IofE^ z@adgq)1uRuZx0}gBr)KF6utbs80Uj>n10*>MSu&28QU!U>}SDtImp{^cZ-E?i+zC0 zXPF;Ex-i7Bu@nQz3ERu!tvf7NI(b~%oFi%Cp_K@bf`JK;D8{Lc_vM%@)Raq*%Ox@V zZW&;X;8<gU16~FIM5zEqz*aDH>*)R5vmZbe^!3K5r1@{#BhOi7EZ%W9-qG15>8k0J zT6T1~bG3Tk#rNhWOCJnH+<J<3gG2>d2haj3fsH%jVoQcu$~$he931K==qwGOJECga zs0AHc3O%n6?lOa=nlm(~|7v$n>+m?(!ltD+m(`_IYYSG)zK|c9zn3<a>3h;rdDLQQ zk4!rgQ34WBpn&rR1QWnUGQhZ&s(qv34Shhtc{T?4&2ki#45ZfXfQXU8Fd#w4QK{Pn zalPAlFo6z%(etAvJJy~s^W2p2ESkNOXERW#XHKaN&Ae@WKKA0U)^Mu3sOwG}T>*Fm z=O@9H;wWG7ve6uDO@GMTFcu?fRZtTLaZZ_pXqs<Bg$@C6BLy-P9336%a665`b4=Dz zS#x~t$(#+#PbHftZ3*Qh`Gn=FC<FONnGq@Dw<o@ds$WX(eH0Q{H=vK8>JkD#G(^<M zFGBD3f&qAx;BY4hZj&68mRSM<4x<p^bOndVar4QozlIT19N>nFTu(Xf$6~tPeZg#N zA%Jm8BY!C~W8T3Z>m%DrcBr=xZtLn50J;o3lcLbcumOT+Rm#&dzLC^{)44by5-Ct_ z2Z6Wv5&)n8g+YK$aDYz^+_DoPa|7bCLG{^lT6D~w@%zJ)`jUE{b!N!q2CR)tvMREj zj(nma5$A@0jRNK4^i~*iCb@f{q&WCt?dBLhUk=WV;h1n7q|aYs%Y+`xfw=L8d|et` z8hppc7m&d*;5lP8vg*WN-Gv|S_~aWBib$GYr@65)^Y4BvKEv+Bk=F9tSJ<o701Sl# zfC~S*6d+&A3X4wp{jCYLpc{uO3E|y?WBK}vGB?1a1cM;C1;YXclaV5!4IH!pl+M2? zU$CL6^<77cJsJ~YILyn>D5K?PR1};Knt8B}KX=8&3Ck%SsF2{`lPQpm7{^4IWc}8R z_>C=~d^83V<LIFtf_$$#HGLk;rbVC`ZbHzNXqDl3|0ZlTfp;~2(}eu6<sp3?MMs^j zN(V$&O=m{4qm%urZP#6V(BAy529vHZppL;W2y`b9?{R|KTV~7sLgEVvz?V`veSlsx zOmI54+Y%qZ1Z4g$&<=qzrfF=jEYTVaflko9=kB!bJ&$fW(%3gw%uco{AE>5@X`Rv8 z&kp=$*|dH!A5&(;oQM$(11=742L%(zp^?Qfq8{1h(g2-TR6ZVqb<3~~qc77V9s?;V z0V5D9qo}+tGfpFi0>;sCFfw=k+yzd%+Z)>(KHO#RlJr*33{4T(hu<!+eW&-ovs__e zagl@nGJ#j5(Ep#bZdB~$RPl7h;nDUZ4G%w-Q!+Z5>|C!eD&_h|!pW0-Y9_q96%AhV zX*Xy^5+CLT9-O?!TEBx4TeTMpCj+ma{qnIEdwn={TyVFxXm?hjH?(&*48C>nsct+@ z%A5UIID<X!+wG+9hStrjlyDcG-rTZREndlN-?BQR-Y{EQ5oX>=q?=`=FmLcOoR4}$ zNoN70(D+614%+Tp^h3^Wq*%nbaNuM%L6&=S;mw5)#gWh$Kj4*a&;fWtPvQ2S+cwrF zUn>}vTf4xc6KASGcRnhsFnfLe!DnW0{tm`bM=EcS=%kHgxSlLdpZ7#;VRb*XlnX1b zM9|TbcNdEF&4pthX;)yEF#bdRUpb!fkN#h&-Ve_zPPKua+z`?F=!d8jod60*apR!7 zY)hQF^@^*X<G<bL+0kPE99W;18u^0kmGJ_`RO2!6+mx!3zbg4+DKOV=reM;P&fkZ4 zwb5s6sj{HN1%*MeWviznhwH_>x|^DY=op;evF4>t0++urDNvx3n;ae9cGk%kNa`0y zY_T$zlsTG^8@7E4N#V_Y$K4q2ll<!7)1QHj);nz^INErJmu{5%MyL4kTH97hy4hBM z+t$cOrs{KdUQo$dPYFw&hbb@xDlKpRnWHw94v7SeQ75m+14<7z^UkNmuWPM7jKB3^ z1%t${G7p}X%S2~I%FGHM|D&~y_ic5@P`Y@DZRC6}AeiC`1i=mYMyGk!_VvsR?#_xo zg~d_BIc_<wR2(D73Loc8#u0A}MtUw}DGZPmsq+FJSNvIW<cFM=q@m<`z(L2+Q#s7O zHZ)=vz+?x#E{>-=XxUzqqV%5S4FWAo*5~@;Z!eBBsEVrey(O;!aZb~5A9r_;Fvkr* z8stLyJF<zHS=+(^iGT?i%LWV(9#;dN0%GFs(Nn<<4|d*MQj=h(8EJL7h{C}GVyogY z382jy_#TdPlE-c+X^+{K7CGxY{E<Vm`TQ$!{q%iJoOAdz(>p$s^v47nV7Du``E~kr z3ZR=$ZspL~eT#!$I)|6G_0l#6WmPn#y$rEHHc)D}H(6I0=p3Iq_4kU7goILF48Kke zE^~pcgQum(&B)@69Xs$&!%jni_Uy+G+HKpHkG;3>Fz|+1!gX-{)Exbc&JKthG0cy} zFvLF{!$5<<l8{Wgy4U&Ui)?55AD#-{%qWN-b=Bi{>{iEj&I}5f4%t<4LuYwVx=l+~ z(48<)yKAx0UMmhHzqjq%d#<+A!MC$Rx9G6rX7H(1&vfdAUN8m`Gyt#kfe$@bcDrxU zlsxlkdN!lsd6Y$y*S?k}3*C&p0ZF+BAG{kC-aYeLaT&$NiA`qPZ5y?lL6MM%A5m#& zG>W$Yy#kBF1=f}jJ4tb~GhD$a#D3S>pF%T{ALJ`3WT{a&RF}2I;X8-_ifrrpYhRr6 zy{PH-G1R#*TNO-kq$?`IZ)D$bj!XCLrwio(7Dc4mZSOkwYk{EhfmG<ymO&TT+nlx^ z7pEEKIJ=#Ld^<i#hlg%Ez1Pr&K*7<;;12OP+pHq+a9wTL7Tf=o{ECY6f2DX%LVpLL z{}G|f*c<tnaJPgXP<?jmjm?#_oEhL8j`deqSdKM}sE@-!u(bAhK;{rky9gYcXkdMe zcyni|D(H=Hpf#2z!b*b!3+(lNbZiYc2irIGZ|WCc5Mgv|^PjbT5xh>rC;9pb`UyL( zyVH3)DxQXTwr*&fJpuy|Sprbm*+%lG(8hZWqKYKnyt|xdBY?IjPL6g)H@-KigMx>n z^P+f@Um}Ot>Ip-UQ~>$(11vSz(Q$7E444DuDpsWcTNFPtI+<2qoAH~C-6h9B(-iX; zyXmTr;iOV=w{^-~>fki{d|w#3!24-sHtjNCuI1dA(OwYKl_0*e%H7kYnZ5p3S~tYr zR&5k-1;r>>Y{23?-oPPg=k^`gtO4ObGkdLgqn^H1q5JF$N`2{72afuuP0Z~kPk=g@ z-vw8oC0QBUs!GZ%BRZ5!nEeX6U`p!uy%rh{&2B^Dl~>%^+XNKIY-3<l;24_0-hqyz zgJ4ucMMEj?r2k3(<I)~UkEGu(JU`OqW9ao7+h-jixqY|gvA-3*n8A^ubwqX8aqil7 zrh|Jb7M(gxzcvbk653Wz;P<|YY3joCIZ;MwV*A^^MCDYdJOw4Ne-F*1$}t5djngs- z6s+XdcvwsO>&)sF+E!Cu3tV`M`R1$p`rhp;u-1O;ReaWlK>NUf_f8Afth8rCmMgA3 z&kFYmJ*^yRcHF-4_Du#|k&P<Y_B`8K-VzQh$uR<#!BRa?1l2)+AMrZkrKEJJ_!4(k z04~GjY=34(CZowd;pAG5mci*kTxhB05a3O4#=yfLPO~3`ec}`8HX_@S^z$}r+d>7} zRq3<qoicp;gzMCS5rbxzzGndP8VYE(WliaOFajm`MA#@Z^Qn2%tqAvZLIxXv7)30J zW~-$7!G6(65!GpbGlzI|b=G3wtpK0Grq1}uSih5(?mIx69t+MSTxPXo3oe&g@Qr#F zTUcuQl=8eBE|+>kA&?F_(lQvIzNf(ij|!HX&q<k+g2jB>|80N1VI-~5&X^gJ;mQh5 zrZ~+C+vE1;X4P^xZ#KXb)ZS%2$#pb+&&ezyU-OKG%9;$4S~R6)`;AQ6Fa(Oa(FpY3 zXONXAYatQl$7n3&!&I*fWEIXWG<6Ny9<+T=PZ@2PcW*>L!7QV(w1j&^H@S1AbJp{^ z08-H)kO1;T_C+<5Pj49TKFL<(Jk+;H0_BxPbUEk<%?qtjCxrJQ+4RA@fDZ=~fzN{Z zR@dOU5PT^1-mX2uT=1Z<*nPg$EvtK_0@`Q6%;=OfzH4C46uUovs;cLK6i7^m6xk2^ z#Izzy(0!U`^ZDS7C*S@P|BL4RkMW=1%6e;(5ps>qaM;+e$uTecfB@!s;}9>CqOGEI zv|8UP|ChWarhPwES9rav!Z2#P?*Jc+R!_;_r>8BTY?>V`bMa}{BL{r)wWDxGK{=6Q zJlb)2B*RZQKr=DEK4q(p`BVl;^d!}2tCy|cM|Z$C22vo03_1!iBe!}AHNy^c5YpYK zhVqAX%`W~YEeoxm1|?kav?_<!l)?)Ni{niHC-T#Pg5KSK>RTs)zrDcUp>^dEfr~BQ zzwGO)xC^8`&q;Hd`^5yJ2A+=Sq}|QJ4gq6|S&sQn<@GO3JJJe+O3FxRBFx`~u;_uM zfDH_=FvLFd$uTf@iNc^hdWi6a<xd)njETRZr48^VGD9{|VoBSI=j~@Ho*Z&KmAYb3 zy+8rOju+d+W@kg@Rxh#b7xC^3))xAKEm?N#hHMJVHE}Q?$HAnWh66>#k=b^R2loG6 ze+}Rwg-F4NS{Mg9EfrAV=OS2Xz_cU%#=co6SZ_aE+h4NfRpf}KDOU>kL_p!_Z_E0a zw7cRv8v;U7s>+H!KIcNBLi=zuO#*uuLlqdL^_JX<aNgydwL{;1u46bV12DA{$>;<| zkfHVuuPA_=(x9TkNdEd!`g-HW2cLINi;w&BPqGYf6&>+S0r&1TpyQqvOEs8TdmDr9 zM+0nBoxzlW4SfX0C(y|}aj0xf+VpLg_X(j(4?!Z7fl+Ky_LWg(@YBf@PXbkzs{CVM z=#jO{K3lCvzQvZ5d#5hKB8o1}qRJ_qnn6Z~O!gOC{&9<$4!s0iF7IQmkP(Ll<bXfK z-T`&iTOpH*QF)>b7>-i`{gBAp&<?a4z)*vZ!hqQiWS}$pZhlBKcmKDKKR@i7`kULT zY~{2qD4)P2pyTX2bYu~zQ3efK!1$n=&(d$(n75Y5=_9yEA|=3xcBJ;fQl8L#i(dQD z`_IbnWz2%8`vU6W)&NliOB0w&bVKab*PaQR8J*T#-jp~e$@C>!^LE(55;6uPW4tyh zlP(Lr<GC=!WIW+QHO!%&Fr70}Y(%hrm*C(@{(3(@Mv-t<aau73#OwKU$uKJ_0;%9G zbgXU||HKg5lfp-SMz*V|>#E2Nh5=9IqhBf>b+{~B1YjLIqQxfTr1-ysd^mHW`1YRJ z%XWjepBucan(2uOsPxG}zF`If1zwqJ;udc7ExzNE<ubV-q6-{=GVp|oiu_ki%7v8U z<>2KINwehX-PxKc?H%jUB-U!cC4_PCem-}08O8X>%c!ATpPf2;0xidVmUrzIruG2e zet=>MqBDbM!?T{uR?le}m|JZ2$>u{H3J@EJGy)-|L68jmQl<b=*4SiEd2=}I?f&L# zd&)Mkd_90Y2Z#0yDq}BPccW?kV!)r{HfN@CgyA0!zGbf}sL~iv59@e2ksbt~RFFFF zoJPgbp$_4F;e9Gxv7keT!f-moDII$8KUeq^$L1#c64gyKS4PAYt?PF#DYB_@&`Ml4 zxAI7NiDUAGrG8@c`%KRSwu!|m%FqEGLFYi2NaRrVPD|R#^*jD^w$+drT1QHSK8-<; zpfU`Cgo>kZ7&xR%MJY5h^tx|3>9OrzGmWb+ET}D+^l>0mtli%2NGAgGXC?TgH%Ck> zePd#7wbnzcZYWuS9U8+?iCofS^}O1kC3o8ynBc9{G%?$N4uc7F5K*FzP{HK$U~*In zuZ(2{3zlZ>t9fw375PWSdtSlg@!_(C23&Ztgg+SBxj{TrrWzB=$&UOHAk)~J*u5$V zy<O0KK(;F;lb>JK-7h;4lgq!u{TYK|q&|Fr*qy6!4(ef2G;s)E10y&xNJbv0Dll^? z&N9_k#Bht`q{=9DQk!m@cN<;Q!x3@<vMo%5vkk~xvIpHGK>17aoaW!GbL8#vc4`}^ z4X)3^o%2<)Bq4^25XuP|CscgXWauYN)>T!gn~y4!Y_*U9LW$}NhX~YCuxwgKNUl*@ zB+)<{StJs1$wJt9bs$^@hAj(nb-)k*@*CMfvx2_usWZjeesvF*hq14c`w1txQ@mbv zAC#}&^XVM>x@PR4np$PzGpW)bon+G|rAo$iPPH9qiM7?%R=CdUBt)Q%+h!x;&aI$x zO$|)HWczTg!$G3HsDAl*v;3A-?u>cg0_km-2*9;xkqDg}g0n%#rZZj5zvuOeU5l)v zlNXv}kLt5;ne89x>37dhd;OtI*m}T2)qZj02S=f$_IKScs2u&f{U)h0C2wDrtxKoL z=`SNSb-%UwH@hU==;eS~Ql6+C0MTcvNK`HQ22^KGJvOJijCHzf{}*c9ZRgE>jl&y{ zM|@8edpR#y^)ayC+AlkCrS@RbanBV-9W6z(qQM9ByGTkb5$6V-+{trXsA&)2nj89F zygGb`h;d~(yWrxKEozIu&PE{j2|;B%mlm5XUkUDU$o?wlSHyPVr}Q?1D!r`)u17}> zTTh|Z{jG|&oh75*_cZ?#|0~e{#DAqLx}eHwF(MMRfi|j$Bw_~eO><0#V8VfZ0d3%K zp+2qEMVz#_>z3sEzTC6zZUI09KlwVbBmsR7Bbgjl!0^X_kmp&tICL^OAn8Jt3^pf7 z02PTLG4&9jGK~Pg3=h8Y$uOH~7jxk8D=LD=kI|Fut_71vu^Aa2zrr0(CY&A=215u; z5dmOf0skiZ9gxHR{}}=jD=LDz{NyD}Lj1aI^49;`ZPEkKe~0)#o9q9Rp&-%0-)yP= Xt_%Ks{cC}LE%2`e{<XmWTMPU*9lmux
literal 0 HcmV?d00001