summaryrefslogtreecommitdiff
path: root/sound/core/pcm_timer.c
blob: 11389f13de73ebadd9e4d95a2ee102c67875073f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
 *  Digital Audio (PCM) abstract layer
 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
 *
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program 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 General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 */

#include <linux/time.h>
#include <linux/gcd.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/timer.h>

#include "pcm_local.h"

/*
 *  Timer functions
 */

void snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream)
{
	unsigned long rate, mult, fsize, l, post;
	struct snd_pcm_runtime *runtime = substream->runtime;

	mult = 1000000000;
	rate = runtime->rate;
	if (snd_BUG_ON(!rate))
		return;
	l = gcd(mult, rate);
	mult /= l;
	rate /= l;
	fsize = runtime->period_size;
	if (snd_BUG_ON(!fsize))
		return;
	l = gcd(rate, fsize);
	rate /= l;
	fsize /= l;
	post = 1;
	while ((mult * fsize) / fsize != mult) {
		mult /= 2;
		post *= 2;
	}
	if (rate == 0) {
		pcm_err(substream->pcm,
			"pcm timer resolution out of range (rate = %u, period_size = %lu)\n",
			runtime->rate, runtime->period_size);
		runtime->timer_resolution = -1;
		return;
	}
	runtime->timer_resolution = (mult * fsize / rate) * post;
}

static unsigned long snd_pcm_timer_resolution(struct snd_timer * timer)
{
	struct snd_pcm_substream *substream;

	substream = timer->private_data;
	return substream->runtime ? substream->runtime->timer_resolution : 0;
}

static int snd_pcm_timer_start(struct snd_timer * timer)
{
	struct snd_pcm_substream *substream;

	substream = snd_timer_chip(timer);
	substream->timer_running = 1;
	return 0;
}

static int snd_pcm_timer_stop(struct snd_timer * timer)
{
	struct snd_pcm_substream *substream;

	substream = snd_timer_chip(timer);
	substream->timer_running = 0;
	return 0;
}

static struct snd_timer_hardware snd_pcm_timer =
{
	.flags =	SNDRV_TIMER_HW_AUTO | SNDRV_TIMER_HW_SLAVE,
	.resolution =	0,
	.ticks =	1,
	.c_resolution =	snd_pcm_timer_resolution,
	.start =	snd_pcm_timer_start,
	.stop =		snd_pcm_timer_stop,
};

/*
 *  Init functions
 */

static void snd_pcm_timer_free(struct snd_timer *timer)
{
	struct snd_pcm_substream *substream = timer->private_data;
	substream->timer = NULL;
}

void snd_pcm_timer_init(struct snd_pcm_substream *substream)
{
	struct snd_timer_id tid;
	struct snd_timer *timer;

	tid.dev_sclass = SNDRV_TIMER_SCLASS_NONE;
	tid.dev_class = SNDRV_TIMER_CLASS_PCM;
	tid.card = substream->pcm->card->number;
	tid.device = substream->pcm->device;
	tid.subdevice = (substream->number << 1) | (substream->stream & 1);
	if (snd_timer_new(substream->pcm->card, "PCM", &tid, &timer) < 0)
		return;
	sprintf(timer->name, "PCM %s %i-%i-%i",
			substream->stream == SNDRV_PCM_STREAM_CAPTURE ?
				"capture" : "playback",
			tid.card, tid.device, tid.subdevice);
	timer->hw = snd_pcm_timer;
	if (snd_device_register(timer->card, timer) < 0) {
		snd_device_free(timer->card, timer);
		return;
	}
	timer->private_data = substream;
	timer->private_free = snd_pcm_timer_free;
	substream->timer = timer;
}

void snd_pcm_timer_done(struct snd_pcm_substream *substream)
{
	if (substream->timer) {
		snd_device_free(substream->pcm->card, substream->timer);
		substream->timer = NULL;
	}
}
,lsSoG6X9V=$wCJwG_)Χfk5 ܗtSN0[FuTB.k8bqSG'+;3wѺ,8yaaujwk9- Lɇ{{d0T9R8Aʬio/;nr45N3C^[Pm^,v^sj@8#\D _S,Mf-[! oop=84>pA^GjV9*yQo;xya*}-Az뙸R.' MtE muԮƸbzj:}<-R[rξ "|PT٢ dy{<9}E\ifo:Enq}^~@ý"#!? ?3Iħ?.s<@tw$D]JICq"l~k.vNrG2L^v%64R=04Vv|)rkƟ9_cYX&JŚCa~}:a̹] 2 )^F{Bd|WO`RvtbSsnQ3Oƛ ?K 0>1c 8=1NlE}x ?^<6_* G&C#gQOбՆ=N6ໃɟh2tly|ȋNϧڤo=~wV#|ԿҤ&(f^31B}SM '] |ǿsWu6e!lt2ms 2 ix"Fi^RdҦP8||b$ lsń*{tX!~{G.~B2A-akwl4X*Y^[[|C[4 NabzyM RCO"X _(qhqSrLr$eaS bF;ԐzY*Vyv܊j;sZAC@0b| 6 .u8Ծ>VsK&mtoOXt@jB ){U3Z'O.E@cPɁim:_9|Tec/8!H?e=ol2s;/ms|<]ZxVA)(9jm>+ ĀHo5l B#a:;oG_J_Ҋz=u~BU͸^$Q~SDoC/|6( -Pe\nu~>bE pQTihE$n(zK8Os٧=jP>H;lٔ0Lr {CSO&F;jwLz2nWc!X vEsYF(yߵCe3AG+jk\k""u(G.ԁ2F3x_}woϳP$$&s\"a`mt8"vdNTp s)Wq !Ґ;ps Zqccf_}籔|93"A`veQ[gnc~ᘿta $*2reϑy}/Lӭ -mvNd9_(]P/äDχ|uǐM3oyN eg#mbok i5ދ/ѓ̇f*U"6m/LP LA^ )UA3[f`ٿ+p?d4E4Eo~*d\9Q8΂vt{yکLxB-0 \cRBqSF5! sßx+J/J䝖/Mvun#ڼv|:Vrͧ2/н]o'ɲ[ FȷQ.`Qcde agm)÷QQ57*T[ټfGT?8NVꝥyC@@t9X)Ncc\?s;Naaf\92 2WB/[U  kD?`VqD\!!VŅ|c[B}}fPͶƚT$hh?ik$#mR'T65Ѓ:,,;xIP9wİg$vf+.S Le2&PS{ ^yx#cm_2lW Z/HɐP^l!,7!0i`T4굫eBI+RvG qsf5Laa3X$vst1<0Lr@ #Cu4#lѱ"u_g?x󵼽б$AVi#[Jd::ӡ`ޓ{vθu kX\b9}"F /nxǫ>/)͟vO F03Ͱxfw ҚzmYeٗGYvO81vrD{)88' ǯ!҉| 27c̘tt{<ꄎ*>)nd:כn }0UƬ9bS0[-b>X(ha)PEy[cr6D1>:(h!]!SMHNtifpXVgi;,ȅϲ>a'X>φ(+>(v׸㏇e.^8ط`7^9oMv^:rU!:[([w7eg 1&7pN nYIx7q{GfDAshR<#-;T.-') mϧ#uQ;ZX3uj9jCt:Zo)ssdCA1II [cg@טӦ hԁ"ft!bwiuB=K~;oajA=\@ "'=4{==Ys7tOokW׹ݾFȅ;8G*࡫TdC@a-) {dWxWT3Y 7m= LVJts߽=é`/!ȑQbQG9MyձԹ~G3Xa7]aY_azE᯽Zg.}4窿 o;OgqՀ]u=+GǛ8̀stmANg z_*M3KxEˮLkzKPѨ7Z]>Żm.xsh=F;D9Fbh3ڊff [ⵋHFt5ې[ ҝUKw6:l\خHqczy|MH2~qF ~/ξ?ϠNs}t!~a3?yU{ jBbV|7ȝDn1*f`vYCEi`9.!)"}'з? )aʄtW~u3s9HTFx8l`o +3! e.O#ٷ n\Ϧkʈ—]gIt<)b#KDlK!Yup,PEaɆ0_}?Ph4*z?6-?60as1wV ;T;-MWj!$-wB.pqǗ$GoRut+gmC? B6߲u7=c :"QP6LÑ骺u.Co@Bj(!Lc]=+mN,/A(荿pafwփ o1o= ķ âkO{&)\be#8qwizw5 W,e!kuuHP))x QLzlrU\rC66.W"0NIZd =xmLVuBd?s=RuNuLN2LP2y<4|F>v|:#Lp.*e48]׶(ӗ. VeL@֍VXКFק~nn px2c< cwscל O]r\i1}D7y2b3`_(Z:[mgѭS}@ ^`Lr( @XwYd==HUsL" ~c` v=|OO6 l OG޲n"m`U/boefG?\o20faU[⯚ VbŠw^³AIp>2tpM$>8'wLsq'UeM {7Rs%^{=ф՝eW4ϙeb|\X6 u|b Il/~q,+P[)H-"sVfpc36s+Ȍ._)O myooןR VmAeԜ;,\瑉6T&".tAX-}ϳ+/YJeH59[![bK'pwsV}/GG.F~Gp~M./%X?ͰsؐϞ9psj!xg{R8)|9,,30: / :s6@9s1itrG\ng@2n<=&c2e=_NՁ=Y~H<r7:cuf:wEݙOv9u^XYȤɰ!40G3 v}- [h5GYSkaʕqw VFxv瞬`ad]_-Vݮ%:8ĩe!i_#3q+ ,k 6AdxM dD aK>Q,4zHyi (|[Ew'j]˪0%-B't!`o3r[i)ö\NJ#q;6oo>X!J&:V|+n4-uKY} Bzr#'șE/tB/Q ;4ruu4'cz*ݚ"W#| ϲknT128]J<7+Q@ŵyMz%|sPW:pEu@gMWw)+nc`wڊ.m"?Of .F_Ք}B. :ߴeDqKǿ3!*#~Tv;ͰnWkH:z{>7\{\19^,y/(|ل8d(ЄGUَb|Ƈ3df@ )h!p-hH sw,M76`ZK[ oJ08Kㄑqb]uԿ>i;  Ok`J>(y8wڙ/q2W7&gfDXeC(>Uď.+f!09F<#/u`+&O_rb* "zCmgͰ9/ժ?_`+iw$FWjQՙӌ]vB}e$$DNk w4@ᘝkFs0>狌jcvj.`"|{JDO~%l`sYH6ƟF?o&p#留$/` R 7GRD9 ]:%d?9"!|b" 46@i"\=[S ~ddiQE/~Ou' >P-.oZ )G@H. ;1௤GH]Q!ϙΧ-Tq{ǭB~c/Mm_ȁ 4ڞsˈ$@ \,b>=C fI-KT=UzH&n2hw|&cg>7k~슍>^!.c@Yv5.s꟧h[Ƣ6ضS aKPyiλ@ u^Kp0OQ^8I~ c5'N@:#2SB0f73l`YJk*E5s Bɖ'ёg{ ]٣ FZXƉ~i]Z4-[xTЅ4Jb 8q ǚ|ԞN$(̾F a!!ߥ°}=Hy_bC|:@tPQ]ءbA:>};Z $јόw9|7܏P Oµ6#9h+u1<Yl%յsh"R Gk*_A>׾XKEjC'dĥ`O3VgKڂC?(h$vuX{"r+\H 2P'^y~ɞ)߽lIZ?M՞˾% }W~q#åDvx~>h%$(%_;3(GHBy'"yD4=5 DHp!tn)t(>ŸZ9AigeX+kYS-Tf@S`ė0 \UA]?dECM! L#`ɏܜ0KQYiYI 9 PV46 Zd ȷv(1|RDQKx񃳱RJ6q 2a"#<4aV#BqPߞPņ-M-e&D~@9x 'bƃ?aS.S= #`yl &gW\E61+"M UMgo%A>;Hq;ւ'afa3{!0H OxqLd')?Щlt:nX&gM3@hBߗi4GEgB٥?iE&*.,@|˲O5_hv,,55պ:nt#bJ}+@'zk3lYֳX$F7efbȦ>wnnϖ݃ Zf},Pv,0v\^χ9ߕ.n~G# 0k9Sex@|cnGڥ$nPڋiVnu` 0?/1zyt:-NY+NqC 6Sl$l Q ii%V?ED|I|by2qgĒ*pǁS:y;e1%|P6ɹ tOl< ML'^ue3e#W: 7.[܀fPqٲT'׾|({Xq/f3  mAȌnދrXWnpRl~9G9򍼺^?Ck {SS{fYV^kSf_1A7;kXue q,dDi#kտ4Kɥ8x|S)3FȲ3ISZKmeNqFۿN6']>a9҄e@gwFE;1G7f9:X7#I:։hNb^9b3sZD;N_Zv:Ɯxs*97}eq̭Q-5xc ~u|"`eFkgr\c7Lܸ>`8 [-m1GTm-]pv 8.j"vfaT]ڶ%y,O0p.qG7(ԖMm[ e#5 8P07iJ 0p3+(H۳dYi!TqZy7#b.emr:s 豧hy:XP4pD Rɷ#;|tsnz/*WÂTe'Pc4sXE~Ѫ;[I"r"5xqE@r>XrEGi|+|*м9#uHZrzoݗ]]Pdٱy~SODd[>Բ/(!ܐw%GXRbaRqO[3T'hp>T; Cal%kEЀT9rݲ\t(A`,m1$wJn>=ۮ˧onSv. z07N h1[b7+^xRYvDdߗ"N)unsQHw?>#'bX kXKU}61/q|;aj 땽xČ֧w:}ʤ[C ;ϥ<֜]qPkpE|WUۚ3 r 'Dpgɐ68h?"ݚt856DbWErU$FrƎ2,At][,0+n2F+EHqD`ދLN`qPWljzt;bJymQa+Qꤱl̨=>.v 3G&{ rae [ J.c(~V[c]<` G~1#Z!s$AVnWKv0$.mJ js̏n\N-A9~Sc]:8LY0qRA.[XN vF&H"Gxgq*Okz̪@\qL /H#eaIZb,`2bt%h|᪷Kl h9uX21`WDPvx@Fp<,Bt`E %1㮎~)VbP@4f!y4?.O˕twg/[*=ɌJD& 1ATH#2k`gkc\ fju_vdux.He>G8y}3.2@1*JMsO. )e 2MTYA%X) wW?g_'=ֻ!Pv)c4.n>W/J "V"1ilݣhƞA^\0[l={,@Wf٘\2z&694AqKtGp×XIXy1yij i( *WsH( )Y l5kx.R3+ӥюc+hz2"YsFXFMj2Gvj-4֋qFCc3.G 119f5vE5+mT4ß4_k*}tmZ~ep owK0#Z"Cs"님<z<0+[h7NG2\ 'WU7!=t뤚 J&pi i9/Y Xnϱ!8Iz|9acNt>}<9io6rX@ACf0nۚK4*B# $p4kz* 2K!xddc/*kKL12| Q^XЕtcI>$b aAKT f>cՇ9G!\X_l.Ιix`§耼 eA?g3bg6R9Wl(h7=J  0Wضoю}]sRrj6N(љvo=wW7EEz4gsJ(1 ǿ<E1[DP H^2%32y8fCX[\ `Poϱk݊G~oNo_?Tq2Sv(L-\fѴ}CTSP}~sQG{O v~ϾU?wXE\9 {|oWJ7RùNcSzݱZ@)&?Ə,K*PFesϾ@luXO`ŏBtopN`vB B M q>d`\U>,Xq&TpSa>:j(u\V)-b%B#DByd2/96D_PGk T^Hhem 1{d0> g1r MA,0cS@C9\gLlλ@預=Z|^$-o|!E9~Y ek_pUA. 4j\UI fZF_SӜyuȿ*B55K&jbɰn|*C=>;6fԌe'.NnݮU[UenV)C]TnyY]jL+)؆ma94W n\5%G1bKr?YqN72 < >d&| w~t\mPtUXDVhu3廇 ~`AXhg8}||e(c-Im6;] 6o=eՊw s1|Xc k۬M>l|X^ ći0F ~DjxwL$G4:< 'Gg)C6HTp!2<޿#ɥv_zrJC_?$}9n<2{qI\mx+dAA HD3 // iP$֚JP#:q9;W"m\>S5b icz_FX8~ڗIvHwGeP ۟@" 5)7{s/ @f8i8AD7Hrl=0 a +_zJUp_f?l~C9>;,6jtt#iii6fuc.cTc/Qܜ4n:tXEo-mv|6P0ѱ;h0pϒe\Ovnk :4|/!fqq:4AYj]NJ6ϯS\Mr{ `kgMj4(yX8C uɘ lPFpwr?WKɂh·@U$C CEdQvB^RT6%UM 8B ] [FucQ5]}dwt4I`e&qc>.G߂)˙'ǷwN#01i d#'%Ɍ2Jd+uu0hm0REbrVB5(O)ķGh\_LP!Tв(ED8řLG,:xb' 6n6??,\YŬqʧJaeՃOsvAMyV'VQFaḟvFgrEcȻswkchʡ]Li !ߔ5ޠbY` M4pn&4euڮ4XR4C}EhF)>(l eu<$& h ZCPp,1_4#,?1sT3)9ƆO-Z$wBxcgV4pHb1! {^H kvD3W)!51RzBV6ƃBK:E~2S-_)߻7vJ\gO/u XMdl8:EzHSwa8LԕoȽ@ ڥ9P@g`?}L; Z<3W뷝jHA@y's6iXMxH3R_s'c vr]IfnbPXQ)aͶ%>^B]C 0mjO,lQXq}Kwl[^ɲp'.vo'p+j |O<1fB]mmVjf퇚NQoyxF/u`o/`b:U];qs20 ]*SRBUf;Ce"4/8/W(k-a]GCԲVqY (}pELgT`b(!`ةW.r*=80gYL-pk;Y>疔LgS_Ⱦ73y*Q݉k>?6ΕnO^:}GKlקva?/Ϲ3Ȍ6)08lJhI:FpP3nj|#az\Itt/%;jJR#IfLcd9w JrhCRf] c%*Ř^%`=Kj2r?ᲪZTJ'ոfg+PBb\z.E,BCkO /nO9V)MU~>Iߛ>Md8F~5ZRG2JfS!t?#)(+?1\bw:)eDeLf{=)Lbsaϡ9-i [Llk.Q.ϳ&)S yzx'mS$lUNr^AdOj_{oq7v:y_C*2I=(8@VgH2?'jK?Z:$pN^fOzzs}Z# ga]L&i[ U8A%奲&IlgЦS,6Ч (q S+_4hI1Ɛiq||9~aKϳH?M_&<$U-3/5[-A L +IV@a(F Jr8,G`C5I;|iXh s0pXoNd F=9D}'ol3"uuQN$tZ-(]Evo<_l2128!.00X&jFoJmZȵxA#Pp;NQ]z7"ՊLXuSqXBb$CabUEG{ 42y!rD˦A=Ew "irȥmK` J{qb]E5XF ?u1:ß3 좨G1Y3?m^e-+|,z"f5W1F,ỳr"^X r<-Z$ESel=>O֊r?4uݜ9Q'*}lş c \ zhPܤϱZ@t\R{ҰM <!~c[c{011R^/JBrc'R+6q-R $s0Su4=Y𷕜e7M鞾C.!8V"Gl;^ 6.ckCBd"1aXhHY9PFPfij"4V~HA_;ҖICbSem-08$U@bU7?xGh݄|&R 3*C26m>>рW{(_WdJlUhe/7\GüãɄbg@~cOO:&0r2 Yl8*=>1%o ްB팕n.6B|_Ib05eCi&$?|{F)~.T{,bdf^5!G=`ɯGtwpW= 2?\H(0:t{hS(.xSԈ ໔GS-,ƹ`LvKg~zGu 1}2q4Pwa)*rE* >͝q `y'Bfq2~nXD^Ȇ3'7y5$5pI@PI?:~Z̠- 4aZǤzG5ඵc:){cS‹Vdvbg qZ"z\r)Eq|nZUskK'lk#H<'g H!GὈu8sXLs Q ۩=_Ĭr?}Qѣk/Sp20M{t5 rs.RM:>g`2йQH5<(.tV|~@b4҃F 3P!!b%+A"̒!ބwC?Xo5Gfj944Z `yGhELZ_Baxpj?q= Εz_,լ?/s/6FMΚJY<3~2’^=5!"nKޣN0=KX!Q&d5M#qW.R8|knػnn+~!"ID .K9G+UL^|X`47!f|#&bMtDs4;$h|y^buSWո>g +}r3Dv<,0s7g$rP9$$Zs~-]֕6 rͨHfwbْcؔW'}u::CG}cRHNfŶ/@cYǯWK*/Y7h [$E 9=h,- @$i=:"np0 dX2D $ɝVCDc]yE*^2hFl\a͋hII +e)_c\\@ y\CnJNc:tn!("c>;*G.hXXqclg{ j/_I+W$8t5uk*,ahsASM=e/Z0yraJXgvkLĞ"q1.òBOak)(Eq|CTk\7~=I<|ޙִPDT8q$!ipݭ1K.ȣq(Ŷ@Џ4ѢM4*&.HL pc"hES8n~I 4|a/TW^t=@}WuDD%]psM"c{[]\Tۃ~գz&sCL>4SV6TѦՠ}pDGkwCۼNopx?ɫS|'N}EH%8J3s- 6C2J5}UֳozxCwruUN72$֞3Z0s/?|$=<ǍR >3o -E!Vg,ǯE;]ZP !qZk9)ƭ堗:W;)fFK(1MIm鵝fxptӏokefB?#$t A Đ哫_"Qrf/̍xT7:bOGpeH~m)*=j A,Fd]y&ikWKu  ZN4 3wZԫvC>(H-98z*Nc ˒[ &fjU8))B56 0$0ّݸrFha-01b>O܇y7We9AA=;C ‰]Nj3*-TdLؾC*RFĺHBҲ;<8znr&H>' n7 +{ח{|i˟Õ#g#9ɾٹ ^?!3uַRt,/~LKoJA&a$'g?ރV:x 6 ,+ ٭`P^9~[Bӡ{Ng~>~Yi#!y&URu\ +X$9^JQT1+|T?]V7KE5kCe OazG>m,{?+l q䖘n(8 =d[h sǒ'(Sy˃L‘*CF0"̭;p=!]kvXs(Jd|p~'=LRL @ys_h~6IW?,j:a[ ~uփWBoqOboq{lRߖLDuWwx'λ D fB Cf>wwu쏟ٴuncw:@p/4:yFВ&swRFBHoPp= LB15hR{nqKo:~ϛӃL='ZOOrT_5|Z\/0d-y,m(@n6(8,[&v~iOTxϧQ?cFjAu dSKԫ8щPŜ0H#@3Ljh]"ubkDyYD(/;$!b3 ֋)`_{~}}3 fS6WR!my78D3K΂aҗZoto7#VnTB-w[2Cj4NgybPs/7HK;v㩅_ +~t2q<i.]~{G!]TLyY{,cnm~-yyQ'jW+"~~5bD~ZP+EP Š/S|_8TH -j6b?ȓ7;oj)<S9c)YyiM\u{-*@~n馱gF$`z01-v #`+xJ̴K OS&/pMQq՟[ n;Fo3F+\9RP[ ɓ}IQ>$sm|h;>R+ An&f=a2)*`<by&¼8cY{#FT ݠKN6@eyȂ dxrL9KSlj,uX t0zt\H,2 H#@s{aoZJJq a9W`ÚxHO1@ɹo̔vNT='紲n+xj#uA0\!UtiS|Lh~d_s+{V%3$:BC85;v)XВ_Y;h'u1Lbv3DG;TlC5SP.Bwh !!boZqnSf\o:@U~]6 7ªI'gW@Gxrt黠ܢp7W1Aa~W^.z MB\Qoz>$qh7lknTԜ!#P Gr %#W H"~T\E!ffg;eLv@(APK@ZAQ4+f o#z6~w,u$"Z_S32Nῶ !#n8Sǡ_8j]6IW $9|^0r(HUD 4"Q`8odfD.mkͣ!MTsgiF#>YR蕁{bř!8p}=^{u0\ˤ~[~mtl2_e>o ͉֭1=>V?Obg> |zDiɍi0J rbwlMV<*I?"˴{ANB2`؋W&@0 dGڤ?& St xC`ByP7fcT|k!WA]R?!07Z3L̈xFj|U~Chgպh_18؏IgS\[Vꋌ`O6e28ڼ5b;8 ᳜,=&mPw a dH6&b_/ }?(t gLSMo%uȷ ic$(g_SC݃rGgjiT nnM+dER: C+kO~㙀fFd&HF`ņ.TE58/3 ƜPHv|>, F*7ۓ]A SEA L5R>.wB0i4^rk`t<}s_N_`D4U/:hqů721G?E{gAceec} 0oQ^̿X# ["3;B!QND7AM#)]/vr/u=M="CG% %̞dJ >if:qsQO_ڀU;uxaRU5BhHaxDPh*l$iF^1̩6v3EeZAJ4'ޙW ,Yn^BMYf5bC,P}r񋓟:]:*Ԧ+ ώNsqGy6"2PRQ<# ܯ,hclqǛ>&]p{̧vm!02<[}]7h^uNvrS\MY;&If):z٦tqGr& A(o1{5(m)6Bj X0^$sYHHoGuS@KRڢ>񁈘 1̃J~ ѭ+y$1ӿDHuw`<7/`"aPb"z"=V zV=$A wqƺK̒S'͉ C9@f _bPJ;ea Ab[B=KV,-p>M(r>g[bzPL@MW[;X?SDQF&Î$ d`& rsOWn2eȢީ9/,0>'f'G]?^06HΠA!vEM]fk1v>TX 8֞_e'P{&!tjqýK { \󃅢gq 3NϭeTv J]_S *Q8 1aYT)&&fzf |gosS"XԙW(ȼE}ך&qGB{ac+O9O$yq2۔ɓo\.85=s;[ޞ⛧xSk,c7{T&MqsJ JgcC KTMm wmJԕ4@}b1\f:"3!Ld:Ȇj}\ uƒ@tCJ\jD0!ݜUw%=FPnu}N~J8-ӆU&_1ap妭P9)W*DJ_9h:N s`LcfڣluB8H1[q#S/i6p?xP.MVuKDC՘fY9 uc?I%V6qܷ)K!̬QOF*1sd;DD6nF̚Ӈ iqx]A%=V%.bf'3h|+j Ωݼ\lfwf2SW)8;Wצ})0v8;=@-8;b Z| swNy㰫*~5}Zn^k<Dó'_]IÚ>Χ'/)DL%zʑn2É ǡ|.Ԯ:g0ȣrbN%|!hI`㗝ĝ3/m4g_e֡\wD"9Qvlcc)gdn8)˸tq;ʙƫ pkXZFMZlF9{|\͈q~~OLxCc&~C58f`JI[0f~11Bn};9xߦz8sbi ^8ld4sK+bQrMWlvq2PD|UwQ<4؈zS16*iT"__.)d۹}9MDz!ݡvUduXHQo'&BudxrnFk$ZZtLVd3\L &'!,*ńc]E2E)Dn+uh̹o9|Jj; %hX9t ̎ Tf;1/g3qxY7;Yoqlֳh~z[GZXwC8eojnvU(12vD}ɴys۟=V,._Ff3{ ;skVcyRkbMc|!6~>ihmoP;[ 4vF=.yJؤi@xv~t>Q0 ]< ϓq/L6p),O#4X}٘FvgHG &*;!̻Kbkn"MyaU\a.7 9*f-f`i~lq`ɓ1smӀ]X%?/{ô%^Dѳ$IN<;LRK OgmpcVƷstnSjSEPeafFwJŕ-O|Xv&)ϿZɬC'賊M ^s}tHtkp,@A<}݊k;9 \,avϫI!88z^Ecf˽Q|sԿHnWS[ ě7]OgDI#}c?ep{ 40sbqCVn)d(p \|8w:YMI/jFG-^OCF6Q+>X{8r)jw?ךQA`"+F*z+; jiݲT^o+GϽr[ =us0d{go8xϖo&keX$%!oh=ryj_r#:۳He7"QG:8ٟ<rs'CG8e.XzjC/潥 |}A]a 'Ĺe0約]X2=>F߭ D= #8= tV=޲[+>И'hU`M:7m"7F\j'wzb-A :ITvU&m|C-S^q@eIS 儦}azm'(HS.P~'Z. EF17ʙ05WUKQꭟfo?h.5/pfX $$vHdI MNW!- )=^ oj2m(DW ?8⃺a8${ Wi-Q{zekCj5X!-&*ޡDPfHwa䶱"^Ć mt%8(b2@:.UgmYM}EAO[K!g7C>)d:6ø=B`€fȄĔ2,/K^Xֱ9̸ߣ۽7SJR䵎l5^kf:ϫoH[RSFf o/鏸\O{b`5X.0JYSfUUlUBD C/c>iv S 'xD.P}}^}]߬UTk%+L8iQ>.W^8_N˾p̔~Lxjn)@%C$9 o:y4zL@ǔJBYinj/C423S!1P1â;N q\Kc5cH㶾m=*Kn1)y_,er:pۭkV!FV򟬦Tl tUc ?+#06NtW@(fzR\{(HGhgG:ן=ұ(Z>~7`?h)LlɮdsDQ9R;, _s:=Ơ>vFղ # F_QMr#w@:Yn;gh,DWsAwO^G vs.p#Ж~yuOOk c]4W_$#FX^jfb>υ郦4,_8p=W[6M5E,NF{; e uI\S' N$wǐY>GסzxOH sRFZ_OT{E:)l=YC5G]H[sHbjp0vz?*M/N;S?E][ˁDC*l*68+&u0mJhs4IkX.}(VBqlqF d~-ac= ZsUT=1tB%8نH[ku.ts_s7u9^^'DmchG 6nJ*i}nLCt$S60*'),7pqjj /!Y@IiALFdkV/oszCFq;a-7>ߵbM_ =[Glƒ6zA^>ͫZ7ޢgɲ kxfb3d,n+9|On 2A_R`}L,hYV/ƞ7]jw…J'tߺ׶ȑ|8 {ar<Yk'1fqw56ߎ15]uC: WKH?fowJHSw?g ĴzvVW߁$[&2.[&{CnݻDD]?o#;V|>8_^4@v'o GZup wHo Μ%};zݮbK&"gv-<-X'=6L0L_{@X!A$N?sxv"c;  i;lӆ3?NYASty?d=#oŬH]xdp}$ٹ~xݫf4P'd?ȿ32f` hnۜؗJd8ALJ|2Gf R9r2"B;)ldL5Xot_#RгI FvM8qCϑ|va02!gNWV'Ӗ\0pU2?_W_ak֙G/h.@w"lTN/m-dfzp+c%Ip{+:'{VFȤ Dӂގo~>%0jӬySjˊsH21544T8^Ks1l-?msKG W@e؝AToEFu./)/l3Pf#ؗ%^ۺu-'~"PB!9d~Y#D)K)vGʺ?>00{>loH0Y\) ǢIQll$Jd"S=}< F$$@ @id"b;G%d*} 17B#2pG&"B4% s.N A !)f)3m!,bny{ оQyw7=2]E9gQN|ݝ{5W\O-@:\'7sƹ~@˙[/wrLFh]j={\wnB+wBDD`~ʅNYNXgo{ĩvq焻K8z?h[[$&t58Zbi!ƺ0+ l?f ] ]$M`X| F{=3AtñH4`V,;FD  u >9{9kw/HwhY0 um^:|Zd809 B*)E57Yd-ߟ>CK՚!:? ٫d>GC AZ JD#P7 IfjƢtuTؑmVi_oB.>ɴq /}G@59>O"$ɋI IS4O5R?-;Zm&i~ɍ/,^.ƊXW>}}k9Xl dF!gAp@Hc򉩖JgmzF2KæyyFSjՌ8Ne  (>Ucܪ& ?p_ҏ'&HX@h`f V*!qͷ' C|80J7E,ͪ'͜#*V+ȫ*5/}_++FT%dBuՖĿ;q,ڂP@4k*\i"iɜ'j%)lg_?7H7rVuB=v*%W 97Щ ';orKOgZrҽg^W{ؚvc~=c(c5jtkߗ+|_ܶNM]|N(M'",Ŝt쯞Noeq|mLh=պRX.34nvAWkhwk>t60w{\FBGQz6 מzvt8ޚ=Q~=Wkmn8 @k]SSfj!3OC+H%fgAs_ #K=/Z͊kUslϧ @xPdՊB}`:150::匾]D wAD|>0 !MzUѻ[<՗1-nAAGRjhSV~@yWʺ$A[b<ϝ&[Ԟ+c~!aQds9dIsu(Z}"vc#J}1`\ i[&҉֢8ULY ~ (K#ʢ_u;/N[)O#<'g<N9서HM ?B@+ß5vpꓯx|V%MqE/[*X!Y ᄞ^k V9VY5 ]C /*2R68M*o #$) GmN,L1d#M6rQ.sy)֕`~;F w?QNDG F4:pAnrAad kh>rH^9U%gdsh{tb 8b\́ƐCS@I>tnF02[c^ϯ1\:5pYYiէ瓠>; shF2Lm<<'db$j'߃eAEdbaDf&%o2{-X6(0/o/L学6l H4k A MjtWpB<.DCZc C^S+7h0Cz)рtA{Ưt}NtPcN'V_^rX!b 6"8P-W,O~|5.M )LLJ # Ⴎ-rK+KⴡB'i9.w\o\툴qVd~ u@/ i~Yԑ #`kgm8.kӜ&[CP 44Ggw{8z|~p-RUU.G-6Y^˟/D\NoLL<9y;9~՞k|PBz]K_g.~ب4Pߗf^`2«&1>^aB+Q_#TLc!1Hl#Cpܰ% ȴCւDhKġDH\V",KzS^HYy͵#y(J 7Ni=dnoՉ p5}Xv&D3wQhyc0 ;sխ=G|~Hhn0|ƨ؎ˬ{Jf`N%UPR7~f#fU)7*Rxdp/לZ렜d6!\,Y^w}F3[P{I24d6a9z7HȼlM(uT4#ڢx=|Ӟ<㯗o)=MgCSMxvHP-VMꁾ.8e7F:@/C[+7m|&F1\E$2W꜌S嵁gIŠzBg 2jb1Cu'pOM__}"f N*0[!sm}|# <8|GΖhBdyQab dcL $EPϕCx jijBt<)(E9z?IbnuI [ d*tNE+hs9Sಮ|/1S~ϠH&-ltoVa ՠ9"LYG9ӏ_403SMwysGF|FzuAP!ͫ# '%Z2ɱ05Du+ OR?.FgC3tW`:gf\iFjj9 ]b!w4wwA'S IE<.e]19 Jhz!N!lLnSXm 2iƯeSr,0/uRq@ 9NCؔwj$}0]<# 9!@S2|b{ꠅ>HC|sq/{aT^$ppdϱ0NItNK];*kc9\mzz>ʚ/Ԟ(z ?ѿְ!ŝzV}NnNm2 |˷r^JJ'f93 [(uzO, H)c04=jci"FKCqs2W2kh ɑR:ֹ7CE]G Nzdӝ}^CesKNI9-7hrEy+Mf׾wN(>2sɶflbqT۶GAN΀9I$Cx2SeJ'ex)bi% Gp|yV=g~#쟽Rtrzsh@ac'Ug/G@ďBW_BFh/:zqӴH,JO{Ls]7Ytq33"X_[f:s^1iP "e7G&u+WE\Y<3+p'n n!L_%3ݦLC#'nT&Qm=iζ;[dp뱕FhZYXe3rH5`" -Q+54zKG]VUDJ9*vngh]7%-s7ze։ѕj^ 2^[0bZAq1}4R:L>1}39:ҩ#֟A֘8PO\ {Uޱ4@9[:YAhU7Uj,:nM$'F e߮=:_J7r\m xdCh5gzzưvH\.TNXS+7j7:T˳eۮ=m& |u1(\^Izcׇ2zR+qX㶍ej<\ 4wAvH͖7 A1M䁊i:~XDQwE8=懓ѾDdj1m2&q2#K@f< `,8ky}4ޞ-r{hoS+35;L(/WY^+~Nxwǫg\cP|=&-^|(W>^U?"s14|{{YvncKgu]\48l_Q$E@7naqm".SoVgI˒n&8;Msi;݋vuHL`37##3Eq^FM? YwZ IՇ3poٯey<烺GUWhʶp8ݭ UY@ ,vm#;"ߝ}50m4e!9]3ѓ v\/MO& F%DӀgm""=Km/GeRɣi t_ܐ0OЩk.hijOqf|E]GP>J\_ E3x޽t|^RNП8 @xCD lJA5 &N0DafE뮞6fcUon ` 2Ч 0hN+rhM76XY rOm2ݮ2<[5gVYHɤnb.Lu *䓩gC^.r rܯ KAN9 Nf3qqœ-hU" !|(vI"J14w>*ߴ td5 -x{!-[WxZP .$a #ZJo;-BVquQ$ oz ~}ѹ|Lmw]rIVY+-r[DU хf'"QɊsO׈8%n"W^njLy9w7dqf{%2S+a+vPl vu!bIf:qCV^3YzIJJmʝ@H/lUw8ae/B_ H?:[ cu&#:IvqcSYzq*Q"~sڏ\ĂLH6QM_!D4I$F$"Qi$8i4{R@ASd7?>>g_ӸQ}Bڿkr;Yӈ)?>1j;;BH=}L1ܞ% @ x]x}+ g C,:|A$֤;\e9k4T.~wgn~ȏ:2eBmUP<$M5,+ۨh1#%V;lݒ$-M"չ1AӪzb\ZI ]>aWF׵>3'S* =(ɐ;q$}@bu̮-L{Mʹ,:ZXuahdarmPk^ =QF3PHJKq4@ HHF 4_FەE Qfjc`F}U`cdXHF`3+_: Z9Vgu-s,j~:l½t:4MloBkA 3;m6?eչ""؝a e((vp @6n D/tPbv"삏`x"5@Mʀ[h"U=j#RGų4TAnT05H$hvEטu|e5U̎bG=n߱Bp6Y1_5pLf4-#c&AǗWhf6fKM hѢ~L{p d " )`" " 'ia#- [>3Jr(f Y"#i&n%|X؋d'YgJm,hp1xVVD%%]{\b@ NlbU3RV\n!7,LXkŽ)]G<; ֆ\"ۘcPIXT'Pii ZR .w4$>$BXu[-UHLe *U)JJVDF()$@޹藳0L1 113ef *DD.0"Z(1Ȩ""(Iulbؚt*"Ta8Y c~Ga,z3uJVj"pE:Z@!p 5zRƵ`(Sٛ0 *LP.=SrXjr!<}sᨉC0T޷i-߂ġ.]]A&`瞣ϣ2VX.fo 8tգfU}`I}т'Ҳ ̱; %:`0YEB|n`D%˕4Ft*!yOWchGV5ۢ`ceV)ŒfAA}?r0#!8o/Y8d"FB~i{B:U"qz Ϗ&fSb)?_H0|mUC4HόK3Y}5aF8D2fG~/,Hp.wFu8KGԥTDdVNMkB/&`p/1Y!MuJ}{ gލpⓣ<̑0J߷?OxR1~76#-L9W;([ pO(w؁L2DŽm:+\V%n"-1;1-Xh#9f`cc 辆Sܺt0sq_'!ldh B :}jA9ϤBkrC2P8&Fj,{<ϖ *dh6PhQx3T#o,rMfQC@%qG\D M9&0?F*Ls=C9*ZV 䜐?A?hz ׼p50K MWe3* QE7r87ިl mF]+|ϱ28z`1;4JS]=v+\z6iYhD`5T3GZbD%$p.7Oͮ"H5QU fHb,c9-nce1'')H_[~Ⱥ2imӋ\$5f]fDX^ %M8GD],(lh sx"S vP]&Ϊo7쪝2]8cD="yw$/'#?;5CC樇&(Ly6Cc/EΟ^9/[jtn@tK+."7i'wBt %T"~gv^晅!Iπ164&Y# :N bOzQ|>~40Ϗ^~e|WXQ0^ud5r|/vBa/H7Uj $ k+(q?8*c~7!Aş]hV;*<))"s V}%k1gk90?V$H1<7hD4ޑs5 0GoQ['juNX Welm @rqA뉎C<&9P֏0A۩m63}mbC–Ӳ0WiMݚ@c!#jb*OC WE4aAZz_GL~PhD52"2&o;?z6 744ƭs片FF&<~G7I2cif bx ^uWek؃#~n&DjDK!hM `H }n'Q^̰ʕ=oG_Zοtzk慂ZgS=˳w((Ilt;0ό[/lx/Ll+Ã%7@P$88il,{9 3}[ ĺV(r829٪Dσ" ɞz[_}9%&b-c& D Esٯѿ8]pŴ$44i6Q ͘3JpW{6H9ٲ=LgEl Y,6TxN8YX51 jNa!w3A;tNZ*y+hsOg?1}6QNöA1\DEoqpJ^$)cHil1Ooz=cMޚ=ji=Pzܜ˄y)ٺ DH)KX=\AdA08* PVukXɖB C8Pě_g*`X!B>D9_+9Erih63("T1ac:R?(ץa%Aв3GadEJ`R.H&GY>% GvD" )A9 %f S8./VRO8Ꝙ"+("ƒ+6Dks/) [c2W* ztsx7a~XY[ʩI۬1!bl@}8B pNH q)%_::غmsU<Q\f(HrsEݍ-4ɒY =jgMGQqbLFďk*~${ˎÀ0PVf|_`)Cjp$laBGK) qy ~-5?03x֊0%Xb$iRaA;0V2#^p`^Ϡz/'8P*Bwt{ֲ$!ه&Tu33r u1" 9 #}<./K;" ĝ@p emmTvm5zA~|BE S߶<X T )_l#"D/5O۩>_)\"Se}$BEyHiA ClWXq#ğ9AҞuHR{*~uzў'HIL0I\[}͢I' Œ̯O߄-j1EMѧ:\>?l(TE0_62ƹRz)