From 1c8a6af13c24d6676cc311c4fe8ba4f7dfc36a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristofer=20Bj=C3=B6rkstr=C3=B6m?= Date: Wed, 28 Oct 2020 21:48:06 +0100 Subject: [PATCH] media test: Add test for seeking one active stream with a demuxer Add another seek_one_active_stream test but with a demuxer. The demuxer will flush both streams in opposed to the existing test which only flushes the active stream. This will help exposing problems with the prerolling process after a flushing seek. Part-of: --- tests/check/gst/media.c | 48 +++++++++++++++++++++++++++++++++------- tests/check/meson.build | 1 + tests/files/test.avi | Bin 0 -> 385006 bytes 3 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 tests/files/test.avi diff --git a/tests/check/gst/media.c b/tests/check/gst/media.c index 2cb2ba6d52..0284753d7f 100644 --- a/tests/check/gst/media.c +++ b/tests/check/gst/media.c @@ -140,8 +140,8 @@ GST_START_TEST (test_media_seek) GST_END_TEST; -/* case: media is complete and contains two streams but only one is active */ -GST_START_TEST (test_media_seek_one_active_stream) +static void +media_playback_seek_one_active_stream (const gchar * launch_line) { GstRTSPMediaFactory *factory; GstRTSPMedia *media; @@ -160,9 +160,7 @@ GST_START_TEST (test_media_seek_one_active_stream) fail_unless (gst_rtsp_url_parse ("rtsp://localhost:8554/test", &url) == GST_RTSP_OK); - gst_rtsp_media_factory_set_launch (factory, - "( videotestsrc ! rtpvrawpay pt=96 name=pay0 " - " audiotestsrc ! audioconvert ! rtpL16pay name=pay1 )"); + gst_rtsp_media_factory_set_launch (factory, launch_line); media = gst_rtsp_media_factory_construct (factory, url); fail_unless (GST_IS_RTSP_MEDIA (media)); @@ -196,12 +194,12 @@ GST_START_TEST (test_media_seek_one_active_stream) fail_unless (gst_rtsp_stream_seekable (stream2)); fail_unless (gst_rtsp_transport_free (transport) == GST_RTSP_OK); - fail_unless (gst_rtsp_range_parse ("npt=3.0-", &range) == GST_RTSP_OK); + fail_unless (gst_rtsp_range_parse ("npt=3.0-5.0", &range) == GST_RTSP_OK); /* the media is seekable now */ fail_unless (gst_rtsp_media_seek (media, range)); - /* verify that we got the expected range, 'npt=3.0-' */ + /* verify that we got the expected range, 'npt=3.0-5.0' */ range_str = gst_rtsp_media_get_range_string (media, TRUE, GST_RTSP_RANGE_NPT); fail_unless (gst_rtsp_range_parse (range_str, &play_range) == GST_RTSP_OK); fail_unless (play_range->min.seconds == range->min.seconds); @@ -222,6 +220,30 @@ GST_START_TEST (test_media_seek_one_active_stream) gst_rtsp_thread_pool_cleanup (); } +/* case: media is complete and contains two streams but only one is active, + audio & video sources */ +GST_START_TEST (test_media_playback_seek_one_active_stream) +{ + media_playback_seek_one_active_stream + ("( videotestsrc ! rtpvrawpay pt=96 name=pay0 " + " audiotestsrc ! audioconvert ! rtpL16pay name=pay1 )"); +} + +GST_END_TEST; + +/* case: media is complete and contains two streams but only one is active, + demux */ +GST_START_TEST (test_media_playback_demux_seek_one_active_stream) +{ + /* FIXME: this test produces "Failed to push event" error messages in the + * GST_DEBUG logs because the incomplete stream has no sinks */ + media_playback_seek_one_active_stream ("( filesrc location=" + GST_TEST_FILES_PATH "/test.avi !" + " avidemux name=demux demux.audio_0 ! queue ! decodebin ! audioconvert !" + " audioresample ! rtpL16pay pt=97 name=pay1" + " demux.video_0 ! queue ! decodebin ! rtpvrawpay pt=96 name=pay0 )"); +} + GST_END_TEST; GST_START_TEST (test_media_seek_no_sinks) @@ -847,12 +869,22 @@ rtspmedia_suite (void) { Suite *s = suite_create ("rtspmedia"); TCase *tc = tcase_create ("general"); + gboolean has_avidemux; suite_add_tcase (s, tc); tcase_set_timeout (tc, 20); + + has_avidemux = gst_registry_check_feature_version (gst_registry_get (), + "avidemux", GST_VERSION_MAJOR, GST_VERSION_MINOR, 0); + tcase_add_test (tc, test_media_seek); tcase_add_test (tc, test_media_seek_no_sinks); - tcase_add_test (tc, test_media_seek_one_active_stream); + tcase_add_test (tc, test_media_playback_seek_one_active_stream); + if (has_avidemux) { + tcase_add_test (tc, test_media_playback_demux_seek_one_active_stream); + } else { + GST_INFO ("Skipping test, missing plugins: avidemux"); + } tcase_add_test (tc, test_media); tcase_add_test (tc, test_media_prepare); tcase_add_test (tc, test_media_shared_race_test_unsuspend_vs_set_state_null); diff --git a/tests/check/meson.build b/tests/check/meson.build index 26904307d7..860774af5d 100644 --- a/tests/check/meson.build +++ b/tests/check/meson.build @@ -17,6 +17,7 @@ test_c_args = [ '-UG_DISABLE_ASSERT', '-UG_DISABLE_CAST_CHECKS', '-DGST_CHECK_TEST_ENVIRONMENT_BEACON="GST_PLUGIN_LOADING_WHITELIST"', + '-DGST_TEST_FILES_PATH="' + meson.current_source_dir() + '/../files"', ] rtsp_server_tests = [ diff --git a/tests/files/test.avi b/tests/files/test.avi new file mode 100644 index 0000000000000000000000000000000000000000..8c83239cd92c7587ee29bf1be03ec80624dfca53 GIT binary patch literal 385006 zcmeHw2~bqonkMh{>x!P9o(cp-5?K@k#B@VsQ85)nN){0m6GcEt5tGFP1rZStL_sVz zWl>x}5D-m7QjtXg6%;U0$U;p)Hc22wnW%oz(NWVg(NQsMH#$#O=DD|~YZ4y!&-cpW zzxCa7P&wcE&v*W1mxH~%bl~q*Y}gKqogH?&$Ns&F3fJ#=ux~^F*Gff2Wy=i}mAI$l zUyOfL|D>W4Gxep)pQr!5Z2aHzr@xl{*Th&^Z&C1s zu73iPKj;7HXVdqDU)aRYqU>kF-l8}CBy{`-ZTbgF7B}&;sWuMz)A;`;uoM6MN#!5L zpZw;h(DWqy6i)wP!oO5hCVmQ4$NwNg{Eh~X|DQYY!!^Nx6VK~j{=Lf4kcfaa6F)QK z|Do_j*YHSpQ*pvU8xw7+olNx@ zdZtdn8G<(h(m_#GPMDjyK0{}vy?-*lwRdFbecg>y9_yECX`9#_Oek*Z9vSX>Q5fgV zGG3%*WbGN9-yj|u>1i%aJhYXmtz}^89+6wyDUtRG%TodzR_ihro4JH!RIx zbM^bz2f+id-hsD(f9boA5Ig|;JNPN!Z_(HPC3pb*c{rEA`HH^h-3euLLNOhi_;gNw z?oEC!O?(0;KW>vBlgSU@=Jub<T+wiy#MaIiHi$f!ie#PT-#|%q2ChA3e6Fg4M-1%gf?Pn3E7>~QZ z(5tD}Mz_HwBQ9>cs_Ood5}t*HP$=~D^!)2z|Ei27$-q?aNKPx;=WG7{PbxmJe zuZhP+Io?zAy~MfK&BNo0nk~=p0!u{Vb9kIvj=K0I>!1avUKzfMyg9&siIeZYz_|-} zYsPr1TM{{xkozgk^gW(G{PbEDHQbBP4+_HLYy&DTz6oFGe030ydvT93($pRx7~$Y? zUsiv9Icj)r^uRfJoT7|pz+1pupnH+)fmHn{syI9^RPeWK%*!^m(~ZL8hEKM}bn-^@ zQqAzV=(LOmz1saRya({OW&^|5h5~h;=uABB$iVgVV>RoFf(n$uQS#;h-crC@({XSR zj|Opd5a&qWcumlYKrfQ@>!|uARB?F!U`tK-)8dU=)R^<}xUCkMMx&qfI~oJ>|DOGMZ4xC@t8Ir)8R*EkX?&$m#97eXsp8Jb!e(X9RrcNK4+5gU6kI_}WLaS=?#uh{xHxUZ}a2(pp~r7LPl`X}Y-f zk(YMi9%XQpyg7ikfVX7*3W$@EA16iCkD`jh^Mdi7q#%}=I8?L`kBg{y>&SBy6f9hd z$F)8liduLmRA^a`$LSsSSsh*7*;aZNk5j+Oj1AwM6_TPQk5iQK40uZcZ%yk(kf#WF zqmchf-#lK>i$E`u_3NnmB~)>E|DfH<_qasUrOc}dkGtGeeW8^1s$GxdJmt4hYe{~I z{THnc{CKU4Uo1{&*q^(DBtF3BQIiv&)pGvZOJ(>f^5y{lMS=eUdJ*VFGo}}*ZvT9) zR41Mjegw}m6>FUh*rM~-7Yp&YN{7Dtdi)NJ7?N{WWW~E%UakcnEpOq++qLJ4I5W7j zAgfUxrzqnY@D}ivtX~0o(QMF*R=9E3U1&+s+e{MY!%Y+v53-XN7fbLwv+UZu^rAcQ zM66$@x>t;3#=>0BQ_NMF{q11-}-K# z7lB?R>(^1$fvDo}{y}(3-QlMiqUF`0c$|7xQ<8!G>Y-{99mu@zpm&q_#NtSjbC-j` z1Kq;;!ua)1@$)ho&-Qa0dishI<@pxMcn1E90{;c{BG8LwOfPc#a-V5fQN2l2hUX8C z>)qIm&uy;pM0i}fMhHt0nU2j^Q}{#MhJ?S$tKQ~vdubfN#Y@?&`1gBqqs(!z{oS4r|?e^@bg z`IOPFn9vLO@orm1eTg-8sF%Ev$0^Eq2D}Bl1-v!e@@OweEy~5w+lQnvc>b98{uYaO zv*&tm1s)gLyLbPm+{=fzC*pCtc6kMeQw0ZZYvXZ)x{(X6<94lG@@&H*!9m6WdA@}*o`L_Oz<&Xq8+7g& z)45On7`;5n=5WHgG$ z#in}Q6P$g$;o}E9u0phJ_r=4J!@(rF(%z`1-lsu!p{fv9@L#Ow|NpB_KlB@gzNygv zmA-v!K`#QmNY<~TssmBQ;r)mUUaNWyovH;FNb<~#1qmyb+>ksQUXCBnoY9+G=V&M1 zaRQI~VgHdZ^C4Dc)OI{h-QkC_-cl{5U8TG;kusjaxeLx+vg;GhU9;ibRhD~Jz4df# z{uqf4RM`5EmGf@5x|uDWXIAvtYUr8=-a0^%-^O`$w5k7`(?CDTymh8;3rbYYwmXL? zgQMil0lWpg1-v!e;)?>GcU@Waczbv#NgqbLF3)Q(wcg(eBdKqqr|O=)PhTKMzOCh8DDO<9jAwA}f^(Pb`UJgbHt0nSsqS|oxe>ctNa|hh^Dh{_ z#ogg?o+Qs~Ih$+6d{=+%(^1$fvDo}{((!}t?aCRF>f`=`RBMrio@b&)S?fZ{7im5^+zPj z1%C{0^~H>ewAZArWRv8*>ghBVo@wi9KYTPvAl844 z=MRQWtOci;lbg8%kGmV~Ww3U{b4MMCAGNF4apR*w16MAIpXcWif8l~joo~9oGB`@! z9Kc%&cxzfOvN@Pg+|)fX3~@FPXG7;W8@lSIpcjE&Bb&y_whK}D+|x$*I+!$kw-G$au6N*ac5bae{qPTX z+~qQ!WK+Cd!Tl6G&Z5#c^R>UN#-=zi)MpfR9MdQ%swBjdgcb6 zKhiEPNn(yPhy^75jtq65Bn2Jd_rEp6kGHMnQGwZ|`eOqt@Hl3r$!X0W4`~EKy~x>? zj|To0_**mPZ-wd3D=T&hP7Lb8^T$h5gB#&SMy|plJdWqkwDC*6l}XW7JkGh&$I$dG zM=x^(kL&r^;$yvW!TZe&dA^V`o`Jumz~7qIxrau2noAQ8ZDnd}8CbeUZQ^n!^gZQ+N$ol3L*X%CfagjyYAC8`IY;zyQr==1@gaV^A;XUg=I4kcM#XsCfabMrB?ccqJiVX{j*>SA@RkDJn%0W~99HWx7Mr<* zWLCC+mVR!p%!K$rh!2FkYP#sApcjE&B|wB*C)Z%0gqE#onm%r z^V-XHB=L?X_@W|pJ5HzxNj=!?A1pFWEMK|h8{+3}c+7E%7PaSbCGva=Wjq7_MS=eU zdJ*VFGo}~46s=0kSj}1CbqCKMep#!S;l63%LwoSJy`Sulb53pcl#s+1mAUR;n&s%~ zQg{|W-YzRE!^|<)Pc3(q!BO(&0Nw)LlJzSY8eKoT7|pz*`D(9I_AVf~pYk4k&14tV81g^h$Kwi8EkxJYnLI~4 zj=#KlWol;Neb-E7_$u<|0RKgS{{ngu=tVQ87mY60>*bwkmufrV`NORA-th5bIg$_( zeP`iY?UU(zYoq-g`0>_zJgQK;ZDz>Mz~dbJO=DK11ZAy!ERR!^@eFticuUr=0KI57 z=tV07&y*i!R4lOBiRX{&y>%QXBXLs9H#|=4>9xo&&+N*b7(6Z@YgG=rSEJOPB)`r3 zbj_G++WD3+u`)PH-WufaZe;P}2KJ(LmYp}OS+b7BwKi>Nj zjCOrd|88M}Jl{eY&%l3C;J<)g1bWeo=|#Y*j8O&=rnKO{H9*=vP zd;WN`#?i=iBZ+BdUzE$l6~)k_ZH$K$>q-Vkx?-k4Vc z9w$lfboz8@$2k}1>p0tZYg#W#IA~)6`B#vCMVI_5h^MO<2BiZK9|-Y*3|-KHQ5|@$uMg0<@#m1) zuJ8QO-yhZU6jdDFk9hY!R+M6?p~0@g<2ri^N%a zXg$2EBL7JlemvIw10iiarpNmrzG$}H(?eV&RzLZpd11DXN0pDL;_$rSbV)zT>!F%| zCds|qm%y@R+7-vVmXMsMhPDN@j+F)R3uE!~-uBVY`g*@Ic$E~7yLxXoSJm3Ld!?~5 z&RFv1fOD6Ea~JRy@YbY|HpxU&zf3LWz{$_#*HeE)vTOX0;Vq$O>Xy6+$F>xa?AX7( z-;YQ*ecb6#Q1PPuc$}%=jCKp_;zcG&o<eJKG<(UhBU>QaAVPj`(FJUc1!NS@JkV z8P9;X6!6xxUi4-_Iw-2j33D^oXXvbi_&|scgnD}!!A_=hskaAu5$Hv-_kdLW5~?`7 zzp=%zPVGVW(_*h0JWlI^`|8Lm;-8je<8f(Au!{a0W0;Z4z_JJa9c`6I&oQ4-HOs=8?f9+%UvDQ12C+BZU?D^*$V`C-|p-IB-Q`0+lA zU53`@59o0i@;F5q&w#fS@Yb|mbmNrA`lVXhCN>8XikrGehPz%A#zCA7#MyY9qF0;^ zU3F8?i)QEfXQuA+sh+2(;_&`~p>LR7gzBm7Op<=n>Xt0Ktr|xUKRS&c&)LIn2jgV( zf%rFgoRu&}>~l+fgiA87dqHJDMw^@HWV|wb6?t=j|DwQufpZs}yJqa%<;r%p>tagI z-yrGpA^O1CZkO)*?8sU?A06LZ-Nd|>$^9b2<4$aPyDlQ}Si*La`q}A{it|C7q-}Qg z@;F5q&w#gpw`A|3X3C$L?ekLgqp0HW{IOT8ug!O5hDu5D(H^bHbql5$Hv-ejQc6geng2A4oWFPCr`G_@&zrkGu2XTlk}}c|E-(aYI6@ zB8?+YJPf=a;KvKt&@nHICBA#=Bp$ct!%6JC;ivs@z^diuUW=t>2 zUmEWoT5jXDD+13S#VM&#@o8Cny;FGH+5XTc_pbP9emj82ecCHSA@D}ivtY0zPb(@*`{;2v=tKP2-dJo@wl~u*N4&;zBTn}lE*2^cm}+sfVZag zBFMjj{3|-;UqL+GYF)-+GnbIe%J$FF&+VWWfnFr**HQILsN(Scf%-zv%?EFn9w_j} zVPzQEjZZN@ygEmE`DBDW+UUwZkAEwQDyil z^5y{lMS=eUdJ*VFGo}|M54--LvwNZAgC}_Y(CfLr$@D%me$y}>clq$8L#D;rdnH+T z+?lSuw@y^%IPW6KZ+q%w@6a%2$P+lq;}m5)1KtAOlJzTQN{^ZC^HTMrsN(SaQGWM| zrenBfqd7^R*@Wizp*Kf4g~Dk3czddsxf^;r?#?8M=Qi1N$zl}Elb(hnJ2O`vrzqnY@RkDJn%221Geca=7DL`B@A0G%6jZdt#M>UoMP4(}g4F~~PIv=Kh@F2dtZKdn3BmofS&G6#PT|BewD*i21m)819(dTZxMO4 z+RUwo5=)zVMj$>A;scErDayBm_}RI+K0q%5y-3!tqw1GX#o_&f=+Ub9YUx;gP&pn~ zs`cg5{gCc?5^FrJLhD&nQ@C&YVqZM&Ou^2!*e@GiTq3#m=j5-Q|Mo#m!>Lp9d<$hf z1OG*V{{ngu=tVQ87qy=qKI~{Iyv8NTXH}1NNjA=Kw96^R^HI$8ij(WNOC@O}b%~O$ zSNT;H$Dj#~Sgq(4Bdk;l8G_7$aK zi07VdeUYa1qQVzl!z0~I#R&&(OtiI@u7@}qh_mSvmZtA6M=tZCx$@+Cv z{SvA;ydSZ)-XMSQ@)^_HB>8CEk1w51A3eZ)Nm5_-gVcW`pBvj3PLj9Q7G3lubd~xN zW;Oo%W5uaywpd*}SQResOr(rwaPES0m+bnS?dPAF`u?c$5mg+X7kCLr?lKMUr@9v4 zalK2$#i{`et4@;oMd`NDO;Pj0awLuT@luXC-__yr#Hm~HxZ~=gfU_UHKZ*R5!BO(& z0Nw)L0^XW!`Do5By>1GUo^iQiJb$chQ}6Te$mTu0hsQLLR3m;~DUl0^XX|i(2`~{`M<%7*L-b`dUuZ;hO9DS9H~d z6s>d6i$E`u_3Nmfr>Nra{=v;ld~UI-=GT4i@i_G)o!r=qckc|6)Fo;XnjU{`c(=Zr zB;MMl_4KWvth-Hj2k`Sov{ZW^c=IHI6{ieeMcy3XzbNouAifCVizbO{l8L5%nOe+& zlb^}2r~Zg!*Z3d9Tb%3ROa1*FPak|OJNDR=p{k;yGXB-#@sEF-KwLjhSoHZi9(ON- zVI6R#>dLVNc-+VQ-0&BxTGI}+;c*vgKiiBIsg~P-&OO`i>4CR^w`PpDj%e3>IA>sK zu{j3MA6xw$Hus8KGd7XvK-n(gN0ZebMrD)ePu2DFZePjZX6zK<=j9u|`6AdE(|T52 zo-d?~XW(xs@VBP*B0YwlsZ(%<0Q%kaG?ykG+RD_{GO%=y$c6l?xtV_j@pRHbQB_Wu zo4GziXQjPA=tZCx&75Au(u@$XuUot(yIzz~r8m^EydLjwNPe_d(_}syx@dsM zz0yoq4J`B8UT25LC1k%@U=^G7=A5B2d=+_ffd8Vve}QusoV#Z1++|wN)hm1zWzoA2 z&mSJKWp)eFKZ>iFc$`<8T2AQNxYUFzc-+FAFD0)X^j7tf^pnhpRqr+1d3wWHqx7~%d zO)HWX4B~OTJGoz3x|LhnHSoBoy(dB*h~A#hSfC7!k~atN7VsAE)@+N5Ouc#A!Y6%^ zWo8SWKh#6GQSrs$!q7N8?xrN|eqf3B?l-sbI1kq>b*@ujamyV%E}=vsZunX-dUiap zV7sd7{*n@&g@sTk^z`)n>tFw>jAy`G3V3T;=T7EB-YDdaMtfQtX)Q8ldB=ecjOxI1 zeSLt=4LY~1Uq|&kMHPql4{rRhRLwip-KBwx$Hg!1%MN!O`zj*o9~6|)S)9t(XS>$m z$Mb)rS6}SRC}+OHMZ&iv@s2M)j(#rH%d3j0!t+tlZISOAaqa0+l5>}Befu(QX=KitCV8Bq zjAy`Gz+19@#cbD`XX^W->PJz<;rT;@%~@_?U@Ek7#^X}0tk?(cnX1{H#^bJERA<^B zIJN8jB|J{zQXT$CTg!2^BOZ5R^TGDeA!aJ`CuMMyyg7ik6!6xxUexuXFwUC=_1RZD z1f-M;`=pZ2+S~|tO9RNabPLO=5)DcR-Uy(7!Q5RRpcjE&BiQG>OGwuKf3QFsoSwSsEpTi*!1&tef)S|y>#+_dh8eON)i`&_0i)ahKn1r zTB79n7Rq=A{)+oE;?>HHK=Jg#-m6TclN+wyfFE)w!+17-L3nbJjI-b>@3sT6I@5#)_RUrW%1MuzFCn}S{hdeO}JFXhiupMEnx z?_EohXU4JXz2VEvU-8un?{AbWOnR_WFUIUE8;{FP&>MRl+@Ric9FIHfxc6XvF;~+B z>VUwx3(j4W=@qk+FR7lVsN(Rvz+C(>&~=A#N#%1q?inXm?`}dy#6gmK^;?3?dK~ku zucG4d<3-%OU*vFb|B`Ja{n1jpwOEB}FKw#h<(-L?@eIyg3eH`ibA!%3V>&l)djdOx zb8_2AD4u5w`#*J5q(s=6Zo%Wa;`{ae??baNYOe6y=Zoxe`e}Fj_P@eDh}^Q zY^e7<+Voj)wc;2a$BSo6yWVaUEEnT(WtUjoN~wC3I0uj0y{!M8;P|>l*&;kHh3Qj& zExmfJYLz_SLK)A%e^KDSz_|;~T{Cv>l00i*n1%_S8j|FrsY*D{+OpXp!}IVw)8P7J zTK?7T7e~|ZxT0f*8822l>|OQ&k2A|WGHg-D)nwZ!gQMil0lWpgC3_DwQ~u0spO>m1 zMHPqV1uL%Fmi3*9t?Od(IM);9@2i*Ik8r zKc0sg*EDD2T8o$hd7Pq*XTVzucxzfOg8VD!Yq?ZQ+r;J|^tGg;ZVGx4=tZ)A9aX=C zDh}@-h$MaCMne+LOOo@HTTpPO;A5a<^GW=8pI`Ee7OFNLk0+_WXyVv-gsmSe)g8u< zXVRB`LDHdSy%74NL3|O!7eRc{I9*KiYrN3g?d+`o(W_p7=MTowqz}&+Biu`S@wok& z^UiT<>)2@|`DiIEhjYDR=CwRJhaXRU-SCcwt1oOj5UY$cmb^LO+@;{$1v)qA+%u+g zw}`4cSgY1pnvnE6;XqyTerPLai}= zywR*e({vvHYA;EBHapwvsmEhlUlfz%e+)`e2bsB_&YoVXj5C(JIpEv{=PudxIaBAF z**-5-KB9`l^Niz_wYkoR`V*VA@VJ)}ah45t-Iif(JZ^7@TFXvG@4EhHc$`(z%U6u1 zll2^uyxcP{jl9lUh3zW7Bac&*@eFticnf%Iw)J)F^4Av68>^rHkb~!$52+nnKfY>H z-$GKKE&H?e!f&m*$qRDv6uT(CbSacy`c9#^kp{NZ+N^FbdYdA@}* zo`L_Oz<+`GB8V@VB(6y&n)+pGF;5l4p8R_1k4Scn|1rGv{5s#!A-TRS}Nr|Q7bb++eL?jzx?JO0C`t-?QU$>@>CDav>TyrqD* zru8D|+XsCu%@#9sp|2%9byLubKrfQ@>!|uARB?DeqEanaqWh|jf8-h-SCH^ENWalp zRZ@w^ExY{gUZqarp-XCbTzOr7@(y8>=3agpoh0eknltqzKXm#z<*KTzkpr@ zdeMyOMFwoAi0fwzBg!=J{2^)a-?{5-?&zLwJnr4452kSuT+@cvc-#vA_q_A*{vWnp z#N&#`1e$v1x*uO3k;f^@cm})$yd~>b%#U7+aNuuW!}A$~kZ{{Y`nHK{?k2#@PDh?ut{iF?})`e@J6d^D)f zu4Q299+6wyDUtRG%TodzR_ihrL!3?Fi>~33Zs=by*VhN=MW7eS`gK(O5~?`7fAFfQ zVoir5N5am;j-1(I*!nyc_AK`QuM@QKx+k`MN;R;b(wD0cGJMF>IKT+D0y=LZvk(~ z`V}*!BhU7Esrpe=ad`e{$zQ%v*wOmpElIzlQDJYotKn9!v0D6iyP{7I&(FBowBHDi z>j|o}cZw|tFMfl^=~Y~g%g!IZ_Q6^nrzqnY@D}hE@YZb8xh+}M?wO}|tdgw2^T+WO zQOvTY@<{9bc$`^oaYN2k_7-Q7`0zEyZeH1wsrN+tD1JPP;?R8`?OtyPEmH)cSEy*8JQ_1U4`UTg2j(EGX@r##lvx!xY=+@N#I`gK&#Q&e$y|G?_)W9!~C z>NQVp;&CO1HhuERC@eYLg~z2jJLoaA3)>Ep=-2))JP&jitCu|?sRP3Qp`gw+(v_do zE6=x3#xw9=6!-9`7$eE*oixu@mxPb1lYM;GGuK#<)LnaXp^00xH+L|I zq+aB$A|CV3;;xFpQ2e|)!#OuQ2UUxOd}VNyyg7ikfVX7*irKC=&(!xv)sLcz!}G$G zFSeXk-UgGS8}Yci4TA0Z{sMjw$^Beu{k8n^G9N1mNqqRl<3Cos$&M;6A@R$^TE+v> z3&K17cF5xtWjq7kQovi&dJ*J}YArHmdB;KCsB}9y6UE&7lB?R>(^2BOQ_=T zeo3LQMF;+1@-;Yo+)F+A>YU1?*~{J2k%r|>w&tFaY~z$fKJ z19;pP^VkE8)pl%ihB7!x-W>OzXvIp{^87s>i{RQ(dF zIJ|$bdEU_3+*>F0;yUp-sbS>3w$mH;9(TawZaylI>W=Imct8?w?Y-=52Y{pt|WYvVQ-U=rG8GlNq`?O9K-hW+>)#ej*>SA z@D}ivtY0zP<9uf7`=fgAMiqzWkFXG1@mdWo_J`?n z4Yecjxb<5@s;;c{*LjzU$K8C>f0gSUY*kexk5iQK40uZcZ%yk(2?uRVw6&J5hk7

fr)ssM8Pk^ntSLWTws+Fz==D&r~UX*}o5} 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 ^_#&NG4h5_;#C5Ig{Nxsv_uSL!feU!?cG zNZ0+4-~qbdo4|bu+?UY#zJ%Zb(1+-$4}mTOx)Ag+(Kdm2T6)LRLLBW>94+AwK>j84 zF@ZiN(8mP!Mc5ai?>l|_z7zfc)OD@Rg}PjDUqaXYkl+F6V*-6lppOakG5Njq&Y{jZ z)H%0wr*GYkxt5nf_ybU%mR|K~p)M`drIoEqOYi{f@36na{$AQl*Zq*-0f?uCc-qg> z&+T))4&Pk!=l>|)B6tAuOz53w0{JEM&MzT&0M3hWUX(pA!a0#%=R|@BppOakF@ZiN z@9XHg9}+yEsJ{W67oo2K^fj3K_oD<4z zkben%OrVbm^f7@t&S)KHsNW3ro9R@)neYdoE*I40qH|p?y4T|(c;NTeJBNB!P|s?j zo)z?kEsXPK887-AzXT7!{to*)?C&GPblndL9-wR8cBt2` zXA1R4=v#k;s5?UN0OXm_JI{o!@w5;}J0xz%kM<;Z0QN=L7o+oGU!?1PNbmsN?@i#o z1p2;D?2B~W4+$QC`=7aS|3g=u3-qo3TAyBm2cVA$^f7@xCiIPmAb5bTb=#p{JJf53 z`;rDR!2{681p1gj-*@`L_7gq?@i#o1p2=B3CmOHx*rle z@JH1@hPua4_Za#_{_XXNBzOSo)6%Ox?caKS9Ndrov3YR>4?rIi=wkwXOqz=6x*rle z0RBAq^We|_?fLV66mJFiMVe+TP*IuW0~HmOyuTm+F8?2>T{UmoUgO76 z8~?Ile5?wY_an5>{~oJ5{okkY76z#OvoZR9$qMxS@--;l-yF4dH=yr}S?K%ywkSU5 z2h?_PM&JL=4SoOnJt)3;A8NfZF|y z=y*9T=y-W;D4s1s?e9OJ?>Bd&@3;4%_(Tb6v%aA3|1yTY|LZ@a_^N+JZQlPz-#7Xd zeSg)T|1`CJrq_q`JJinm@6)#FNzVA2Ds0t1O|92yyw7|Tufag=b{*7C)JMl-8KdLb zGg17nt5LgZ9r`|RJ^FscCKSKQ7PY1J==*t2==&u*QM`{kYHRF6-*5Lu-xvF$_%wgi zwhuzz|1|`C|GRJ$-w=t~5izK}>MS~*G!Y%|=Zh%5BptPVve5T6a?$s7Z=!f{0cxj} zpzquB(f3^*p!n}9QM;iAeLtceeLwaEinnM+?Vp9{`z0Od`{nOYynh#J>-M3xcn}>g zO^S|}^9{wj{4;8Q_pj*t4gZF|-~8_=KK4(4M%JIjchmOtdi(hw|BS4+U%p5256>2wIqjszfI-Z3+Iv&dr#sA`h+U2{^ z_x<;x@AJG+ypbz&k01|&*PzZb{J}ZABn!-9F4x;9*5!+&!aZ$BKrO>Y3TdE zUPkd%S5TXG1GS9`(DC|<(eb2rQG8xGYO^1q?|)x|zOPY-;@h92cH%4aeU=b?-@YBi z|JsS#RUgs!dA;cS5uZ`~su9$densEU`x$+|mpJ!;!;LTwit z)Mjr(Z662J_TPcpJU7&i*n`@!`%pX48@1DXQ9I`_YUc%@cF9rHE1-{qn9_l2mfQG(jK_fXrY9JNvh!r?iOl)UxeBkrKqi2hT29GV#oOZ3H@YMC2CvLpf;-xwe6pyw#!S@X1AiY&l}YC z7oj%qJ!(gEp>}L9YA1e1?X+Rk&KX7Ry#I;XC4WWj@_$9`s((Z6hJQ!xW|eWlY5WoK z=hyxh)E55(YWM#WYD-m7`{((n{fj1Q|Ei7J-z`Dy?+sB~!vwW;SE9C&DQd4WM{SGs zsLk4h+V(c6?XnHE*$$}fvjesL-B6pi2el*ip?0h{YA5=lcG_Xo&Iv&6yrZaHatyW0 zPoQ?yDb#L=LG9*v)NVhI+Tvu??oUN+=_Sv_z7e%uny2jl3%8q~&Hw-a literal 0 HcmV?d00001