From 289318beaa59c5cfe1f2f82185799f4dd6e89e84 Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 28 Mar 2018 09:40:24 +0200 Subject: [PATCH] NFM demod: removed UDP/RTP copy audio entirely --- doc/img/NFMdemod_plugin.png | Bin 22176 -> 21582 bytes doc/img/NFMdemod_plugin.xcf | Bin 92280 -> 86316 bytes plugins/channelrx/demodnfm/nfmdemod.cpp | 39 ----------- plugins/channelrx/demodnfm/nfmdemod.h | 2 - plugins/channelrx/demodnfm/nfmdemodgui.cpp | 16 ----- plugins/channelrx/demodnfm/nfmdemodgui.h | 2 - plugins/channelrx/demodnfm/nfmdemodgui.ui | 13 ---- .../channelrx/demodnfm/nfmdemodsettings.cpp | 3 - plugins/channelrx/demodnfm/nfmdemodsettings.h | 3 - plugins/channelrx/demodnfm/readme.md | 10 +-- sdrbase/resources/webapi/doc/html2/index.html | 11 +-- .../webapi/doc/swagger/include/NFMDemod.yaml | 6 -- .../api/swagger/include/NFMDemod.yaml | 6 -- swagger/sdrangel/code/html2/index.html | 11 +-- .../code/qt5/client/SWGNFMDemodSettings.cpp | 65 ------------------ .../code/qt5/client/SWGNFMDemodSettings.h | 18 ----- 16 files changed, 5 insertions(+), 200 deletions(-) diff --git a/doc/img/NFMdemod_plugin.png b/doc/img/NFMdemod_plugin.png index 4ff267df3afb6ccf47aa1278dee37b7f3b97f7e3..fbacd4b8b0ac963ce221825789fc65e6d7dc36ab 100644 GIT binary patch literal 21582 zcmbTe1yt2h7cU4R(jZdO7A=BO(gFg~-Q8V+bSMZ22#A1m3rKfKx3rX$bV+yD+xPqC zt$DNFtXVT73xx~!U+0{?e{~F!mlemsB*R2PLc)=F^I8!J2{{TrDbVl0D|58MMDWiY zLn-msNH>U&)cWj5cm>1$jfNu<5*7jC6B#K!@jkqW<|H8_inf44fkt=da>fq}ULti8 zRd*7xv#~L;bwUz(YhvJJV*J3x!pZ!BxP*+n+6P<`B%}vO60e1nT_-n_+_aTPFFI%0 zdW$j8eM@V;)MT%G%QB5$`5GI)qNov{6@ApFeQsKFnQyJ+$Xr(5{(|YMvO2Tc@EHTT zh3!Wy+xPSjST|YO8U;=7lj?s_37B_l)IC9U-0|wKS^c}3Jiy<>FOK{V|F+QGk8jhX zp5BEoUdzK@xA6(#FQMC_|M#y5A>Q$S`JMl~^53`qAMg5qeC5A~zx%)Z&i}6y{=dJ3 z|F0+f-=D&N@44rPHO<3@hK9FXs6s!!wRLm^r>bWbSDVNE;g6(Eu5sFvA(11x-JJW9 zY@@g4Hc<+N)01a?vX=CJp3>$8W|eMe>hxb1E*Oi6r8yG1oa!tI)L-|nstb+NU`Vw* zTl8XFtY@+qM{Uhzy~#B&h#6(sHXZk=t%=w#4lYXmWY)6ttSxg=cEIn}@2QWmr{|@` zK4c}N+q)#vwQogvKHU~7<|!q@^e$2hXR4>%t88pf;I*2Nj*O9su94w$?BdHc4p5N( zDtHz3@wa>{xd^_NusMB~R7`N-><8(^1aV7@{`xyFCBI>Cd^xn4+E$gzT z^W}ZpDKY+_Ph&ii*IB4j`){g>B||KfQB(T-n1-JIlQcP1gk_oU!bFZz+<+IQI!+s* z(c=3wi_XDQAMXyNv&>E2xte=3*hKQwuJ=wU$FVO>_>xh2U;KH$j!f{mg8Ds2(_+(i zPmV-_rtFT%2$tgKdfGW1j$WVl>XVAz|3NuGvP*qfT-fvum%iAJX*boMy&mQE{h}Po z;<4(RTdXMKc6>9Ov)A4o@w!-Zot_2-$mb|Vp`8LTZ>5XV_g7X^d^m%;e?>eFA&d+q z=lYgwoooA}jR_eJ^Sme8=UdNEPHu&;+U*aK7P%BFd>8)E`PuEu3HtUOXVM}$mO@5#Qo)-`Huw5u z@2hjbXuO<3-hE-qhDqVbh1pHJm~d&HnxD~k^MRAZ=KCnx$O1@-pDRe}9jKe|#F`I(sfnD;xNeGLdvPJZVxGI{jtI{P z9kVhcY?>6qX9_0h*hnyw7IB$dyH$}E_R4PY2Gc>Q8FQl80EO3O`@3GFH;1J3_W(ug zP*!#&c;Lhimv}}(*mH_)duE}x?7L2hlT|u4J|V9ot#wTHJD#;kgr^ONnq6*14)jl` zhd4YdW*Jp~Eb%<+c{tJo9=*hqCEh>P6lbR>#n_)XbY1eFQ+^v-NBe=Lt)|{E`-0k6 zo>HEkQ1qI`SJ5xd#Jbc%v+a3`r>`O*%6pQ}sK(@T>ZA*T7>OwE_uEr(18}b^m!;L1 zGsd+$e#`kPoL(M`1~2RT;m9!Pf|047v-k~-}QscGF(>o%15kEg| zeANt+r~EZ*mM%{(-KR&+X?<5Hr|T4%;Dg-zJDKGwD7*~QT%nZrv02+)H!ZMR)2Uhi7zYp*U*QFWonNpXHXq(PR)2G&o?5TKH%a(I=cwa%;);#* zfyo?~Q9)L+!;M+T#@*XiEOt+Wx&m;>e{UQe?#$kVEz7*?%*xUYilgdTZ}*n|9Q4p_ zO;OhQUsILU7_rsKWwk@Ofb-``rR;8{hv>p_Z)WRAS39X$Dp9=KKHZhOw=*ul`yZS?%c3F`{ zELUUsCF(OvK|uwE!(Q}m!#V0LO35ffcNsrv`k^W11;lW1($UY`+U66_65mcEi&AMH z=zQp_xa@f?{LwY{0s83s`w3DJeHfCfDJIfi;CsI>3Tcn%M?c_F^879_>b#dkPE0K3 z>UyeEQ#es(=6JNO@@K~2Fzx}mFM4n^tK*9Fty{MwooufsgtRIw+oKqi%xCJjH4DB; z#XKu{yDZt#(h`i*IyM#qWn}-i2wvPV4jKC=Sh;(e4b8|?Rd#gD%rbm((CDMqTeR%z z+v7Q`eyHTBmaJxGX72sbvO`W)&C~el#2|QeNHCl&C!Qw%J4=SVT+_y1XDsQX1Oh;` zcURlb-%3kMYs%grBNL&w2cZt=%LIz2s|+urV%6TEuu?#_c0h)2y?wl>=+ zxY!w$jfzoj=Q0eICIBh0hYig3g`^z;V z$G$uiaXlOq4+;;@b~{-4q0A_7eQFf>ue!RL)#}ev9+&N2xKDIU%ygHX8NQRhjxV{n zpL-lz!w)_y<~-ryiI35B?{b>t?jd&#+!z`9@KOVh%bs_IKy4$$a$^ z-`-wnqyTJEUq3&T4<9}(t*i{?Yp}g_G{F%Ox|@repo>St%^j!ba}}MKm?+%&_U+r# zqcJ@RSy|4hlNKzNFJHbieI{jtJ2pJqUp^&^*`(mKz7Hkh!J|jFl4Lu>1+U-KyC404 z(im5?m*R6h51+_$MUB@jot*MY=MkrnC+Y4wpMVH*5s0Jnz=;-o5)? zw}|f1Bj3$U>pgR!yHHm(p6b?(TXXmGZEkL=*SR{RUBO$PYL=rTv9Pe14kY&_ay!QI zxxE1FRBki%t?AVPks=>IKRivQvVY5I!)w3#`r5m?FbY&d%F4<#s?Tm_>)hCMb#*;q zOkt=>-fgG~+*~?3@g%ucAciQqeSf*fZLgig;qBX74<0}EV`(^D2y@=s+q;BGQ+IVd zm37PO;&|)w@?gNf|7dTIp}dIC-vcJv+S;0{heyKe&Z(&>Cq7=@1jL-S9AzZqwEi`e zDHZhTlm0+5|H7#617!>jLyS2X^aKtx6Em|iSR0Q-=i5p2o;-Mf)-l1Xx5kgGVuC6W^ZqYUc474J0#&ysk)16j^u+A+)ZFP{yTCXrq5mP_@R(deRF*wBV!Lw%}!X% zzuTRDH2PA+Jr4znN>g+5hlACD;Zz|Mv2dzBfH2SG(h!3vyk_t0yyAx^(A3)MH!`AJ zX+6=hJzd)J^FKdiI6Im3fd^b|{1NfJijb#g-Cq?1^N89Xu641i$%B&-G~5#^G2PF4 z4xFUeT~iXL-4a9f~;y%=39k>2G#8!rNrR8zK8v8Y+)!%vy)v;UGL_#IrLKv-rP8CtK z!l86z`MUCmpBg*9vv>cDE-CYbon85b&=0}@TuMnNr*gPrU&Tn*)9V23;V6Ng_1cxU z4|RL$b)9K1IB}+5A+Kp@T5|s|SD20dY|ZTRQAa#)n8ZqpXpi&2F)gkLOO4>go1Wfw z-GU`uY7#!n9Bx<647YVLGPz)k>9-ke)DDxU+z!KC^^5c&MEz7Ax3>OHD11 z_6>ei?Gt(vji*wXLns=i$1w|KHH0bZ#j&E9iZg?ij0>a2YuxTaM$h#mJ^FmE6BJFS zYNH2eD*kg6#9%B=NqXvcFl<|zPE1ThOUQ3-I+;|GXl+z6r^u~+C%k8!RaeI=C)?)z z3B9m-SM$)9m_JV;GN!Qi*wE^#a`}J(pRn1vy9X|!dH13&7|ZTo9V0#=FE1|?pl)L| zRgaPi@2UOss0ZVcZVX=ZnXe2s-#iP^(b#JLb8geKp)?foXdF|8g)WE%qVl)%vK`F+J*V3CAmm#Yk)+VZ^kb%O$~1aJkK{?HV6&aAnDaVE`CC_E z{(mp#h+$0>U$X6Q#!4eUIa%eg-~2HC-RlH&%)#u3#*aVRe#DcVy~6w&jz{fvh!5*Q zzb~HS@^mqr#yygGfZT#g?#Q}r*A{2jzGPL{nlZ&DWa+iCVrHAp;GV!p?lbDJ`jj8l z?8#b}W0W>N=XNfa{7IOUJ6vYeq!XHXGIka=2TD|0Y3}>$c}0e1W}T%bJ&Xdoj)4zc zIT9yO7`U2>X!uS@*|%`z8d!X9HRbEFbt z!^B5e-cps~j|s+!$&8$BD^=~B!#FalzE_GWOuAw%tgm+`^LyNXVT@i#IZcx%BQHP_|pB5KC-eiiaBCO(D?dd z9plsx`)Tm4BBTxT_8g4_DM~Vx`89xUjL1p#Bdo=gZV_?N=($YC#L(WYp!KDgsO2f zLz64B-S>**1q9BP2%sCg9#5E&a=(4T>%7TIkN_wpYHm(H*>wQ}YA|4%L76RRhSt+R zqq9@I<0T?#2cbM>$))HPT0xV(4>j1NH}?5RfmVzxC9jHh3!4&-&tkt;yVno=jJi9x z6u+QdOSrne1ZZ#@6&0Bku#EfRKcSdsI`?^*sOM7yl$F<%vw ziWH4$C1Ukx4r!51`9{&ql(M?*8$;W$KHpkcXz2(gXUeW=4_=$8=S@ydmQH+$U-0L* zr~AQ*%<$fGqYnFjzaRc7((~yo=Cqr!KECLr_E}nv(W`Xze)S5;akW3wVX=ck&^xiZ z`sL7YpH-1&0daw95A<9NT-=U~i8s|6LP6B}gtZxh5;)7Y5p<8Br)R*!admS;X7#!D zL`;G1XeQDZ#=j`77~TA3(r`rgIOXQq5OLSG=di2T6ewN49dR4SzpWB5%`_76c!D`@?yo`pvbc z1#ucyeI%4S*mI+5dNhDJl6YPIR8LB5{3$@pCoGa@PhP%^-D$W8!=njZ)-YEJ_z^(Szmu?}<#8|{n=jNLI4%dbQ;f@LJ-#35$R8CHg%KOw{ z!M06Bx}}y673BtN?D0eM67=rrx10dWgoTBFo3m5!yGM0WdE{HinWP1Yq$&R`iKD%7 z;40-zmiou^l< zj|}T*adV=KLsou$G*3L7ihsPqisb72Xt8S6+h{Odw7Rx7Aqw*@ zP0GFhJnoRvIJ-4?{!1i-jIN8Hkl&pWvjHk471z!%N|<&L2#7vnu;#?$#MAmOnK?XTIVfERaIgV7F}bQ z#YmUOQ+A)pxx#>Jq+DH`L`FxqH~XQz9Z)>V*b=qatq~kNG zc7tclFUPvNx=$e?Y|+fGA~q(MaPko->TET|Y|hB<^iY%g#r!;p{$Ix58}lJ%56+`T z|57Iq69Qg6Ki=vow-}bbz@_5*1%TXqFx|gBtmZ3vH{C#0W?W<5#NO=8w(0pzPijd1 ztWV9a7RgA1`;^PpMN1c6F{j?MG)=`~pLFr!KPO5825Y-GY(+LUwwmy|L zyPB%_B`J^XC?skrzUZ&?V#|?o{OQlwBqQcE=1?0UD33Jv?%nIX4T}c_4Gpc#n^0U_ z{M%Cv#mAP9)rxd8p&*!E^rr~Q!Si9BOyqSbRCYk{1t2T2fJPlIPaQ&5+dDgz0G5_{ zy;~o7C?L@A>tJ|zc%s~bz-BefzZ6q)mSMM7@%P$XLeTDsY2Hsk&grGm3~{`n;bFk` zO*1o8@F))5`O$DG=qn2jWPQ_z*G`vC(6b885-hB)SEl$C{vEmx@4(llCwuB;2M1Gn z4F>9;a~onZCb*CIlY*qWpD^)`rQ29k1qW9t@SBmja+lfI;#CfK#BLo>W$75Xkc~Q; zUepDy&Cb-0jO8OaxqFq2X{)R;7uZ}EJl*@|FW_~~3cc5~KT*Qgwom7W)y_;kkdomd zJwatgB0n^|j`ntc;0H*>COyRGM;qdiv@(dM+42zsisfHrUbnO57>kh~_(;$p4fht> z5wtk*r9+FdEukoIP~ZjP)Lw*0K0ZFs6cql|)t$|2>*%;G1kv>hXwmC9_Dof^8*fS3 z?~>=$lBnp3Fj)RvxxDCpj?$!=4r1ub&B*7(uz*<)h;;m!rd(tHKHbQ{@AW= z;x1*R^`*2;ix@$HLqb9{4z^etFI#|T>15odVPFU%Wi#FFAh%;R>!(OhPmdMw;*pRD zFgyG=n31nh7GTozZGLmJch=_yK|Q69GsMGJPWKjJ{lpox2F$OlbU;C}R%L?vWfs8_ zdvmqp6UXntY1HxgA+TzYG0T3txy{yo&(3y)TK&x$(>K6RD&;rb?10tk$JIu5>od1e zEJcFvU3sOkz=8t5d))$T-^z0~uSMv1ePeZBM?dS=Nyhkz5xuaXdyti~hPuLJ$&q65-r{y)*Mg#LV_y z%2)sJKms{|kuSXz%(Gkd=Fy17G`~UbRp%ey#~v>%!;1vHr;hnwQGI~^13tdQ>}2=u zg*_Z{&SJRNN8!sPA!i4xG3yzFKYq~DO2^9QdfY#0dTnl=aFVu;+Ac}wTdq7zzaF~Z z)~;2z_pZ9Vs_)XS(e38ua+PMp88g`vAP2Q=+nG9!QX^kSbb^ITd7sOOYyLm3>F$uR zOH52E7ISi<7)jI0ZxQ@t^XuPfAM?iS9t7o2dWYqyCeHkaq%0EM)}m)JIX_p_&k16m^R{pxutmugb-`M1^);%q$ zD0W?cK26^dc}bxV-2hQt#ut1{_oDU*zZz;?As~He+c$lt%Hj?Z zTiuo{m4EECbW`r#)?#2`(v$C)koDKKq&L(e6`(<{RMeHEmSp&quvGBW*`(q>1f)m~ zW5xWE_nyt-TA9jgdC3XBhcdc`T7v>Kgiq~xfgwI1edudA1q}UbLLPnO|H&zQf%FaM z_FaESJaK+ZQ+rr8YCOL2Mqq>$2rTvx60 zTEn7eo;Y+Y*{MAzSvG6&R@^^!_w1V{bW#6x{rcm;@o<_wD68VXkUHKqiO+NJ)PnIy zqu5zHqjeW6#|_oKXr$juTQPpJcdgmB&(?*&!ilV&Rj?_`@?uF@wN-0o0X)U zgblO5TD+?jkL~k$V8&y7LKYO5r<2m|##agm&(D$`m2~}(ypX$d3Bi;pwnN*~bn}fr zR@_AzP8lkGCwMzBC{>+kOIz;uv$>Bib3m62SVPYFo;4Ye`X(~wzkGTDJ=}@r=}<*W zOGr=eo1O(*9U0h*eW z_nYK5$x#ml5m@<7= zqqH+K2Z9EhS?OCG zmJ>8N*`9u?QTh>9Xs}(wS;xx3A^@wp!y&1*wzl7yQX~Rbhe|(Pc4VEMokNc!ANBko zTYvnbTZ+}_bax)ef{JN##ryDZyihU@L+BafQ&VM#4sp1q^mxb{p!V=w6x{LL($dG; z+S-@?r=Q-TOJ1z(b}7GXpc=vz-uHf4hTo8gY7?(4n^@Fv&Zv|nom0uR2?#WrxH2h; z5+2erpf|Ruo2{zZdxV5-y>V&rs~j9csoCEKAx&3PuENUFR>U$je&x#L)ira6N$fEVz*Y<^WI zn#2cmHjQfghx)N%d;$W=%vzPjAe@n%nZlu1(lauEn!VT}2R8Hk`E$UMWv+XMP`#Q! zKe9b=+k=1L0$+nV>2-c+&>l>5xG{!@` zY@e#!^xwbZB}Qn#;KFGpz~VYjZ?Tvt&}=jL`O&0-~L;}Zu>VD?vj9nMBM%78T*1; z-l6F0*Y^8M65BPaR0(wx3=9m|_gR|^IqHo%!%Qg;ZEbBqN5v;03CzfN49Y0Yqetmt zOI>gYJ(*H5zbz}Aw*Qg>zbMqM0Y3eZkuey=!!oO}XF&COfxufzgG$*&C!NF--4nwy zMi18u5-;b@V^s|ihEHV~X*V^XzR;Nv z_#K{+^aUuvXCQwAv>A`9RKLm(I7zMYXb68Ok%fp9NYR3~mW5BcE*hZ$$t>`q6T;(|3Bzs7wWp0Xkde-?T6QbMj1j z24%yf0-r&8wLb|18@sKquV5Ta9BOT`p^$>p3+s1OAH0j2YVuf*NKbc1_x;JKspXP* z-t`_6T_&Z#)GCER`1x+bw1P`|<@Hy-2>2*b&9{8}ON(s$9pR&*rcCDDL!{V}^38cs zF|qVPbLm-v(~FB?fIPyp8sifa$N>!E=O;S@?I9!~*gLET<~Q9kd-1hV)IL6{Roz3* zD~F`RHwD{PG+bJDa}!dR4D9L{)mHcYGXNNa>fZwx3BVRMsM43fGE7%b&(HVA^a4hQ zA|oR)@bJul>Mf9haWX0)@0|ZWntZ+}@=Gi>mF@4$qphq$zs??Nab@MG2{iSyiAEnm zAkD-qaQ8p9eTN$J448sXpTt(awgrbv_+6SL?{Y0a-mGcNmItG=OH6*&;7Lv z-+v^dr{_26(uJQSK-R_PAtJufmjB5gsdZ=fjathi9j2$3v9b5#tIVHKJw_My|J_R$ zfZO+(Ak15%r04sT6HX>0qG|oqAnI(~Cj_}z{T0tL>VHl|_y|MQ?kKXB5nZ@K-*Dr; z0QaV_y?QQsa0PzipAa{$hlDwgu^lZFca8q|md&Jz>pX0A!> zZM^T$6N^D75z{M~H)uxx&5vkfMOgOmMJrO;Q4v(1ddCR^7u>Rf*| zr~a_etL!%g&Qt%Kv@Bu)T-=Wvevg{kZWu2tCWeFo%~=U3t>ToJ9}!mYy9+gouD(9e z?BR$AgEQ1lFmo~$gCsMB>8VYQZKQP2UDABMyJL1Q;rw>{sA8gM0(#%z#t~;qNBVfB z4LLA6ninq=B}tg>5}28pO_p2uL7l?%Pyclh8yD9F;-rL}9Ek!0Do58?K@Ss^C)p%k z;qM1Nr}Jp>oHm%RpbCQyU<4}^92aC(Sealo*q9!GCsX3QrO7r0ZrYvz%tAL zn#X55sJeea8=;TxHni%60*&~Fg8S`lcyNjuY=TBsgXyS% z5@?Z;k&zPl+`fv25IZb)N7uUGtDcwI@KeoiqYZdtCd}sTrmha8$c+{1kV3aSS|42m zfr^8-!Rx}A%KhKN;p3~5S&~v5Z0sj5UVJ^7Vbj)o{rWafQW&^M@%=Wl4gAoeSjt)W z`0B>VB(IsDKaT+J03fMZc-7V2eIITJyf1fJ*~B-7hL4Ksk2NFa!TA9>!Y?ooEs{>o z6c{Mq)!{JQYOb_Fv{{}7g3Oi}iI;0KBUDzWOYnGD52^s&%@X;PJ)w__i+jn#^EEM1 zd(%r=R<>hsFapNMiAN{YOXJO(H~RA}{@CQ4pYb1y+0VD2&Ul^ZxP_E53X$Fr{jEcv z63E?6J(y`RG%`Xo2PpDP2p?~%eA!2R-I zb5mMg{>wze`}auK;1b@$>W+9U4t6vR2S>&4lI`hQM>reU>#r>>88^m?vVlZ`09*CD z2Gie{ir>B1VNvXBWF$9?JsKX>cMvSv15}87he}PPz_}6zzu0;qjqIiU1G9l-ggXWz z7x6?})a>m3s)EUR0)O1g4cmysMC(bAsihl!46kihFHa9gMG=8vfZwJ1GGy!v=pInxB7RcZ(a`5H&wT@7=h~W0NVW zRAsBoV7 zo?-}5)WR>HI!_dB{5MNggmfk*~$(M58JxBSX&r(E`dG*)b!IWs=BZ0 zFgD!ib0ch+C=PQ8$^hf>c}P0I$GVdl55NmkhC=GoU}hTw5d0Vzc+kr>Ft@y{vffM* zJ#WXTL)*+^)trO-569oUjy7gnYDmUc;cE;VlAxgAh-HP$-y(7@TR^eOj0u_*mU}%c zjdTD0eS(6J;&nVhX|sQEuA)M>%iJk?K~7R>HHmXwi#6kQw=nsxP@1jL{d#oHdaS{0 zMw;Ln$JG}u+uBI|$^1QEX;wl;PqwCF0;zr$>^~L{TY`t|kC-noExD3Tz-&C&EE`By zX0(76(HTy?3IGshba#0Xdmo-l3(V1vA8(g=!4el0z;?UX51*8fl49GcB2;yN^*%p8 zF9ZYxtGKke4C2+6#j>nBm`+l&Q z_Ud;>F(7HzyGQRWc9N{+5pCI(kfDy)V#nuIxvZEY*WMeWJ?JkfD{JlV@2B0?0B(?j zO2f~eWR~o92M-VL4i1@9C+>-G!}Y7|Qk~8Dcg1V`Z|X2Zd0VSlnyR?5lW|f)f2{eY zzb9$%A4fl3T$Bu1M(By)_Lf^ud_~0~hM{Q(Kq}J-YOOx)3+VKwm9UE1XJ(S&dP|MF z?j^ggGZgAI_Jdgid?4FmI15%40!g-aZe{!hZt{4Q zT}t04j3!W{V107n*dp*ZSRJOm`yizvc!<)0nvh<>Q=fx^f{&X{_5)n>ui|jDpS{Bo zO_Lv&&aSJk_sX#WnGXX4Nvn+2?FY>_Y{|L!rH-dtaO&&(Wb@bUn4T2@vT z7u4x=cvhh8+wU!iB85>4%0eZ8tj!r^f`jDn(!1quA|B^W^T}11AzPCbHIThYvj@Fc zNKEVw@VJE$29Z9N2M?N@3Nwo(_rLu#?IWX=OSV35iFVef{9KWL`e%pV3=ffoOOx5p^=o5T7RNROuP*Pdyc5mSc zoIVf_qo`Rtlgzva#_EVA2gFr6dwN2k43wFEg1|vS#k-W34!%Gb6TW|c@=UKmJC{sS zS4nt=JXNzmEN?V@)RNnN4ha%5>7eX_KIx0_x`1WJp3805?g&6Y3DNrjgM;7}3Dy2C z5s^QjaDMm0Ip`QbqqMN|zGsw54w-t=HP^k{AckhM62j8(fQ~K@MyF7dL>7McRhm4j z`=NPhS((fQq7Ulpr%K4@cF&d`S-z6Fwv%>rbcB`4RFPU;Q!_elr$FVlg#Y#HS41=k z%H<05%4O&d#21CZ`$u?8xr$W!);z<1%Y*B3CVBEE_X@@1K$-`m3&aKCp#Bt)34N}P zNWjxUWI>h?t&Qn^OKa=i?(Q5&j9Fe#J36PQ>!p)=AB%m~2Lu6)UL;tmDU=oPS0rzCz{)(r^D}8-0Q>=W4g?VB|n%2j$zr(UHly zJUJnOJSQjT<;#~N<971^G( zkWx&iPA{@L6wHrzQL098MK|8wt#UuTN*d~0ewQ8J_1lg0@TNEH;{5!DMSn=$;-wGL zsegXud5#)r&jx>Dj6x7DCJGvEl+AiH8g0DkNkzbgh0U0fg0Y!dhH9S0(02@2NW_g% za#B)@ptT^fFK^fsWM~^%YBsMwj=W>r*4EXGcV1S-uA3sY6^*H`EAOK%B9oO#b{8!! zL^ zr4VI4;_a@~TwCS9UGAaROOOaZOhXrD_%|-y+9vc|<(|t@5Rxs&j~X|h0l}Pd>u3|L zAk6oL1!boke>lGyDfzw_S>w`n43o%F`&KnOzH<4lzGhT6#mXu6?{~8Pt9Qfqr#1rm zGV`<&ti7jA$Sq13ge+FweVvi%mb#cw@-kX$?ya+sDqyxe)&YeNRR`C-J}m!l@Yza- zP$n!>UqzWtQ!*aH!M1NiCgOiYr|k6Y%@adf`86FlA){Yx1AI*5sut}ivDCFZ6YE&E z;*~10O zPuaIhJgtNKX!>>0*uJ?GNfaXo0|wFX-R;elt_)_K(}z!$UR1w)KC7B!H8LnF;Gv?T ztC|O*A}e}f6YZ`pWty4zhVx6Pc#x};&l{zWmIOB+JXiCIfGXyVQ_jblw=)yJ8~-bI z$yG5hy!9pd>-&Uk76#Ha&UF`#tD3Tg{ZdT~N&EY~7o`g=30!O2Ch|FK%9$U#1h3A|&gNHF#X(EthO`3&oS)Frc9h3{eeh{k;yjO6_2KYVeDjS!0D0|$ z#k&;hD1Q0+K}%p4e_rm1i5bsHSh}_9$gUO#UY6*S+A#}R_BwjXX zI%MqT`jaf^Cd|@SrL&{uhgCn(ILUgtdt2>IA4^lCNHU!@HFTpc?@`%1F=OwbyyI^g zM5eMt)A|-AxJe`RE%uMVfE--nM2(}FKeIuuV$LoU$S%5+*V)5yGv3OK(H0h?d}w1E zN5;m+2;l}o?Ry6YB6*`<6Rh0MiJ)*H#86*f-IkkZz}VXvvxU_rVFwpF&~TwI*6Z4> zI5I|KfzMeW;_5yO;yt3&0#A8CsUJL(XB@2C3JVuDcHqAy@EWi|l=v zCC+;e{zgZEABg~_ckkV6F$(8bwHPq0H4P};moU;;)5l}p`5;=kuJV&2d$s@Mb-}4O0eu^rk|zoz;O-FzEmC%mRBEoG*K;0rTG|_~YCmR8 zOikl4`z{+y&CJB5rLiHDLxuPp92{I)T8bLq34RRmPp(*@n$yG4d_T9QhjI8-m9I~6f*@vsISnp6Ak3h z%c(HJbZ~r50$NTV?%H3FJ)>t4#Mmy}-7&e(gVO(6$Qk#e_^Y|7{Xn0&CS>55CdVrp zd8*9r$D3WSs*oVZD!`uu!a#r0>rh_>3@w1q9623|I$Y zk-nDr{J+GPfi8mM+8T(L@W(=po)D2nNKJi!NHhLU6M-`}PfXPGI#jy3-oLqRx1>F8 zyS=gZ`ixpTvt`Mprl!WUA=+oY5|#{Pb`e4b zMyR!p6<~K8gghbg>I)H0@3UnR(4E)7$@D+VOTWFwvg4?xczx1%gHKGXYD}OhDiAWg z!*xk{;bVXP$awkwwE)*x^(-dU9wSi{@-()O;FSK|ufensg@s@ZKBQ14$Fk+90r-mn zwUf;J3f=7ON-yahkVN2m+%^iT%qL1sf)?$aoW3Kn)}xk&hK8_?fYL7j#Rf$lKn92! z!lQQex^j?sfM8G-<8IQ-7r~27Hs_t0K9DnCI{mv#@=Tk4zYdTU0V%1)IVCA+P*IUx z4d!dD1@OGv+S{Llw+m`~a6&@D#2(Po=YZbfw>zOytN|#hS#T^^4D~4syClEY7T2m} zu7vEHu9ySR+bse$3yNBr{Fkp^h2a7!EJs@=CgKtkDPRmg=oYa=&uXMwjTJ&h+Yh)g zKv_KR>oc>+8=acB{+~Z%vr)q&a_~RfNE*`Hb#Y6s-PdQZF(JMCg^RUd&J)|Mv9`Q$ z-ghWJZGK1ZrfF#HOErn&acki~s@7C+kP*}>zWra1;c>*z+~2pP18V>>3xVKjfMD7h zL_h~*Mm%CGwVfjcq|~q9z6DfOaY1pRgQ*8N8lm;Nf5B312HXl2S*SqO$jmHIIIVi| zZ4HntPFPe%5b6FH5TMC73wH%mV0Z`8v#-9n^gRY(Orq=h0hp?3Z>*5K{9TyKonvET zPv{ZRZ%)o{aCZ%trJhDFcQ*EJE8I{#VA5&Lj6`#ITi~}-zwBtAIfSdHrx$5Q^iDyj!TjQ3M$D94$G_f5}%kkl;& zVxI~o+N(3YImU$=CcJM$S&A_Y)XU?ft+RHkr022}BLR)GmnjB5C@HYW3oEdF%=oaB zl5gR0wKj;?HZ`!=s_k{R0`d729=;kOPSp%s6kvsy8g=3#LGY#8?I24dnhWr*p^{>R zik<&0SmmHIk&==kl7Z4tKM|zK^VI$Y8yi;r!)20K7k+I&MvJ!0hRS zAk)9!Y5&&FAU=|#lJ{+`DkKE!{RFv@4BfM5VW71=hl5c0Tsk=MP&%&kBBz2C2$M2y z)Vy0HAu!NkWtUjwAX`LZ<|u4?^lCFjh5EF-w$`jM|WMu6hy?Y zJXqAE`Jl-gL1RI9KqDl`i1Px^=o8a{85bWG^AUOsByr?(l+7zNL5?y93=YZE2OJ!u z>>r;G1i{ctHayMs%{yFhP&JwAJ46ZrB z$)P5Ddwa86kAH!3n>K3Mv+P2%*BL^>G6c1*EHfp6)218rX{KI1tgKlGlAoTs&UhZk zfPLEoRLB19+uYsN!g6&d;{8*4#a?OYZ@MoTut@}1IQQrc8TBbP(_iFNteKj-LFmp^*KnuYYOgI6R8`FXWzuy<<*r z#Dp59WMmME=7_f%g`B|I6PbAS=F!n;nDT5ELr;W7M352cHF&CsuqNcMz~K7~dkG-l zU&QLe9P17I1yVMlvf03TLgCR604dijcy{2Z7H?_?potLE-y+sow=X+ArCsnQK!C+> zqg6hetL_?uZ@j~PbGAq2##&{q6XRhvj?MevmI@6cj`D?gE?~$Oqq#)Q&CRBE+;(+) zcM!_9kdP2y*HZoFTVTyAEfiO1GJ}u?A)Z#{ihe<9?jlB=;`4&B4cO)J=*5eBp<+hI zS!&7@1AGVApeTUZ-~gHnRJvv;uE@KGhf8s0$@2#Tg5r6jrH-qzh&>&!^cC_(0buR* zam{}EdcSL9M-#R?KuGmdolMYz9oQw^k>;;4nnWY3!M@U7Ck*^Mu8xK2L%Of&Nili)DoYZhd@Q#jw{8W zQGtgY_uMFep&@uz%?p2RKuUb(TcfJt;M%}IFcFh<-vE>q1GsT8HbcQu)Rdk&xMJ#v z8D)&+YuUXCYvs_EZfu+|U}+_%FhG-DEqMYk^!7I@A5vfKnmBESx9R3*QAJn@v#i5iG*khG5zDRWT)K=q` zqW~8+Nkdh`d`1T`@|W))R2oO@g(e6vH(Z*AQLvMwOl2h2SRMV3NMr$mKwCtZy^W26 zP%L1^5TEIh-I@^O*OXxp0K^mGS&G(MfB`uBo3Ok6cQAzw8w zC^XarbZ~?$J~?xMr+2%RkP%Xc&7h0IStGxE(O*wgVvK%qQ2fAKE$k2sm;`9V5d4rv zxogdQ6)xxR*ZGhQYaw!u#7LuN`TaX>y=bX2RWz&yHtSI$uz4VI0dFz_jR;Wz0pcit zjt_O9tGipcKoz!^2}5Qe;Ra=a0SSp98S(!DaM{rc2+UZ253H}RkNTo231V;>E!iIL zhHN8DMVTz04dhnSf;Z$+s13{?=6SzCy@YriXd-Mf5pSXML7k9R@>-(1*_BKqQzV^b zjbiPM-*(ymJNim!ZFI2smy~FLSwVji*UzO6oYq)#2vkT*OGhkDM@wdoNau3f%1V~9 z4cR*%JmIHF6K-*WFL)p0aM5L+>flKGynDv76P$Xu>3X83zBw+9@>(rU3F^I*yUu)& z%jf=Nt~g_rA%$-@%v_lMl(hp{2!8&T&#R}=JwsQ{S&Xc<|9iUpw@VyNsH=)O(zEGH z1*nR}4^(oLIVaT2q}Gap_e&?ygVU8ppX7_Mh33aRQ*L;Ghw8-r@2KimcR_3x%PJ3M zz#lbVMH_`fO0v~kaW0D4mvWC%QA+bvsK|#jDoMn=8V;G{)l+uV72GrmEa`pqLzI`L z5E=x<_Mqep7VIq(yO%$+uJ+jOdyyG&L$bzlY0CZkHUw_?#A}kL++1!y{T1;OCqw4S zbs?x$tttMVk~1Q(l8%1rvf%oK(j`yoUeUPNki~TZ=}11`!MjY@A8)+1^NaW-DEi(p z$>dW`>fUs>6+QNW%ZPHp2SqyBvn9y^Xv8(Bn{gJqU1)mw)-~$f%zSRhr!0jI!p9n6zv&9E#clxIJt9< z8CG1@+4qTsN`$UMkLO!L@2G1C8ZV~?CjO-$`>FTcYnZU+OxS;pj55sQuLDT)d;5nk zqzBUJ8;e#}R>0$x(@y&K{Zv!^_O(|1JL8t>Av*Qj?U)o}96b5j6_lZkXTn+$V^`{p zJ2PaFfnZ%?TjOnU>&~BfWY^)I@s$q^jh-!|F)~}tzI4B0U_g~ zPF<2kX8Zoa!h$adU_N7IPq8px{b#FBd|TB&RAzTcoXnp*g+Bk*O9kuXe|!PaA$Pp6v~A1_4M~6Tt&bX z(+W=#laguxHcmKZtLA~{Y|7MiNFa9H55}mK&^nZk6boFyq z#qb6(3`rFN;x)}?KcV!UuvBg3v7&A9YShJ(R#lB$Xfd`EKfKDvYyJ&pG5)Ht z6<;^-C}sH}D*qmM@-P@v2=W8nPaKqb*WG3`?zcCWE8GX9( zYCXBGYf2>fX~jpXfmRZu2TNx7QA0yzW^xE$94t==Kg~f)@jU3`s)InzU!R*R(Mjv6 z%21aXH#8R)7hU%?8pJjgkSh?i6|8vJ7>oxB>2R(JQ^CLr;b?yF{(vY+UVWvePN_Y$wLn2gw@!FB zKS?%m%@Z5vCtK!yr&P3!sbFFcfnfs<2E?yU&(07gJa}<(fGuGsBqD2_pZ^pbf!&i6 z1e%4ej^GGo?G4?chZg7)=xOBhe#74eYVY4d8*5pczDteDh_-8k8(xpBBi8&Y95SLk zu#F>*(}oNr2!wxk3m~@Xfd4FWb$6%k0Jo&1B+Eqa9S$<8_K*q9F~(#5uk+f3s)%}ITT989}jT_ws-5wh=>+s01*a_ zd{>74_pTmBddsLk7XcIeM^CdyEJtGd&=L%T>Xfc?dazLuboUU1v8d0DG7F zY^`T7T_z@~=myC7-Pyy!!XQF6T7CltC_);7`-2AS;Nr3h*3cthP~!8wzf>y?DJl~ME@`9!Gu?R(ix$ZT%lVUL3@@&7A#M) z_u5?frK|6<3(-D$KwtbT7^~L9hwqiT4(eG&qd-xd*|*jC3ID6@gUwa9hJlka?*nMh z`)9S2lbVc-jK2HWG%X9JgM1k^whz#PYi_jC%J?t`a5BjLj9RpKv&WD7*T=S)xA`aJ z)va%AFwoQMLvoXylheIo?k!Ief>MFoGB`QOqdpoP7Z)^PP1X2{^oS%KC(CQ%C4lv_ zp1oOTVK<{+-Q6%WA0W*J{9(S-E$@>_$dDM$t^!p!&!b{0fI zako!I^vo2uj_wa{Oz*Oo%`@S(6!~D=UDx-^Z;J^F-;&KHsGSyAU%fatB>z1%)k7f1 z*9^EE@!xY;SXcntiHDf%;K)cDjJf?w3PM7{T?h>P9v*Hbx2tPz{3GXiG|(hg3yNW~ z_xW0L#>LQ(qVx7&?rKW~g@^&6PnQs4@#4EaT^zUOM54e&11yY{%UG1K+-HY(T1N1` zzg6|GGr@DLq&Dw^komV4lQK@<#0QV`6buG2TFtAcZF^1GY^$d7;+az0Wc=Dl^-X31_4{wH@4kD!-#wq_c|OnQeR*uL zSk5c+m$kK-Sy@?UD@Q(kdIxsjd`DjE^RQ3Q>xL|K+_xUydL27{8wH$RJYQe*!~^k7 z5jc>}b~!m(S#@chV-g4iv$bs+n8(#hpu{jLr|=ZRS3)aaf@lFQG8oi;9fKP@BYAnb zpYwEzh-AuMai?(Ba`8Rws9JK|_+KdB7&TPBVyzbEtB<6FAP7s>jkTr+y*E`23=|SO z@ne238ye(Nx?;Pj9kfukw#R`ynTbbUn|zw55&$#TponWV!^5007|a)1C=dYsg^@sd zbsnMfSC*IG7%O)L|8UZowy?4t5D=hb7@h&JOkeS{B7x>2pMP}{ zUTFj2$9$LtJxg0tbG4tHYf_q0+-MA~w+bc=%YO0MybzTX)ziy-8@0rFc6iHG_pg&s zh*;pEtqkdOvA3t5cb5107oPVANK#f#PB3syWfF;WcvkiJZ4E80w1k8MFc@rUd07>} zRs#bLRi3od7{3RaWpxv;cE|~3gbgwl19D*{yUymP``U;4!{fmM=i`Hs-OT+ z)@j^UQISd{D)Y$t&`<;-KMeq2JR%k#nNNUcgjXN~=Q}7a9|1a{=0=yOpI>ST7U;cr zwi=)%yIyy>cX058ni}=Nm@g!c`(wo#Luob(3WYrLRx-q7SyBD!X74-+sF!GK#`+TxBKoDp&8fbfXa?%c9$ADbiU^2IV zD)ecUO6?x=O;g-^e2^(I55Qv(BjEe*1aK&jofMUnB!ILmuCjDc2w;rVvQi>X3jl;d zlGBMmn_J-Z=8}!Q{Q@Agk;|iHAsCF4tE-i*t;jy`xC+nKy#Hw68pGFAwOcnJuiZ%k zwHl>;r?H!ycJ5Zr$DdX79q(D8WMroFzbN4fj8ES zjG}`)*r3)~US0-AH!OfG=lQxrBVdLz?8F+R%yMj(NPaF6(cAkkHN9>VU2Nn-o;h{; zbXi433)KK5wDqQz7cb)G=WisZq(pPMfV^p;`R}~N?Y9fBoeOG_RL{tl7_@KuuyN9% z@~he_?is{v|EKYr$CfWZA#G97HrbE!-}Al5cE47u{wseMg$uCbUQkl|`ufg-RKasc zf_DQU0Bcs4UmXw`&odRgr}d&SXp@lfc6eshf?}rj)qrYrE1$Z{6FUu%?0)X(8(4^N zbhBExwV7K38W8cg(JwJ*gf1zw-^PU>$q`_>Bmcqh>YY&e}F9y559D`SW1m9hh!!b>y_l zwaJDczfzRU*i{?M-yWqb9X)z9BxEwuH>~-}Ve^QYQCaEONvIw`o3Ar)M-K|o+$WeF z{VbfmwdHKk@4#!Q$RrQzrKG2K&joqaON_K5&JG?~>Qkv<$Y^$y`=g*~-dHXfbwV#A z|Fe?uS(19}(+axC$(gx6g;Xh7`Gz*wYGh`RM*g_aMk-^4Fob_HVQ*o<55_b&%LVyy z%w0J>5eV)^hKBC>(Df3xov*=`oun}dkk9x>)Vr6)-(1R=BFFv+JWLnJ{z(qjxYaX# zM>1=?GDGS5otA^j(0!tD(20o$@7GwzNZrLs%j)0(B8bz|;UBa%s9Gd-f)?C=m@JYR;w3Tiiw(tDmx#mgV0sjEU99pK}vVy#%(iRZUy zh|5uMIKi51-XoZtWK-=_n3R+xUWDrOexqkv6P`*IH&PMk87A`uIID_g1-Y@Iqi#Ek zXrINj3G&6CMErRZxJO?-Q;+-Q7)VI(J8r~qM zj_|9;$6mF>t3LOl`1~R&bGSnwkL%hK@i7-B7dwt+`$=6mZunM;RCnMJ$~;Q#DNB&E zi40=yFaxk~e&v4M62g`|ni@(uOGjOmaw_bxIZSzgoob7gmaSmjz+Kjm3B*S&b_}TQ zDRWeEb20qTFS>H?EKK6rIp&{Qz0i0upIH;n1ThugC|RdMmXo)H3oUVkJ-3iIQKhFn zBP@OHL`!{NqjE;80FfKU`f$DxEkEkQq6Lg%McFZEJ2<-=J#|lPGsa-S$OJx>OCl-Z zoCWq6IrX=s1d|JH=jqijWus@pIWz=oDR+%=t~+(xwQF@&lB1x>AnEC>9Pp?vIJ-Z) zd3KMxZ?iuGA@})5d=*yAEzq?vNz*ab6cv+RHhoAfg4-NO7b-D<#d^6=I%Vc?cO<@I2q$evRF6G06R3mE8i0sNqYV)~X`IJlvTVst3eZ%umjTbsPe z-UfS!^{~$pJmfeyl!dxBoc6)!M2^irAJ#M5T;%O@kTF6glY+Tkg9a?>vF!Uj!e!&D zmg{3;^dTgFn14*T%s`7^6Ja&IyM?k>C~kaeYh_|}taWz?Y0>P~l#k&bcrmEBmESnE z$|#*>DF<|d5&6r;*MiP0Rny8FI@e-xOr`acdCyb7)V!k|Lsgg1@^9 zQB_pNq%nU@$HO6fr6BEO`y}}ffQiTAF#&!UswK_djIvS|8WIE%dxzGQc zG46QpjyK+WIxx1Iz1I3-&R=~7$jeILV3A=VAtB+sdHqTO2?;q8zQ{4q;FWpW7ew$I zn!c38EBGCLoWHE~g5NN0UaNgTLb^kM_(DdCPb7sG(e2;Jh@mfFJis7jUv$%}hL`T! zi@mddX>Dm~WMz-^(#}ZF-pKHw(|dc0~ zuCy2v<5o%a*Xo#+=!}(b(ebhID++4y8BxbQ<<`;NeO=sKF~p^1?d*(K6;xYz&`=7%x!Y zO5!8_@R%Nc@xcg$Ump5A{y)C*B^B}V|Nfr;yz-xK{m*y(Kfm&ykN@A_^Z)CD|L91kDpTTjX01ws52++{Z`#ZYn;wV;_p99cA<;JjX^UeY}5b9AAG6hw0$$Z zTqn0&=ae2&Yoi%utW(akb1>Py9ely+9?wEAn*LQCxP)nrEkNrEYp6DD~yS8QkEz}5k!^%W{}3#^p6VHxyGX&F)TC_91qs;9vZ`tLcDJ7WrLt+DTO z?V%KDZ9HzqZEG`{e~!C7-5J&=tg*%SLp)?LO@i`~#}MrXHf6A?RY7)2Wx-6O?~JS8 zL5;m$56|3mjeTA!}y9w{o5<2w;H`}-IBEJ(Lv&CdOA-u|5Ep- zVD9K{G2usDYQxdOzTPAOm$fv1QZ6&4ef@*}m!Cd;`fAict+1^kU&rsja9XYSQTe$A zrXKmT8plNG8xliodHJpeuzC2agOo;>t~cP|5#t->?SIMDGD3a9x55K`5moQ?-v&pNT+I@Ll2&RU5}qc zc9Xv7L*e*%m9b=bXKUBQY`y$;1MA%}vs4kbQTr{$?2g+Ha;!Zs_a#cRg30+x-aVTr z(t8=VkrDq{T{?}vN1E9ewJFf<6BY7N%Nm*#(lzodi&$T*g4%?yQ9-ieifxTC0qw*4|Ve4LgvDv!5c{+{B6atR@g*uJuG_->+o__pA zI-_Kb)Z9*f)1!osQbqjX@@WK;CTG2$Nz5U?{zup6pR>yk?U8NSb+X1c;+rRNSuBJjCD=cad@Ix znDm5!`Zpw^+3kP0t1aS*KKv>4P9^L>npaaqoj^M)C0|cL>b)f-tuK#ffbKPgwUQh9 z#)3s}i>~>J`$trDv3=CuFjiW3(T~z)-()%2?k^$v!TN|lEX>fMyvw+jH<^Pyo-dHjSl6}@`jOGoqRwbu{X1^eWgD;G?6yLs z+3yqSwl9c@GAN9a*P9J=>vF!nJrpe>xhXa;f*RV_F-|vlr%KQDgI7hOPYK47X$3JY zH7SbpGYYp`OGRsLGR$$0{93Nj4J59#NH26dr%CDZvkmtQpIW@X(aUR)$LeQqe_9?E zhVJ6gyIaD0F%zFHlWG(*2UlA0TyD-+^FuFWFAwF0(eVOfF?{47X`e#h zSNjNviN*Vph2Am*r6{Qtj=^7logc0u?;Retwzm3Gd7ga?4#q~pr4qKl&+xjr4yF>J zq@tpFOik@_v0WJu5TG~kU5uBPx5#!$9BJ0$R4YR|&Zo4L;{lJ=6Ct4_x@6~;mSrx( z-*+k9_eAgAyJtG^9o4Kn9v*3qiNBzr;7_tp0u=fWSN|Mdym+xTl!+%Na>d!(+xsVu z!yo?PhY|x^WZ`@@g-53n0c<2`4o;@5hw?Re$jQkAg_2`pI;N}}Ew4ScC%G1vmf{4Q zSQ5A`7l*SIe`aLFht0X|)+0uDeJGQFh^Rg5?GNYE8K?U&Lxpt*SP!@@bbo*KqGM2N zaCgCvQPtb2Kh>s{iEo?px{*2EnL&KoOBpI*nIwLqa&;LS8#b7%-Yl%9c+v9kRQ@iWp4RldJ~vTNP+&R{ zy4WgxLQBj3VMQ9A_-wBgZ=Z*Gg3n@{ZM0BF&d~6QYkl%=<4y9v==1T$2sJ%DhHvw8_!vGuKK%io zhp+FX=e#R13~0AYJkL^Mh-Ok#F!XYF7Yrg{MQfUxO5ppj!sfK2Nh_Be+}J2$IaNW! zJ8tJk$jZtJpWDssdcJn-dT?-Hme8Xco`Khv!XSe>85~j*xqQnno zjj&#uRfQQbMaugN{!|CkANm%ywy>WY8`GwEoJ=sc(mZ*xw^`VD@Ncs)f$<0~wZ9Z5 zLd-YT*H`$vAy8@O{{8!ghKBQ-o94t6IyyRs`-zFYEz%c z%^yWMA+gQT{I~Rkur&M|JTAT~F}#tL70*{uZ1nW_;Lc+`+t$~IS6<^@Q*S=TLMxm2 zB_e{Lp`k(WWZYoI0QU6Hw?D+`39(=je|LB14iA_D&>nnI+yX1CV{4+c=Y~WA_8xo( zlTHIUj9-~Lb6Q%O``Lm&61k9TBy7fKZYLJEP*C2;$*saI8N#+RG&0&BQPnAS+*Thp zOe;U$RWS>+x$j zIg_ah%dNRa9VYd=pUhf!MqfUCzY!JkfJdK=^v{nhGcp87OLp6NRy%)NG;88hC|1O= zycq+k|Iz4eGH#16KYmcJ_9p$%YyBKdDHIPAsg(QzQ64^(z;w3=?AG~aX41WX|K4J@ zE>5e~(9hw&{*nCv?vxEi_$dbB?>WAoKHaX){V$S2lqr`YY^RDUn)S&2k&k}&UpWIH zE4qhe0JeKdKbm8n!>Msf2JT)MM&R}xN#2ioxj(t_ z&4ixm9{PO8*?Pw~GjhSMFD7qBt*57_fbk-V&3;W@Utj;{!`t|gldt;R$ZVB0P9B@j zM|Ygxrf_o2{j)H|X@`z#XthkBzsRu;af#T=c_dOOSzra#E_11>^2Kml*hbQ5r4>0fH_VK1 zHKRWDu@k_O$`}7J5J^q$-TT-*SyVI^NmY|P>hItCRq?Uyb1`M~%4U%{-&$29YC7+` z4wf8q9y+zZ{qaQ3mo4u_dhBgpb_H3lU7Fz&MoIcfrZcEk z9ej={s-UX)&P{`HqM##5C3#;ymj7EfK|$RDP2RSDewNG|)<9iWrN-2=a&O$1AsP|A zsYe%FtDCwKD0;qWa;fBJ9CZpErkkE z&u|`a8$um*zqvY1ca6yZ{ouWD*s0l{Ju94jdxv>?!UCn6TT8o4k-=Vs()Xu* zhJ&Z|89mMQ!o+DxxR^#4r^%C=7s)lctlzg1OQ;Po2PY&vsCC*k{{8h)TlwsS+~eFY zJiF&qLt9M@bZt4E(I-BWWO9=x6c)1PtCufAK|R`;seOHihM&Jinx*i-0<|@Fgdut7 z13J1KT@l0ITmIApakVE;&~)wle$jj`_p?vg8TxcMHpoj7^SPyq&##q%@NPn6`)=kv zCT{t0L(guqig}e}d%wW_W^}5r2?^cM5!!!;Q%^K_)cTFPU+#BoO;v_TPrxaWORDd zifSdqOlGe7Lh5*BTCfQxjGqiQu|ZEbIyrx-@Q`PHI!`;QzF1Yf2B%KTInND+*5i_H z=rbp}*t!Ni*7F}KdTgY5y?#djRRvli>1GbtTn-G;@F*>=w>LJrKI1&d`8A{8YQH;6 z0X+%P)?`iWQ)a7dTixAZX36>OzW}D0VK0zL;8wf5zP{LXS@0vtOQs?uY^!rQG#&hj z*%3-XEi9ZIjNLt&E1UT;bI2C3*2(sizsX^^&5v*FB27;mCA_{8cWpn`d3CZgBUS6T zy?1hgrrYd;N-pdkOT?(cX88N7MupM=W5VMHf#1SNa`MRjRgr4sVa7p6-QdlJwyY`h zr){hi6FsEMY`nxODrsj}BEFc0DKz$H-o5VhJx}jzip%kRaXH6^i6A0Y`&7%X64@;( z68|%=-K~K{jHGP3NGNF7^XW0#k2yFZplJ`+jCRgA&Gk%_ny8hT;$NI>FC|zvq`ma_ zTJ16$%D@4bmZwn}3ZSCYeqG`6@=}t>3GgGY(@vstSbK}#9X{v1haMLvMu0D1Dm6m7 zySsy68{G2}YOrIUUA84X)2SjxeI)ft-YTZJy1E*lj4V(kcNykd@N%zpnURT+1=ml( zR*FZad1;3Q7s+sC&BdxI>GGee(~g-^%#no<7HSorc}^Ru(ttgcsbWgTbwS>YSNq>z z3WS>_3@lqItKZc2r%;Uxg*xe`dY86$elMC#4l*_6cWG)9bt1~kbXPbvT*2W^|eSJYe!9N}7xa7ZK zL^`R%1Y3F%c%(+qN7AK8e0+V?iuJ|znFm&S_74v9d*Zp)?D=23e933`_jULox7GA( zQ&W1t9SD*TK_{mY8Y}$|&5nKk$HLbH8kWMTW`M5a^=_5bPwPA`9AVl0uAKAKSgAU4 z6>_b&{c1u%$7L4rmG^ycluyD?qmGct^2YDpk%U$vY-_d~?yu2tQpTa7e-Z_;(O!nz zWBD_09;>L-^x`sTJ6B=q>@eGCVb|>-pOYU zn$P*6m(es9dWf+BPSOHH(9@XWb$$MrmCw5IiredQA6=uuqS$TUbiC-1$kkEAxzkvI zR%dVT3e392R0WQ=j_0|b?b0vXKB3bhuN%*j(o$Fqsnv6aBRR?z(^dGYs;Yy7gMl)c zus-U}R}%gt@a>4$d z#WU7ICytvNm*1$P+l@*VM(I7Ap`muR@(0_qLGHDuk99Sv+jNmEjjf_EB*g|jzMI^I zCgey_`}xP@@MDhZ3-S>xyMv<@&+tLb!{rC-iH*_Xie9QgA1r7ZjW9K04}O}5w6(pu zBii}rPusx2z;~+l&dz{zshH8g(ce*ws%z8LrR@zLR(l5;Jlt~idXt4TGB_tIEW4pU z^g+qybKHs@IRu)QrCONW-r#z?5&re7{MI=jdl<0rio;(oTu_(Op6>l+@84X=4cHr_ zO{fuZ+&t|HDHsnd8?Hg zhsUV8k!(zsn&1JlKiV9_D_8HCZ}zoya9BRuUqV8FV%SmxW$zWqDJbID^lm}5BF> z^f-DO)JNR4V&!tB^Gxkfko>Z1Wk>9|Qa&)DpnARmOS+ZawEv;IhXw&dyFF zN*n{W%gtFnhxIwU;SJuLCZx2tm@2T5s9d=G{vMIL&MvoBh=dpnY9)=>n{IT5e&G$0 z%&-~vv9Btn{HWdgDM{wa8%3NwrP*R#lAW-Lj`VFvqO)V|v=}Oo|1h8q0^6y3d{cC94o7f3pqGh`J zLqKS#@vq?fPv{<`K>H6XaXmJRX4MG|3cBNUbxZ>5iOZi#$dwa@ZfP)G3i|;!wv&_7 ztk;c4kcwWRc732n^X0DBO*iyVQVwJ6r%#_=LZ1@r?Y^0%p{DkQ?=QADz~Cg)JP8&) zacoE-NIsvgBKk{X{aT7JMpgM4C?6Wh9Ok2WcGY!ECl4eYbqGB+KNmV_>27?D7UW5N zO2%kA5-qN_G!UG75^GPnZN<_IOLXNf;qphr)n?$Jbtc z9aSf5uYXI~XcM8@5M1=HLTzuG=jMjWtMQ9?`aE2jqsGLbxBY$G$$5%qL%3&m5o&0B zDA7%ZhQqqLw&=o=U#oaWW_Z*O1H-Ui&~1MI>7-uNyvJCXv>b@DT8RMuc>w%{hNIX$ zJnk2bzNilW))^A{=Uyuj$#ufa>bddhxkko&=IsgdYyFe>Mk}|P^SY`<)9jYy>O_lU zO^rV5_buu_%GMeF4&3|cr+}t@!p(A^5Vt?^HC5^7x5y$c5eqR($>{NWTj>pTGCqU3 z>MHN@ECM&_SuFoAY(S+xHMledt-ehDiG}ibF(PNy-_|!sVg>aYb%F;6gv(f}vwQbO zPg+%mGj5CCPOsofK=I{U-IO(xoiNGmwC|6I*PBlaY9XKPc_SmFimsWc#G4g0E#19r z_beBQn53d+(2{8Fvv0;4S7KFUU_(2N%zeG$R``mOp*W0afykqq-eR=7Gdv)T%0p0rn;z_6UM7>-_ ztz5jbf+2{j}$)eFkMyZ-|iqmn7X#;ArlvGYkl*?^ek&^2yV8joZBU`W? zu2CzeMV1S&e2B<*gIkL|6A3@%-@VO2IaXpMvUP_{HASXYzwI*x5HPVhdD{)tJ=FzJyZTFv|m8rj?F;4&Xt+X{W8Zxmj>^xGjKy&+EEwCZ@AL z?Il8TgAI;EF6jK#h?Lm!=G$## zcX!Wcj6n!1Vr?zgD}Ae=NErhRVA86I?4a^WENuAKwbQ+{(vu)~b9vbI>lc(K65;DJ zgBqt@S@@A(5uv}CrEW&e-X&F}d$zX#T9}w|bGZ-5bfCb1Mk9m}M_mq$|D9}WFdlfW z^*=hCk6h{qTiV(R_V@QE^&9_Ui6MDGyw}XhTY)=>_oB;_w;owI1;;X8MJArL{^*`! zhIDo@&lbp5%EXmGAVFfjJm_X6zG%GuXATl#ESEVk2wvqG(g=;!aeK0TvfR9fMHD2o zdjtg4(0Rt8dyN(9WJ04V?~+COjD7zFOaQ!6cy5%CKE+ zq|AIQG&9*X5R-s**j1od+_F5}%rfm$vJc6eKXGf*g0Rgda#FGnm6NwR>h4wMM&TnC zme2yNT03Cq9H49i!!fSxQG|w3VLjIiv_!2)S2TR7)gNya^w)~Ei;E-0MuVXe1H}&JX$3~i*~KMoY%?G*uw`s)Y>|0pcKathc-`@+M%~$B z5b+hwi4~nu8u$1YnF@K5Yv0!Y$pX{_mtQ6&pf8vNKjz4x8g|HcCKDAE{gc2G212sU z*7!5fQ9FMZC5j7rMK%2X{aQAWx0%9eS}%r2fQu^%83pZ~Wrow%_`rAH*_jy%6B847 zzpb6!B7nii?Cd2fk)26Svz_fhBm?XA_B+$}0Vc5MGz6>U0yB;m_V`!yVO19B-XCDg z<}z{ad(G(53EUxoLq`|{p56f%>S#^PJ@Mjca8N|?uHm}<((Z1BGTR49nmZ&ce*wuH zZBNAj1H>mMw>X~8kV&uuef+~>TY&oMU1-F?z>Ff2ldWb~mzUdPbUZsjIX&C1oO}KH z^*m7iLZanopaBBu>z=K5i-VOolqn~X%jNm$u7sYvSeMN{@MY(z_oOlV4=qpX!_~bsVZLGMm>7!T#(HPmbBZwS&wY}ecC5ah~j9D1H+~2-^Yg(>;czXNe$B#$A z6Ms7qGelvr$?^??r^TXKC2!&GA18M~V*O=gI^*DMlOV;cdum-Vv*)I=A-84%7|fF~ijHZxE~uVVCz4sla2MAvDgPM~v) z3t=_s;@#grJ*7MO!HdCu9r{0ADl8-TxyIfMseS`)_^ixs$?rqVp#FF^m^hTnQ5X$s02JI|GH@d&p1W7WjkG}bq)Naq^ zrrdDs=E%B(uJ?4EX07`>PBR?(=jlqyyeyTmHqd-?xJ3R-YwlXRmv-=_nzCC$;+pp9 zblK6#nDThKkgOiMkKKbirYRXb#YuF5QIn65)0ApcO;H2_JusuX9(bEa;LY##-RuNU zFZl|K>Ze6&P(VTJ#s92W!WqMMu>4OX(nR701fwl*bLOn;;|S$V;{p^uUT=ix;= zeWj(w=8GzvD{3x9dD=q%UTTY+uQ^!0&ECzrMHhm^9i#agaom<lsG8I-DDzBdX=-i~d zHoD;+U?8I2A&%T|MaL#>LctS!4i3k7qn8M@rZV2yY(=_Xp%hZ!jqrY0!A6*=PoHLw zSHYb+?^Lg@4QCSo)4aSq?1Ml_BqK|jh5JD#U76KPJk;W^Nl99HLMt4em(H@uf@;hs z8DpDJcc&f3wCJO{?rHql+1Ww-g`CgscDh1?u<~xS{E(80r9j2w;x%(SSC#Iaas|RZgrIA<=9MXCsuX z00O#ik&$g6@n~8I0*iiT@N0g3z4LEp1cHXj3GUwpw8NsRNi<>h02rXT7$LxehTP3&bpe5^B)) z1wT>5E174`U2*oig{1s1FJvB;rqNRdp^eMRqN*xhgd_-6K8U=pv-6oXDpmAl5s1d1 ztllLg{PZI2dEprJ8_dZ{YrN;MRBdf-A3b@}rmq7&9k%*-LMLI!e_83D!xCg#f1BNSHfbRW{t_;Hx@+U(7Xx}NT6>1&QWqK8q` zhnuk99PMGD%mH!1ZspH?gpOrnV^hqM;d7!=6r3|SOa8k>%qs$R(P4Cayjg`t&5+DX%kAIwC89sUR=p#HKNW<@Piq0#vClB)vPM)3#q8L;8 z7@r1pcl*rtiRPl~deZf8<}lp{^b0rCGm@*?O+MP*?guN*=HTy}52$zX@kK$K1QE&F zbgX~^L4?PP4M1T2RksV6sja;|ik_b4?VhtQ8qSx{Q0`qRY3V2MlxR3)cd4kX@q4?w z@0ge@VdP#O{`m1@eX5cb&9~W1lSWJK=K3n=i>+{YcsR7E(zZ?3P+W*ujA~dvGwCJI zCDN0j=H-nA(*y3HIYLf2pt8~_4qZpduRi-&ZOcs*z4y3DH}4fenTx$nydH7zU|k~e z?c29g2TZpXJ+&G=0kEvH`(-O;;v&dDEEirrzWq+RlxcQpQH{p$JGZZis@9$lwK(?F zGoC_d|)~w^$x)N|+gxd9eJMw9KmCUA@E;YP&kU$vuFU z{}-^gSc_S?y78Y_J>lKL#_PrG%;Xo@N`tT?LMa4(!L`ALD0k6Oo5rhb0l5kUtRN5A z;_brN=NDL^lVG><>{b%1zJdJ?TOlAUOfH#PQ!&2 z8K-FzAb~fMl8b=$5h^aR)iAt;-KdKYsX(*31$3XF@{z8JO5Xfi8{Ej-QC?0f8%WC8 z8WHEKV6iJPL}^WzLb+kTBPlM9CMSIU1Y8tsGS0PViXAbFt6ACQ+VNI%y(NvW_Nejp zpKVhIpQb_!Jtxz7{FHhgdDLOHq%q02(qeLs>z1YoTV+R^#+!K$`>A0Sd-iO_qw(@U zDgZCD+`o!9<}JJk4S@JUQ&aQz@89(Ic4y z`3!E5jQW&_y+_YR|2z&wli|Z1u{8N{nanz0-3)7|wCa?npsLz{oG9!OZ{2YISykJmeKDVn zkueA=;@knVF)aF@nVCcI@D-L*;#O8HbaKf*H7c#n&d+TZT2PT--H2CO&44J=&OF0w zWb2~U;2sAr#-F;lx++v!X#v94e3A^G77-WsX6aW5pUdF*!5u6t_7rpGg2B4<0*Kpm zM$jeP6u$1Zoh*9~lL_50D@UJ(Pmvhk+s4fpx{MnEdt zC38P-%an?y);ZO_(&F7}s6Yo>rG0jD9;dc{e}`)%7b-El%~mqyBm-iKke@-kCARv4 z=&olqVN@c$FtoCEcI+`MS`3PJXy&56-k@a-nD(#RgRGBB&f5gR7!Y?kK%!g?pi7=V zS|3`uj;P(K2}(_USYb62D4V$inH>|T^#BtQAUupx$Qk+t8!5KR62o>@-r!lVH4SX# zS;K?Bo$es?38=9FzKuC0u?x_qSzIJR*T z=o2<9OU)9k+`dgrOjwK;eFPR6xp4`hmOY^FMQ*275Paa9by=kd3IrH@OHNJ>rrCHF z2-h>PKe|Rb1@+r75WyQr@p$|@(u0(o;MLKPcX8pOFP^aO<=MVF?|m3Y zY^mI_M#Vw*;}KN^*ls7$*@HYwDFiq^m@li?&aiy@_AOS>h5hAc>;)LftO24PgcVZb zzzB`a*y**t{$p5HnO-;7={erkmGw`fBtbat{QbLWW~RPvz!d<-&-C<#wY7KVjiQ~_ zBZzRs%59c z82ZorB$v&9gOg>9JO&Fry*3;f!^i0!HFaiut6urp+S|VZ z=oG6&vU~gyUB`!5sCk0oo58}a<*&CoPi?tv10K^Oe)_0A>Ed@+sS0_u!)3)CY>5?^ zB!~5M*d5fpfN=f047wsGU&`cjFeM};ASnZct@3QAJvj@&4J;&He*Q^4zy4;HvC_L1 z-qH0TSCmorQ?xK8aadAwpn2F`U%JF|zW1rDtke=Ffo7puWs{~7hH>vx$(VJ$*;Zhg znHzIz{QNiAA)3!fe-ABBm>iBNhJ05{vGYPQF}FendT{GSdIJGNSb$T^IP=3m`p3mi#Tf1ihAu9Q$+l-2${l_~No}r~-TjNow|1JHc zk23a6S!>?8t{QDIF6?8b)wEJzUZqU2|8>$}<#fI=O6#BEG%2CIB`N>kLZHh*S94A* z28%zcq-f;FFZ4VuKc=6j1U0A92^88jRNE>s%F{=t4)+&VN8`3vjhFmTHq7AQ53{?3jFBJ^h!|>5cQO7kH816`#&h`l*`?R}%P&cEG2+&Efh32=SrTqsT3cJWcZVIac5c1%=mNCq?V=EjzuAS zoKFcW`HGje%YILa{RLLmAJiO`rG*7ia5UcooWH)lhDHuM84<@sSQM~#r|VpXERJ5_ zNTg+*@S4}oOekKP+aa{+sMmm6vsDWz!3X6o^avM0HhlgZ2^kp~JohAo+hNdwt8ZY? z6Z90*XFTa|V}=0%`%D4f<*r9n0|7f;^T!dk-)PaVJs~J|4rxFs%VCJd83CM!nhD7} zM2$X1gl74ZLg6_}N=gugnt)b16~xSyD5Bv2A3B9~ zMxl2mwIC|UpM>k%tgH9Itegyh4V1=#&10jI+Ha&F_agXC(?=A*aclrygR*x44*l5} z$whedBA0t8+f$W=_HN8F*Ng|#QPE)e9}dZhfFa)nAy`eLKKD12(gy$w{?c+orsl=jamEhbvLkx>Hkp7TIq1f7+kJ@#Pk z8w4e#p;|#F@Wgj0O==(Ig77WRAg$JLws_}5 zhoy4=<*es)6?wo-lBI3#sz$bBOjMLn0q32`c**p~+}zQXv#vpiuh>{pyAL0vES+fZ z@89ptEo_j4zSbvv!34`u5Q3+_B*n4~7h3!h1zo;fUtN^ywW1NTYC{G{BYko+|3GJ8 zwV(``u}IxvuYhKqbFpMf`{^}G0ZWkp;SMFHtX7EE>8IwiNByN9%p{Q{lqh&SXRG(H zlQ1)XJfb6c{P>ZxWc!kc%{-FB#&EIoVII%|pyB%9fg*95_Irm3|N8>-kGSf;(_Nhm zP9+8+L@GI32{Q8U>YSeeEd=xq)*!C#ezekf)y46qKP*aboc%7kv7@PL47??8lc37C@m)$tfW?bnfQpFo1Aq@)D+jt31jZN!Yv{jA6($64hJcbn&hs1)8pJbK zGgCYtKYbdYUGJ(KU(X;JeiJC{l)mhBb3p|e@%Ea2hC{V2&#?X7@f%-7l7|9gXQ%5f z8CTqUUsQ8bvDb_*FFIX+d{yFxKrcdNoS)Y{YycJ3?s!8PVC7qeD1^BJvMYyf6B04g zyC(C(dhuM9e95HG5MX6iFMIxD;4Y~1+JzmRotOaPp@O`Yl6sk~MEu_K0X7=M8bCf^ z=lN)T{P_}?TM?vR5n&R@$nbhyyBDu=y&wFPl|_HJ3%@`jol)u0BmrQ1L?o#C!|GtU zx$5-H40Gt|=2#dM0(PruUPPq;c+C)*tRbXxE5Ye+O8;G1s#)m-$-9IQqYffw4$Nme zb``?%^BEpif*U~aN61J3WVC}IIAlKJwtC65Y8{QBifql)#(+n@2hL3V_AVf0Lt|t0 zab2)}7<#m=qi$LnVYe&aHg{p{^Y*^{_}*{T;P=hU@{T$Seb0mYH`n_-ObN(u+#WiJ zY+c^2DbG*jtbm;j_|iK9Jbn&jaj2@&^|On;FkKW$e%4eTWeA|r_W^F5$M$L=uR zfKGZEhXx0c)MmL-pn@lRoTvfeiR1e~3+4zSAAELkk$`Fh&=YumcwAiPYKp1__NtZ; zCC$HG6hjl!YUjm=y;jG2jivf%1xh)4r>8tqDhpklaB;|>?9}cGmkK$q^&L}iWc56WooE*GmRW1h2~-BP{ZrzKVt%~PJSbw%%$ z%zb_3+EBdP_SWF?V&vxjDbG>vvd^MQ$C=ZLBHOa zU<(nsykwwfgFzoI)R_}xX?U_E3$b~q=y_VT(Gaf(KX8BO(8SPC9^Ah}Yj{|sAf8{7 zvj54i8^ebP9{i?;_PElUbjLd^3=ixMV&?e3{)|;NSa25hUK{qWD6c}eh5VK2W&LiI z&JeBcbnbql2^iO|z;m;f9&FSm)3<*x4ES zw1YYu#eXzUOvJ%y2xv+{krFN`wSl_K)-KgXPLTa3Kd|4ECs|r6$P)?nQXG_CG(zFn zSISK_j5m&kk#qbl;J|e~<1#${_Ga`>R75Y(`uh+Pgs>XhsTktA^Gizx&o)}-=H}e% zI3YV39vk~bJs&dn;qmd3Fkc^XE#y{UDXDp+nhU@rT>?Q_VXw7aLThNaaZJ28kGdJ@yXkeaIXqg@JhM7% z81m;H%9*0h8eYD^eNi};uw76^9H?C=kvRlq6B7d?705ooAA%%V)kn3AAwt?!HXp%u zQ)jxGhOL9JEZ(1}^WK090}rydkz2@aJu3*LDy+2hL%N8QQM>wV7l)zCZc6{DivgXx zI@+|f-|}4R3owmJZv8S_ z3#g5QU_sW^*CV7-a44Z2HBAR-HhOwMI80yr{yxOhmIfrKXyE(=l+AM^6 z?7Q5zn27eIZ7O=FI;h=ZTP!yZf?FJ8qNByt)z#ymdr-PZ3{mdq%Q3L#q3S|QV*{pd${BA5!))s& zz{?9K`~I|+9cllN@;WA*Bx{**8SVa1)%j6v}8mI(&L|f_R{FOJ*dz9KP2!z4AsoD zEnjBXFRWBH>o&o@faXx9p5LCJZTnsj^nCC?@#?kv{O*v%LY)J&gxmzdNxBsGZ-|p3 zNwT1D3Yfy74ro*_pg#eKRMqjIk<@?O*k}&oIl_#ErH6yV<<&-Z@7@d0f+4>1h>p%5 zR2CmF1S0t;qSRk*7WmrO9j7{+Hn&%`d?p~O_>ss=_%dorD}b5R%L{Bd1bTpoC!CH* zffQlE`;H39HAb`a4ltH(rtrq>M9&>_ZL_9S5B0kAt89qkIlY%TLOSr27YAwK zHuZ}y3PCM|*tgPFF+h66m&Pv-XmFswz5*rYwWMUpUWd9{QBqP8m<$$^Wt|q|qbnr* zZYNBT5U7m52GtS3K1A+7F)oGB)Y~xqezS5!)^L=O(f1=H@=ENMC6VAHlr!L-?!-_Q z))*s#+#Q3?oQhfv}+~^8qOX;3BtUY#XgVMqNl;~`>ryj zWqa=Q;lon>=`4TiqQRsI2?anooDyf@r^3X>sZvX`{iL*RLP)^OHqM8YMqohPDS6 zJXE4Weac&>ko8fiod-KTxU^y_NzkcWULInP|A|!P*sg}LRC~_w(yFJ)L!r>va(05J zWR4&Utu6hQ_{Uyzy8icTnY>6|E%-yHbjOU^Q%BW1hdL3P-BXY0>-lG|iHHTb$8J3v zF(!1ar>qy%v0tQ!C|;GLRZFsuT=rrNevzg>7RO0xu^d<%gEI-{hbZ|!rEgB?r@qK*gsa!CHBc?*;H zF3?W6L@oWZ%g)p_MWLbRQW2Xgena`yfzg5C?8zdLp+nxx; z8HwS_0kinzwL=4VdTFiuxJi-q4}BDjp0wsLBbOhD|8p~1+Ktjm+avHb*!s={V#XKV zO%^#PoE33LlY1r15~Ig<6S$YOe$?R5q8gc}_UIU!J%?~u)aH{U%Bld-9!7Q@)%clM z(Ua>?i<8)QG`3zD-Nr-B7V3sqqCt5gR^|=&6e(VZ(Zu0)JCT zMS69tzl0pWRKY>}-P4^O-hn#FBNdfk?O)aYYMz(?*IUw3lQ6d=BS|$|>B&Vo^+;nq zVHrlChY-`U<+dpbGs$FN4RKRVz0+tsySiLRSzU$G?XoJN$xTBe?IbYU;6Qj#0p z-gYEIkbtq{jHIV{3nsRP9~=My?o?(vaEneg6AQ1FhZGy&TJh7);&-B*{Dn^r>q=V8 zdo`4*%($>nd3m@91+w(lLRYx=rLQIn-4C?`Qo#i$rHZx_sgwWtt-H6YV9-d$G6Vp0 zF2SX8nY*>}C=&i#t4|Wu%Ico{vl;l(69Wt-tV-HM^W#qnB_)zU7LDhz4pqo5i^V8? zTvb!ExV+syp&z=e<@mSvXDF|LfNB?y0r;DLhNXKG`A~k&J4@`Z(p)Bqw(M`HX^mV^ zn$%6zK+qrq(kt4=_(jHl(Xh)U<#Q7D=qn{DvG09wyS?l~ww>Ii$-|v1iAqC9hfYUF zXEj^rA{B09Yr6o=gShV_U_M>8cV)bg^OnCL(!p`PaQ-2y6cHQy?!AkRlT#*~d`aXX zFLsq}*_VFYD3eF5VHFUA5hw(Sm#)iEWhh3B;cqW)iyf7!2r-TV5{6VU5*{92!@mti z#HmWqLNkX3;4mvTny<_9Zw-}DGp?skqc+K;-@IvtQ-%sNrWKzs0&yMb#5gsG~9+QAe8(IA0`$Gtz&^8^JP5$Azpoe0Rf9;%L9WHO z#$odw2??Unp8-Vyhba}@+W*r@XL8WBL38K>mBvDQj}B-)$&1C@Go$*G>N;$$ynusK zRMmv~3VyAUeNqd){GiEJ?@4OB)o7O|)^?AtOpo316u+e&?armt?lvUA8QE|Mb`4b7 z8X$;KC^_E?ND%YdwXGQ+oSbm8rf7ZNR(dPd_}EtXY?)#iYiu5w=dwnnzGtF76`N8p z77hv@0uHpDZ$btJunuVf$e|-VjTO%?JhRTeK&1{#3ZZNQvlG6#`~XL?n!&iNwqL&| zEG&%Bb>JX3!qf%G`3q0vvIztrNJv2T?3dtATNoFxR{SA|W_x~M1f;VH;(6XR%9q0d z-QC3WR*|Dq1ikz6nF(70EALCi)+eXvY1btv`gfdOWh$rIam-H&+!^bwt~%~2!4w53 z`yBuqm_85)2bhjwr0s`OMTt+ZOK(8PmC51r9Etz;u1hra0{hhb@rjyke z0F@p>3gUO@s$&Hc7_^K-ubWdZ<;V2dB&7l8T2g;@)hRW#_-$>E6b4Sx|6P`HhmZE1 z!C}qXiJkc-uj@l9L=@8V-})SC4EXZhph_@VSzKc|@$ucrCiA!+nSu)%%WWC&as!GD zLf`?$50>@(!a_3)&2w-^k^J$fxc#j`bA^K_^AHtB(rmcA*-mn^Q95<#5V_bhD<3qY zDbqi;`Si7z$?TpX=1W_%Cp@||(f-dC7Ai0!+t6yqlVveGNe$G|@WeTaXP#jt(|*r* zGesZigM+j1=!;Q;1pY6*XTuNK79TyrtXDN=T2wW!JPX6%yMK*jKoj>?<3B!!fygP{Yz7` ztQ&|XPsJDN(?03VY%^H6eGf?5ctzCmXSW`e2I74{#NH|@zJv$;Z|#yvyN=YmqJld< zA>kQWNLg9gSD*tjGB^-<%~HzIXr-3;>U7bO9<$?;GQCX9znP?D`5vbxHFz!61MFJb zhya*yoSaBDhYcm+^S=aC;p_EY9v(tCI5>#^0RVBzon$pZqzle@4lBw%1N{c%*oO{J zoH`+%_uj&y&eFrc;D^q$078gE;^&^qJJ7_}MDNL@4Zc?4pJJ3xqjDkJ@cFAH^1k)pZosapZkuFZ1VmF{Np-6+~y62U%ko*v_ax{ z!13We_1}SlMm;?}C%BI?A6DuKxB(Eo5|~2BrJ`kO#8%FSyAGl73*6_dg}RRSE9d+i zDrLc29N4;h?PIF)PWbbRYqC3`tuqluUJU}-eTG1m#^G=v-8UPc`G6@1y^SOhhD3~v zq9EH%yeu#~DFw56Vx;PjuWxXi0^dN?;PiA7U=|e>y^uxV+T3ceUC~8f|Fm~2nWx~| zZtL;E-{5UEtw^?k1ZB|1^i#V^DP7%sU>+^&BhVJ+FP-9BdU|`k<-YbmSCNKR%>chL zl-LNY213a7Q>x_a@kW}8uRW=fCSyQ->sJd00pY9HuLYm^Th6%=8oqHMYNcXY*T2#! zc|^xg?>`u(WAo6z6>Fs}%m!rj?HT60DE5~t~79rs9i)` zT3*hS-A4elRoHjr!{(-UvT|~Osig*BO``&F$(!=xg_O?WratPyx*A@67sN_k0C_r_ zrr|yY#~PJ2s0T_z$XD*(g+;D@wQd7(p~T9cDuvNB#h5H9p_O~A&Yu25pB0}ZYwb0C z*ZD>%=pHIE)FzmP4X}c-&8EU)xMqoS^>lxsVewY;Q=o4H54m|N3Fwz=0Yw9MHbYy3 z;du{uFl~+YRe68iROf$6m(k0;z2e>363kIYz9!!cmoKc!)9W_k;fjCX0fdU+rS$8W zpbH0x1OdXm4eB{-{FZvONO-_2oNOtO;RSVH1Se%sV5?#K`UV1IJprKBvf0TDM19be z14s<6pdL%RQs+cq1r{B6`2bt8zH#Ft2&U**iW$Yz@L>ip$p}H}>8k-%R>2+}+Bl0f1G%+9U>C&*iY$34N~Kr@HewsJg}Sn!-8 zN-i~lGWih)us65+mw~V|{PpWO-+2ST_#nUvKkB3S9qxq1S`O6K78OM$CMHrh+{AgL z&yYPmJ-K*!t?liJKY!uwjqW}$jU@A4`YW3?nGhi}H@V~QauAr>t#POJZfyj&z;1oO z@ZE%ixa_@+$SJwSC9yW6yGu*uqcO1sCvrU~58Vk<2R#{#jg2)x3Q0CS5u~?4B2h7e z8S_EU#)cd8^#G(_mpb_|+NXa2crqXvcOs0OBz5BA=!{KFF8a=Q6}-Rms0g38IfZ(> zgB6(rK^(A%8zCZF$j%vkSmRo5nBVz4Bfb(sy`#naOb|!z5>&GnErF=+#Z;ru+f+(ZOKafC02K*>4mUvRnO?CI#_3Pul@|IkKAKdDs9hNLc)RExNcW))U8g1^ zF3(ZpxTZ6$99;KYu|Tf9n|VHP#G`g%o$o0DaT~vCVs9^KUN*FWu2iVZ%>6{IkTbp> z1k}q*_d_XpsUd!<;}UU;H_uxL+fkqpYznh+)r_-Sd?%J@{^Axo(Kq_mOxxm_p_Eo? zUhEdBAgP9LRWHM?c=>y{rl}O?w*ZB5u?s$%^B8=H zp;xJ7)F8&c&u-bQkr0_LA}~T3y73@qn5r!00J^V+G=Cbhk3Fb2IFV72YzQVQN8i7#rcul{Lu zUHv?iS=<~62ze+ggbPsLh}BqC0bwQzkCa_Ya6+H7E_2#oAJ@B5P;%v_>c8x&VGYTe z`J(ucc=%B8`@#YeQWR%G8RiJ+n3`R}x)r*!N&vt}aP&Dv>7=QUpM+uSjC z?Hd$h>S5pr+S)EvK51YGCHk?JoLosUKtHh|NGd(pi`>KCk4^OWh2X6mZLJI(g9SLA zGe>k06sg8sG3}@Egbo$j9#yjQlIlUlMq`F2ErRJZRHk#vDr}k5aMV20iGA1btlPaa zN6m*KF{YvWw*OcC?0tct&b*7M4lb-!Zq21^JvR@^@I4!@KKe&(${uI+JQIId7OMD zJcDy6eeKWjP0ar0KE0ns{5@yUBS!)!$3egz$LA(BoNu zj65!g@ppDwUumeuBw1I@E$Bu$9<$3fBxqko8d5)3R~fNG?^iXDtZ3X0i(QK6*mnaX z=bFPll(!^Im(%&jjh)M3KFupTH(Nco6LF`U&XcPIPBZfhX8OQ3B*_42fHb7ty4%yT z6}53dT8dGvwS2kSRP|Zl3r3;yopMc3)<)gLtKrC_UnYqK2H9QDpfbfVFS8dKHQII^ zW?EmT`J(g)=*Xha$;amRAy-#fly|8==u>NK=eux1u$G;yS_T3LUe+Yk+0;Pw_=NzY zk;N3{_3F7-`G|0CV)zvzgmGtGCS+Z1Y+L1B#QPXKQ+B$yQ-aBG*bqAWr{BHGF&QqG zx*hez%#6>pw=>2hIL;--?r|YMRhYxE1D&z1DXFY!n1bEmN^%+o8-m+;#AoXcXTwlv zTTpvTY+==p*{1{4VHYIY_h8C+J|+q^TzITbk0>tOBQqNrS@Ag^^=jwhz$$isNG_es zK@rk%Khi#I#a>WhFDNhsnNmu<;97x0kLztLU7M9vbmbJ6yfqGn}2#=hJ$VcsA+q7Te*L zwnik4<{#LU(bGdt)1gbh%A;MxAy|eLl$A@f&}N4&%sSIo2^A|5#ieJ(x947Xe!sYw zvF8~E>^>T2zE}rBSAzX?FbmVO_AY5`QfHNbardm!uB=(y#NQtbp)!z5L61^TX6&; z7@C9kt@sjF(Tua)DhyHV9JfqE{$*4!J6PU-b}IuPG{47aE(2==dJg^f2;!t(=RfBB wbL96##P4tY-;v+9XaBc3|KkV6=Jz5^JeP#K!>{w#2ZBZxUx2U*C6$MXpvEXxB9G{TdO(gEL<|bn2MHcoYZlZ* zB|^|K3LKLN#8gdUkV&JEmyfhjW2-?=kI*z#lJ*Fusc71YHMZYjA=&Z&+{1?*?(cHv z{_fm6GkfP^zqji8H5^c!qeQ%(78y84#BZR;LkC1go);OjQzRlrWW1-yqf11lJRvfD zkx1%&k+g{-ndu^n#)>S<6j@OvvL-|1+1Erid?Zpr+ifdFcKlvscezLv{nsuMCHYg) zi!%F#o==ew5%q9Vf3^IvRsEJxccF1=qGB`u^T)6Z<=BHCv$4*@U+oGSu5Eoh%d94t zR;wRJjdX_hHsQlN*mbPz=5!-CrVH=sWchP2`hhcyaqm{*9q1OZSYQSHS>lm|1z3S% zY)3T?p$TWvDw1gF;GkQ?#{w(D5sxG+zzP(L40sdo<1_pjH}GEu^)n3DYNNvxwZsyn zW@qPWmu6lv@2z}Vv8WY;>YRg2#$oGe4Pp`pcjDh%zz5=knu(u78)!4=u86M>0ug~p zNJbX&;XoN`a2U-vhcR{`bLtk zHqXCFvHAbim6g66`mVSCZDZXKvlcsauGu+^<)#<+3p;E*OZFh%#fhHq5AgtBk$@mX zVH)hn#u}8M68q7B6S#=0xG7>4_#y~Vn8plP?HpudjmYo`A|vi_Qf~xc9O5twnOKhX z*oG?i83@u21ll}pqhH|^dU4Bq^ifw;U)|`FT31l1hcon-u6p;(Lvz`rY}$xG*o^Ve zdm>@|!SWA_#1y1rA=sQ@zs3&i!&~?O=kW!;!95XMe~dsRncJptkcx#O;j^(AtMD8u z@G6erBm5Cx;#=Hz&pcFnd2CHTTcpyPb_jsiKsh8fm$S`gG!@JDR@lCF3_sqw) za$9-~?5#)V8{<)HMWRZ14Sw8Y1{(!&WANZaD4Zuh|Oy(bY+2U9{J;g2AxZcazmu%cTZA-kx zLwhfY9Wj-~)KlEn#neb+-P9>Pcff{}V`gW9uPf$0LkXNTwGDsAEn__4j7Y*2T*n=e z8Q$QWGsYnfvyh49SdVR}!a*Fz8C(&W$pav99W#{39X)Xm-oSezv$z+ejN!z|$O3<- zI#7lh97Z$FX~A}Lf7@(ku&21q(Cll*y4hV?^1}a^oN1k|diP}0eRv}M0+WzvjHlO$ zq&MOeTF?$AWUdK*2tf=Ikd7P_ViR_u4vix7E3uzs=QnV00vB-=H$^fkzy`=T0yaPf zOCy5~knt_|!mDS9te%Udcm|uHq8=Jf;}X8YZ3bk9KgO`*t%_Du?CohQ zv>CJ0vnXVN_LSaPC`{Jsot|cA5tl$O?im+xIX2XQO|_xX7+=SNUl)i7(C4~jWFa38 zl%WQP(TsCwL#N343j9gLK|2TS95rO@prM0?4jMXW=%AtFE+_UuAR;gc$;d)J94O-w zcW9|wsyuBQ%Uy$XU(*|FjddH3YCbPMVRn|>H72A_PH7qXpFb;7fT%?t}{2EgRsDgaKs}C3rM(0o3U?=mu(Nv{+{BtiTA8A*6k_LTI=_koYnNB7xyJyO`o;8 znMgCnt4XAqM5?<)Y7`7cFrqPCWZ!SW)Abep_q8URMJqbcEwbMNE5Z>^!uyjrSb!BM z#&%TW5Snlnt>{2E1G2!1a1t)o>VISPQuCVL&aY#M=|zd+7pp_Ra&<9$ovFt=cwdkH z7_Vbn9N#PQDRnLMeVJwY` zKj=*1|MlWFaY{-JUz>8U3dXpS%2-kpkPh0U7Ge|VKeY~xIE5Cp>i+hdw=-KM8(dD>`b$L z1cDHX7eFU=I91blQgZy-1tO>x&Jc{JA<~XS*tf|-L-Po z`Z4?Lz31%x?X%CGJ;O`eO*hY&4(?L4J|dx^BJGxmL_R9g@dJ_WBGT)m$iu}V3ByH( zY!vz7LXk&Lh>YDSlIjr2o+6UFL8Rz_NZE3cS%*aCT@zXSipVp~BCETI{Fu5M{~)rt zr^t(6i0tD1`+09ektoyOrV$aPbMabtLgYbSqx3A8V)_q?vDJjkwjJzavNaCwq{Q1^ z4H~8lvW;5(ob7i*teVl#>TO05W5>WeV{iRD#nM#_ZYF6-w**<*NRY)umPw43P`PbM zvslFFK5w$5jpHO(n#SJA4Hd-_B9sjDR?{Tv>vUUh9g~F615bTlTGIpY#Fb)6agcH|Nz)-mLxV#?CCEV) z7#*R~a>Su{Pn#N!zT$A`As%ixN`kV)VZM0ZR6X+re&D})~0o%Y0);z&_Rxp5C;)gV=CBh9g@ zs&`){MwR=h{{6g3jeU?pg6yUC^46joDnZ7o1N|}xvRAAsemMl$Gd5NNvy|8-?xJ5U z<3wrh728{nk>(9Fuc*YO660NIVszKx*3p5x)1JsuR9i%_s)b7PFI_Iex?SUP)$nR` z5!#en0eMa5Y91zo@Vb1t$ghN}y9n{`(LP>%V5 zxUGKR2wP022+fczT`fHV7%Wjd(mn8h|EhhHh5|dP1$Ps7_Z@WKkHJB=IscblwSTqZ zzoDLgC%Za4-Pag?mHzuNsPv!nZ{=0{1`YXlva9MF{+5w7ooiY~N{qDBxH`L9Y64RF z;&HsDL(T2u`XUnJeKI?EUt>h`tS*1g_?FMLyL$BPcEED?kld>S{zG`LVfNhwE!Z}y zD$=&?2ODj+o*ix0unk)H;J_70U$Md`vBl~Jwp@{|%EK>H-Xana2I@rgLlRPvi%KlP zT5QFB9K&gx$7QsLv=2i!c|_XxBawtuUlyNo>GQkq4|a*cXWyj~rBB z5uU@(@DhH5Q>{lL+&(i}4OV0R!_#A5r24&$xfqxibIsPy*v0;S_hO?KyC5(^y?*RZ z*j}^UemE7`f#qrfdySD`H>u{M8Z~$x^*D&*ID-qgBBBp|?{LH*0V82SJ|ob(nnVqr z7wNMU>#-fb#_#Z-_!$2~XM)fk4`M*;5$Ir_rfxQ=ab}v+4}HU}@7akcZmgcc;mwPC z(%z%*dV`j5$&>AW|NDQRFBLPf7^?%z`|lFze+VaW4i|AvWPk~@H6Rvdq#z4Ln2QzI zh+Q~@lOh9uPxOOMhz#O$d(bD~bK7hH6L>I@4*rS`D2PB0^v5WqW127e@7dS)|4Fbq ztkBa_Uxa$p!@T#_mp81|ZW-FfXiEsHG{sQ;k}bVkN4p~^UQtId-`ocy>l?HY`JOD_ zR2orjZ)coqutiNMVh`u~#MZs6i!D6#K5g_oPeuPx9KDIJV>Mvnj%7aShp#-jpGa~N zm|w}csKgSi#a8UcF`UMETt*9Dmcq~t{g8xI_+q1jpj2d z`FW^NM5bSYlZXqxFH+DIarhx7h!p-6w`u%7biu=T1miFT zNSnVm zFd%(W&wrDjR9Lnb^TD*ZRr!K^kpis2_g8YIUA0U!JzdK4w<1 zL0ih`>xci{UCN!Py}@rsJXEXO1(q*kt}mO9Rp6S-_TUKKz<8{1?PjQ`wgK_KWAG0|+hG+$x?PPbI6#dcFL$w<@ev z6?^wsgRGu9PPJ@uTf&IO*_(yYj=#!_;_l9lLAdOd5VDbsmP%TzL*+s=`0v{D-PPfN%9N=q_K8P01< zGL#J7OS-Xy_m=xgizk{UI8fI%j%@q#)IldMkbRXSY6nAvHL)seszmQ;k!vmi+q0 z`_F9Jdv^85l~a|e&T3EX=@TL+G)<>YRgNj=dfscN@^h*y>tD$U%5hc=HM`rNHa>EE z(=>OL;GE|21yggB9A{~nw~F4wJ2fh&w4dUv)UVteHz|8u#JHQ;lj6*Yh1Trw>}G3W zqI*UR%*u<%yOA|8-aI^|pkhYYjN26j$;0)z79Yo4bH>H%H+*;^b5e6A4mVrO|Gp{u z4QHtNyD9qJ6#Z_Bez%JLzg|V#dR9@*6z8%{eer;9QMw%$B{oKsxXq#@eJ#qPe-LGSjwqRI z1w}?hHxJnPrfZn1DSE(LwF|cx?9Xoh%U-R3i|U8pwoED5E=qA3<{_|LDWrpik0Tq@ zDSR4hK%<5G;J_d8A-+J9C`E128GSGuk0Tpp@`zIOG>J9XjD2w6kN6N@povbjMQ8NE za6FFeBmKrJ?+0lm;eNg6-)|)eqF6JLkBWfkl#(|oKZP@R2k+xgxPV4{j=$jwuHq(| zxeiTOjo@FI*6$%49neWM#rgn=81%wJ;J<)Yy%U2l6p0v#Wc&!@!52gkEnHmpWcmmB adi_>q$pIH=Rd`of2p71Ay4+Odq5lPBC$5(O diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index 7db6e998f..0a0caa1cc 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -82,8 +82,6 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) : DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue()); m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate(); - m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically - no RTP - m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort); applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true); applySettings(m_settings, true); @@ -97,7 +95,6 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) : NFMDemod::~NFMDemod() { DSPEngine::instance()->getAudioDeviceManager()->removeAudioSink(&m_audioFifo); - delete m_audioNetSink; m_deviceAPI->removeChannelAPI(this); m_deviceAPI->removeThreadedSink(m_threadedChannelizer); delete m_threadedChannelizer; @@ -257,18 +254,12 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto if (m_settings.m_ctcssOn && m_ctcssIndexSelected && (m_ctcssIndexSelected != m_ctcssIndex)) { sample = 0; - if (m_settings.m_copyAudioToUDP) { - m_audioNetSink->write(0); - } } else { demod = m_bandpass.filter(demod); Real squelchFactor = StepFunctions::smootherstep((Real) (m_squelchCount - m_squelchGate) / 480.0f); sample = demod * m_settings.m_volume * squelchFactor; - if (m_settings.m_copyAudioToUDP) { - m_audioNetSink->write(demod * 5.0f * squelchFactor); - } } } else @@ -284,9 +275,6 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto } sample = 0; - if (m_settings.m_copyAudioToUDP) { - m_audioNetSink->write(0); - } } m_audioBuffer[m_audioBufferFill].l = sample; @@ -379,7 +367,6 @@ bool NFMDemod::handleMessage(const Message& cmd) BasebandSampleSink::MsgThreadedSink& cfg = (BasebandSampleSink::MsgThreadedSink&) cmd; const QThread *thread = cfg.getThread(); qDebug("NFMDemod::handleMessage: BasebandSampleSink::MsgThreadedSink: %p", thread); - m_audioNetSink->moveToThread(const_cast(thread)); // use the thread for udp sinks return true; } else if (DSPConfigureAudio::match(cmd)) @@ -464,9 +451,6 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) << " m_ctcssIndex: " << settings.m_ctcssIndex << " m_ctcssOn: " << settings.m_ctcssOn << " m_audioMute: " << settings.m_audioMute - << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP - << " m_udpAddress: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort << " m_audioDeviceName: " << settings.m_audioDeviceName << " force: " << force; @@ -516,12 +500,6 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) m_squelchCount = 0; // reset squelch open counter } - if ((settings.m_udpAddress != m_settings.m_udpAddress) - || (settings.m_udpPort != m_settings.m_udpPort) || force) - { - m_audioNetSink->setDestination(settings.m_udpAddress, settings.m_udpPort); - } - if ((settings.m_ctcssIndex != m_settings.m_ctcssIndex) || force) { setSelectedCtcssIndex(settings.m_ctcssIndex); @@ -593,9 +571,6 @@ int NFMDemod::webapiSettingsPutPatch( if (channelSettingsKeys.contains("audioMute")) { settings.m_audioMute = response.getNfmDemodSettings()->getAudioMute() != 0; } - if (channelSettingsKeys.contains("copyAudioToUDP")) { - settings.m_copyAudioToUDP = response.getNfmDemodSettings()->getCopyAudioToUdp() != 0; - } if (channelSettingsKeys.contains("ctcssIndex")) { settings.m_ctcssIndex = response.getNfmDemodSettings()->getCtcssIndex(); } @@ -628,12 +603,6 @@ int NFMDemod::webapiSettingsPutPatch( if (channelSettingsKeys.contains("title")) { settings.m_title = *response.getNfmDemodSettings()->getTitle(); } - if (channelSettingsKeys.contains("udpAddress")) { - settings.m_udpAddress = *response.getNfmDemodSettings()->getUdpAddress(); - } - if (channelSettingsKeys.contains("udpPort")) { - settings.m_udpPort = response.getNfmDemodSettings()->getUdpPort(); - } if (channelSettingsKeys.contains("volume")) { settings.m_volume = response.getNfmDemodSettings()->getVolume(); } @@ -673,7 +642,6 @@ void NFMDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp { response.getNfmDemodSettings()->setAfBandwidth(settings.m_afBandwidth); response.getNfmDemodSettings()->setAudioMute(settings.m_audioMute ? 1 : 0); - response.getNfmDemodSettings()->setCopyAudioToUdp(settings.m_copyAudioToUDP ? 1 : 0); response.getNfmDemodSettings()->setCtcssIndex(settings.m_ctcssIndex); response.getNfmDemodSettings()->setCtcssOn(settings.m_ctcssOn ? 1 : 0); response.getNfmDemodSettings()->setDeltaSquelch(settings.m_deltaSquelch ? 1 : 0); @@ -683,7 +651,6 @@ void NFMDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp response.getNfmDemodSettings()->setRgbColor(settings.m_rgbColor); response.getNfmDemodSettings()->setSquelch(settings.m_squelch); response.getNfmDemodSettings()->setSquelchGate(settings.m_squelchGate); - response.getNfmDemodSettings()->setUdpPort(settings.m_udpPort); response.getNfmDemodSettings()->setVolume(settings.m_volume); if (response.getNfmDemodSettings()->getTitle()) { @@ -691,12 +658,6 @@ void NFMDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp } else { response.getNfmDemodSettings()->setTitle(new QString(settings.m_title)); } - - if (response.getNfmDemodSettings()->getUdpAddress()) { - *response.getNfmDemodSettings()->getUdpAddress() = settings.m_udpAddress; - } else { - response.getNfmDemodSettings()->setUdpAddress(new QString(settings.m_udpAddress)); - } } void NFMDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) diff --git a/plugins/channelrx/demodnfm/nfmdemod.h b/plugins/channelrx/demodnfm/nfmdemod.h index 06b73283e..5d2562a27 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.h +++ b/plugins/channelrx/demodnfm/nfmdemod.h @@ -209,9 +209,7 @@ private: AudioVector m_audioBuffer; uint m_audioBufferFill; - AudioFifo m_audioFifo; - AudioNetSink *m_audioNetSink; QMutex m_settingsMutex; diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.cpp b/plugins/channelrx/demodnfm/nfmdemodgui.cpp index 12b2d6a23..ed0dc3a6e 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodgui.cpp @@ -206,12 +206,6 @@ void NFMDemodGUI::on_audioMute_toggled(bool checked) applySettings(); } -void NFMDemodGUI::on_copyAudioToUDP_toggled(bool checked) -{ - m_settings.m_copyAudioToUDP = checked; - applySettings(); -} - void NFMDemodGUI::on_ctcss_currentIndexChanged(int index) { m_settings.m_ctcssIndex = index; @@ -233,14 +227,11 @@ void NFMDemodGUI::onMenuDialogCalled(const QPoint &p) dialog.exec(); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - m_settings.m_udpAddress = m_channelMarker.getUDPAddress(), - m_settings.m_udpPort = m_channelMarker.getUDPSendPort(), m_settings.m_rgbColor = m_channelMarker.getColor().rgb(); m_settings.m_title = m_channelMarker.getTitle(); setWindowTitle(m_settings.m_title); setTitleColor(m_settings.m_rgbColor); - displayUDPAddress(); applySettings(); } @@ -358,7 +349,6 @@ void NFMDemodGUI::displaySettings() setTitleColor(m_settings.m_rgbColor); setWindowTitle(m_channelMarker.getTitle()); - displayUDPAddress(); blockApplySettings(true); @@ -393,18 +383,12 @@ void NFMDemodGUI::displaySettings() ui->ctcssOn->setChecked(m_settings.m_ctcssOn); ui->audioMute->setChecked(m_settings.m_audioMute); - ui->copyAudioToUDP->setChecked(m_settings.m_copyAudioToUDP); ui->ctcss->setCurrentIndex(m_settings.m_ctcssIndex); blockApplySettings(false); } -void NFMDemodGUI::displayUDPAddress() -{ - ui->copyAudioToUDP->setToolTip(QString("Copy audio output to UDP %1:%2").arg(m_settings.m_udpAddress).arg(m_settings.m_udpPort)); -} - void NFMDemodGUI::leaveEvent(QEvent*) { m_channelMarker.setHighlighted(false); diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.h b/plugins/channelrx/demodnfm/nfmdemodgui.h index c76a7b791..5dd19ede4 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.h +++ b/plugins/channelrx/demodnfm/nfmdemodgui.h @@ -62,7 +62,6 @@ private: void blockApplySettings(bool block); void applySettings(bool force = false); void displaySettings(); - void displayUDPAddress(); void leaveEvent(QEvent*); void enterEvent(QEvent*); @@ -78,7 +77,6 @@ private slots: void on_ctcss_currentIndexChanged(int index); void on_ctcssOn_toggled(bool checked); void on_audioMute_toggled(bool checked); - void on_copyAudioToUDP_toggled(bool checked); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDialogCalled(const QPoint& p); void handleInputMessages(); diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.ui b/plugins/channelrx/demodnfm/nfmdemodgui.ui index b59c3e9f4..379ec2059 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.ui +++ b/plugins/channelrx/demodnfm/nfmdemodgui.ui @@ -589,19 +589,6 @@ - - - - Copy audio to UDP - - - U - - - true - - - diff --git a/plugins/channelrx/demodnfm/nfmdemodsettings.cpp b/plugins/channelrx/demodnfm/nfmdemodsettings.cpp index 16914fe91..cceb0540d 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsettings.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodsettings.cpp @@ -49,9 +49,6 @@ void NFMDemodSettings::resetToDefaults() m_ctcssOn = false; m_audioMute = false; m_ctcssIndex = 0; - m_copyAudioToUDP = false; - m_udpAddress = "127.0.0.1"; - m_udpPort = 9998; m_rgbColor = QColor(255, 0, 0).rgb(); m_title = "NFM Demodulator"; m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName; diff --git a/plugins/channelrx/demodnfm/nfmdemodsettings.h b/plugins/channelrx/demodnfm/nfmdemodsettings.h index 3b211da5e..6fef3d3ee 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsettings.h +++ b/plugins/channelrx/demodnfm/nfmdemodsettings.h @@ -38,9 +38,6 @@ struct NFMDemodSettings bool m_ctcssOn; bool m_audioMute; int m_ctcssIndex; - bool m_copyAudioToUDP; - QString m_udpAddress; - uint16_t m_udpPort; quint32 m_rgbColor; QString m_title; QString m_audioDeviceName; diff --git a/plugins/channelrx/demodnfm/readme.md b/plugins/channelrx/demodnfm/readme.md index f160f5800..38c63ba6d 100644 --- a/plugins/channelrx/demodnfm/readme.md +++ b/plugins/channelrx/demodnfm/readme.md @@ -58,12 +58,8 @@ This is the tone squelch in Hz. It can be selected using the toolbox among the u This is the value of the tone squelch received when the CTCSS is activated. It displays `--` if the CTCSS system is de-activated. -

13: Audio mute

+

13: Audio mute and audio output select

-Use this button to toggle audio mute for this channel. The button will light up in green if the squelch is open. This helps identifying which channels are active in a multi-channel configuration. +Left click on this button to toggle audio mute for this channel. The button will light up in green if the squelch is open. This helps identifying which channels are active in a multi-channel configuration. -

14: UDP output

- -Copies audio output to UDP. Audio is set at fixed level and is muted by the mute button (13) and squelch is also applied. Output is mono S16LE samples. Note that fixed volume apart this is the exact same audio that is sent to the audio device in particular it is highpass filtered at 300 Hz and thus is not suitable for digital communications. For this purpose you have to use the UDP source plugin instead. - -UDP address and send port are specified in the basic channel settings. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrgui/readme.md#6-channels) \ No newline at end of file +If you right click on it it will open a dialog to select the audio output device. \ No newline at end of file diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 78fbe3b88..84711b135 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -1539,15 +1539,6 @@ margin-bottom: 20px; "ctcssIndex" : { "type" : "integer" }, - "copyAudioToUDP" : { - "type" : "integer" - }, - "udpAddress" : { - "type" : "string" - }, - "udpPort" : { - "type" : "integer" - }, "rgbColor" : { "type" : "integer" }, @@ -18063,7 +18054,7 @@ except ApiException as e:
- Generated 2018-03-27T12:01:24.051+02:00 + Generated 2018-03-28T09:34:59.109+02:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/NFMDemod.yaml b/sdrbase/resources/webapi/doc/swagger/include/NFMDemod.yaml index f42bbbf0e..7d18d0cc2 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/NFMDemod.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/NFMDemod.yaml @@ -33,12 +33,6 @@ NFMDemodSettings: type: integer ctcssIndex: type: integer - copyAudioToUDP: - type: integer - udpAddress: - type: string - udpPort: - type: integer rgbColor: type: integer title: diff --git a/swagger/sdrangel/api/swagger/include/NFMDemod.yaml b/swagger/sdrangel/api/swagger/include/NFMDemod.yaml index f42bbbf0e..7d18d0cc2 100644 --- a/swagger/sdrangel/api/swagger/include/NFMDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/NFMDemod.yaml @@ -33,12 +33,6 @@ NFMDemodSettings: type: integer ctcssIndex: type: integer - copyAudioToUDP: - type: integer - udpAddress: - type: string - udpPort: - type: integer rgbColor: type: integer title: diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index 78fbe3b88..84711b135 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -1539,15 +1539,6 @@ margin-bottom: 20px; "ctcssIndex" : { "type" : "integer" }, - "copyAudioToUDP" : { - "type" : "integer" - }, - "udpAddress" : { - "type" : "string" - }, - "udpPort" : { - "type" : "integer" - }, "rgbColor" : { "type" : "integer" }, @@ -18063,7 +18054,7 @@ except ApiException as e:
- Generated 2018-03-27T12:01:24.051+02:00 + Generated 2018-03-28T09:34:59.109+02:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGNFMDemodSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGNFMDemodSettings.cpp index bace31f21..7f142b703 100644 --- a/swagger/sdrangel/code/qt5/client/SWGNFMDemodSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGNFMDemodSettings.cpp @@ -50,12 +50,6 @@ SWGNFMDemodSettings::SWGNFMDemodSettings() { m_audio_mute_isSet = false; ctcss_index = 0; m_ctcss_index_isSet = false; - copy_audio_to_udp = 0; - m_copy_audio_to_udp_isSet = false; - udp_address = nullptr; - m_udp_address_isSet = false; - udp_port = 0; - m_udp_port_isSet = false; rgb_color = 0; m_rgb_color_isSet = false; title = nullptr; @@ -90,12 +84,6 @@ SWGNFMDemodSettings::init() { m_audio_mute_isSet = false; ctcss_index = 0; m_ctcss_index_isSet = false; - copy_audio_to_udp = 0; - m_copy_audio_to_udp_isSet = false; - udp_address = new QString(""); - m_udp_address_isSet = false; - udp_port = 0; - m_udp_port_isSet = false; rgb_color = 0; m_rgb_color_isSet = false; title = new QString(""); @@ -116,11 +104,6 @@ SWGNFMDemodSettings::cleanup() { - if(udp_address != nullptr) { - delete udp_address; - } - - if(title != nullptr) { delete title; } @@ -159,12 +142,6 @@ SWGNFMDemodSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&ctcss_index, pJson["ctcssIndex"], "qint32", ""); - ::SWGSDRangel::setValue(©_audio_to_udp, pJson["copyAudioToUDP"], "qint32", ""); - - ::SWGSDRangel::setValue(&udp_address, pJson["udpAddress"], "QString", "QString"); - - ::SWGSDRangel::setValue(&udp_port, pJson["udpPort"], "qint32", ""); - ::SWGSDRangel::setValue(&rgb_color, pJson["rgbColor"], "qint32", ""); ::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString"); @@ -218,15 +195,6 @@ SWGNFMDemodSettings::asJsonObject() { if(m_ctcss_index_isSet){ obj->insert("ctcssIndex", QJsonValue(ctcss_index)); } - if(m_copy_audio_to_udp_isSet){ - obj->insert("copyAudioToUDP", QJsonValue(copy_audio_to_udp)); - } - if(udp_address != nullptr && *udp_address != QString("")){ - toJsonValue(QString("udpAddress"), udp_address, obj, QString("QString")); - } - if(m_udp_port_isSet){ - obj->insert("udpPort", QJsonValue(udp_port)); - } if(m_rgb_color_isSet){ obj->insert("rgbColor", QJsonValue(rgb_color)); } @@ -347,36 +315,6 @@ SWGNFMDemodSettings::setCtcssIndex(qint32 ctcss_index) { this->m_ctcss_index_isSet = true; } -qint32 -SWGNFMDemodSettings::getCopyAudioToUdp() { - return copy_audio_to_udp; -} -void -SWGNFMDemodSettings::setCopyAudioToUdp(qint32 copy_audio_to_udp) { - this->copy_audio_to_udp = copy_audio_to_udp; - this->m_copy_audio_to_udp_isSet = true; -} - -QString* -SWGNFMDemodSettings::getUdpAddress() { - return udp_address; -} -void -SWGNFMDemodSettings::setUdpAddress(QString* udp_address) { - this->udp_address = udp_address; - this->m_udp_address_isSet = true; -} - -qint32 -SWGNFMDemodSettings::getUdpPort() { - return udp_port; -} -void -SWGNFMDemodSettings::setUdpPort(qint32 udp_port) { - this->udp_port = udp_port; - this->m_udp_port_isSet = true; -} - qint32 SWGNFMDemodSettings::getRgbColor() { return rgb_color; @@ -413,9 +351,6 @@ SWGNFMDemodSettings::isSet(){ if(m_ctcss_on_isSet){ isObjectUpdated = true; break;} if(m_audio_mute_isSet){ isObjectUpdated = true; break;} if(m_ctcss_index_isSet){ isObjectUpdated = true; break;} - if(m_copy_audio_to_udp_isSet){ isObjectUpdated = true; break;} - if(udp_address != nullptr && *udp_address != QString("")){ isObjectUpdated = true; break;} - if(m_udp_port_isSet){ isObjectUpdated = true; break;} if(m_rgb_color_isSet){ isObjectUpdated = true; break;} if(title != nullptr && *title != QString("")){ isObjectUpdated = true; break;} }while(false); diff --git a/swagger/sdrangel/code/qt5/client/SWGNFMDemodSettings.h b/swagger/sdrangel/code/qt5/client/SWGNFMDemodSettings.h index b4b689a66..8ec59c048 100644 --- a/swagger/sdrangel/code/qt5/client/SWGNFMDemodSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGNFMDemodSettings.h @@ -75,15 +75,6 @@ public: qint32 getCtcssIndex(); void setCtcssIndex(qint32 ctcss_index); - qint32 getCopyAudioToUdp(); - void setCopyAudioToUdp(qint32 copy_audio_to_udp); - - QString* getUdpAddress(); - void setUdpAddress(QString* udp_address); - - qint32 getUdpPort(); - void setUdpPort(qint32 udp_port); - qint32 getRgbColor(); void setRgbColor(qint32 rgb_color); @@ -127,15 +118,6 @@ private: qint32 ctcss_index; bool m_ctcss_index_isSet; - qint32 copy_audio_to_udp; - bool m_copy_audio_to_udp_isSet; - - QString* udp_address; - bool m_udp_address_isSet; - - qint32 udp_port; - bool m_udp_port_isSet; - qint32 rgb_color; bool m_rgb_color_isSet;